一、概述
「賬號(hào)」指的就是App的登錄賬號(hào),如手機(jī)號(hào)碼。你可以能會(huì)認(rèn)為,賬號(hào)不就一個(gè)手機(jī)號(hào)碼,頂多加一個(gè)UserInfo
用戶信息,這個(gè)有啥好講的呢?確實(shí),市面上大部分App確實(shí)如此,也能夠滿足業(yè)務(wù)需求了。
不過(guò),實(shí)際中存在這樣場(chǎng)景下:
- 一個(gè)用戶的「賬號(hào)」下面存在「子賬號(hào)」;
- 用戶基礎(chǔ)數(shù)據(jù)多,含有多個(gè)用戶數(shù)據(jù)類;
- 用戶相關(guān)數(shù)據(jù),多個(gè)接口返回;
- 服務(wù)器重構(gòu),接口迭代,返回?cái)?shù)據(jù)字段變更;
- 一個(gè)App往往,是允許多個(gè)用戶登錄,有些App也希望緩存多個(gè)賬號(hào)信息,等等。
這些場(chǎng)景下,不進(jìn)行賬號(hào)的管理治理,那么后續(xù)訪問(wèn)用戶基礎(chǔ)數(shù)據(jù),更新用戶基礎(chǔ)數(shù)據(jù),將會(huì)越發(fā)吃力,也是很容易出錯(cuò)的。
二、移動(dòng)端賬號(hào)需要考慮的問(wèn)題
賬號(hào)數(shù)據(jù)緩存和持久化
大部分的用戶數(shù)據(jù)直接簡(jiǎn)單本地緩存和內(nèi)存緩存即,但也存在數(shù)據(jù)流多訪問(wèn)頻率極低的,需要查詢的可以考慮持久化到數(shù)據(jù)庫(kù)中,例如IM用戶關(guān)系、通訊錄等。賬號(hào)數(shù)據(jù)安全性問(wèn)題
核心數(shù)據(jù)盡可能不存放本地,例如銀行卡號(hào),密碼等等。確有需求,則需要考慮安全加密機(jī)制,避免被破解泄露信息。賬號(hào)數(shù)據(jù)訪問(wèn)接口設(shè)計(jì)
賬號(hào)數(shù)據(jù)是整個(gè)App最基礎(chǔ)的數(shù)據(jù),它的訪問(wèn)頻率無(wú)疑是最高,網(wǎng)絡(luò)請(qǐng)求、key值、數(shù)據(jù)庫(kù)字段等都需要它。因此,一套方便快捷的訪問(wèn)接口,無(wú)疑會(huì)讓業(yè)務(wù)方調(diào)用更加舒心,無(wú)形也提高開(kāi)發(fā)效率。移動(dòng)端賬號(hào)數(shù)據(jù)訪問(wèn)特點(diǎn)
多讀少些是移動(dòng)端賬號(hào)數(shù)據(jù)的訪問(wèn)特點(diǎn),往往是一次更新后續(xù)直接訪問(wèn)。對(duì)于數(shù)據(jù)同步方案,可以考慮加入讀寫(xiě)鎖進(jìn)行保護(hù)。賬號(hào)數(shù)據(jù)與服務(wù)器解耦
服務(wù)器往往因?yàn)橹貥?gòu)、優(yōu)化等導(dǎo)致接口數(shù)據(jù)字段變更,如果一開(kāi)始直接使用接口數(shù)據(jù)Model的話,整個(gè)App所有相關(guān)都要進(jìn)行修改,如果是跨App或者跨項(xiàng)目,更是無(wú)可接受的。
因此,有必要設(shè)計(jì)內(nèi)部賬號(hào)Model,與外部隔離開(kāi)。
三、設(shè)計(jì)方案
3.1、賬號(hào)模塊架構(gòu)設(shè)計(jì)圖
可以大致分為以下幾個(gè)部分:
BussinessLogic,專門負(fù)責(zé)賬號(hào)業(yè)務(wù)邏輯處理,例如登錄、退出、修改密碼等,服務(wù)接口請(qǐng)求等。
同時(shí)負(fù)責(zé)將服務(wù)器接口數(shù)據(jù)ResponseData 轉(zhuǎn)化為 賬號(hào)模塊需要的數(shù)據(jù)model。AccessInterface,針對(duì)高頻賬號(hào)數(shù)據(jù)提供的訪問(wèn)接口。
AccountCenter,賬號(hào)數(shù)據(jù)管理核心類,
往往被設(shè)計(jì)成單例類,有此僅有一份,很符合單例特性。
負(fù)責(zé)賬號(hào)數(shù)據(jù)組織,處理緩存邏輯、安全性邏輯。
負(fù)責(zé)多賬號(hào)、多子賬號(hào)管理
切換賬號(hào)失敗數(shù)據(jù)回滾。Storage,負(fù)責(zé)賬號(hào)數(shù)據(jù)的存儲(chǔ)
Security,負(fù)責(zé)安全加密算法相關(guān)。
3.2、賬號(hào)的數(shù)據(jù)設(shè)計(jì)
賬號(hào)使用獨(dú)立的數(shù)據(jù)模型
將服務(wù)器接口返回的數(shù)據(jù)模型 轉(zhuǎn)為 獨(dú)立設(shè)計(jì)的賬號(hào)數(shù)據(jù)模型。這樣在服務(wù)器接口移動(dòng)的時(shí)候,本地可以保持不變,業(yè)務(wù)層接口可以保持不變。賬號(hào)的數(shù)據(jù)模型
所有的屬性都為只讀,避免外部輕易修改;只能通過(guò)方法接口修改更新。
@protocol AccountModelProtocol <NSObject>
- (void)updateModelWithData:(id)data;
@end
// userInfo
@interface UserInfo : NSObject <AccountModelProtocol>
@property (readonly) NSString *userId;
@property (readonly) NSString *userName;
@end
@interface UserInfo ()
@property (nonatomic, copy) NSString *userId;
@property (nonatomic, copy) NSString *userName;
@end
@implementation UserInfo
- (void)updateModelWithData:(id)data {
}
@end
- 賬號(hào)的相關(guān)數(shù)據(jù)進(jìn)行分類,大致可分為以下:
銀行賬號(hào)、身份證等敏感信息
基礎(chǔ)用戶信息:手機(jī)號(hào)碼、用戶名、性別、生日、區(qū)域等
第三方平臺(tái)賬號(hào)信息,例如IM、七牛云、阿里云等賬號(hào)
賬號(hào)動(dòng)態(tài)變化信息,如登錄sessionId、AccessToken信息等。
教育App,用戶學(xué)校信息、用戶班級(jí)信息、家長(zhǎng)孩子信息。
用戶等級(jí)信息、Vip信息等
@interface UserInfo : NSObject <AccountModelProtocol>
@end
@interface UserLevelInfo : NSObject <AccountModelProtocol>
@end
@interface SchoolInfo : NSObject <AccountModelProtocol>
@end
- 針對(duì)常用的數(shù)據(jù),專門提供專門易用接口,方便上層使用。
同時(shí), 對(duì)于提供接口,保證數(shù)據(jù)可用性,為空不返回nil,而是空字符。保證上層不需要判空直接使用,不會(huì)導(dǎo)致crash。
// 通過(guò)類方法簡(jiǎn)化
@protocol UserInfoAccessProtocol <NSObject>
+ (NSString *)userId;
@end
@protocol UserLevelAccessProtocol <NSObject>
+ (NSString *)userLevelName;
@end
// 易用接口訪問(wèn)層
@interface AccountCenter (Access) <UserInfoAccessProtocol, UserLevelAccessProtocol>
@end
@implementation AccountCenter (Access)
+ (NSString *)userId {
return accountSingleton.userInfo.UserId ? : @"";
}
+ (NSString *)userLevelName {
return accountSingleton.userLevelInfo.levelName ? : @"";
}
@end
數(shù)據(jù)完整性校驗(yàn)
針對(duì)保存進(jìn)來(lái)的數(shù)據(jù),需要進(jìn)行完整性校驗(yàn),保證數(shù)據(jù)的可用性。例如用戶數(shù)據(jù),userid、phone必須不為空;第三方賬號(hào)account、appid必須不為空。賬號(hào)訪問(wèn)接口建議提供同步接口
對(duì)于賬號(hào)數(shù)據(jù)訪問(wèn),都是要求快速且同步的;如果設(shè)計(jì)成異步,往往給業(yè)務(wù)調(diào)用者造成不必要麻煩。遇見(jiàn)過(guò)將其設(shè)計(jì)成異步,真的是無(wú)盡的深淵。根據(jù)賬號(hào)訪問(wèn)特性,設(shè)計(jì)讀寫(xiě)鎖進(jìn)行多線程同步。
可根據(jù)實(shí)際需要提供深拷貝的接口