一朝群、概述
「賬號」指的就是App的登錄賬號燕耿,如手機號碼。你可以能會認為姜胖,賬號不就一個手機號碼誉帅,頂多加一個UserInfo
用戶信息,這個有啥好講的呢右莱?確實蚜锨,市面上大部分App確實如此,也能夠滿足業(yè)務需求了慢蜓。
不過亚再,實際中存在這樣場景下:
- 一個用戶的「賬號」下面存在「子賬號」;
- 用戶基礎數(shù)據(jù)多晨抡,含有多個用戶數(shù)據(jù)類氛悬;
- 用戶相關(guān)數(shù)據(jù),多個接口返回凄诞;
- 服務器重構(gòu)圆雁,接口迭代,返回數(shù)據(jù)字段變更帆谍;
- 一個App往往伪朽,是允許多個用戶登錄,有些App也希望緩存多個賬號信息汛蝙,等等烈涮。
這些場景下,不進行賬號的管理治理窖剑,那么后續(xù)訪問用戶基礎數(shù)據(jù)坚洽,更新用戶基礎數(shù)據(jù),將會越發(fā)吃力西土,也是很容易出錯的讶舰。
二、移動端賬號需要考慮的問題
賬號數(shù)據(jù)緩存和持久化
大部分的用戶數(shù)據(jù)直接簡單本地緩存和內(nèi)存緩存即需了,但也存在數(shù)據(jù)流多訪問頻率極低的跳昼,需要查詢的可以考慮持久化到數(shù)據(jù)庫中,例如IM用戶關(guān)系肋乍、通訊錄等鹅颊。賬號數(shù)據(jù)安全性問題
核心數(shù)據(jù)盡可能不存放本地,例如銀行卡號墓造,密碼等等堪伍。確有需求锚烦,則需要考慮安全加密機制,避免被破解泄露信息帝雇。賬號數(shù)據(jù)訪問接口設計
賬號數(shù)據(jù)是整個App最基礎的數(shù)據(jù)涮俄,它的訪問頻率無疑是最高,網(wǎng)絡請求摊求、key值禽拔、數(shù)據(jù)庫字段等都需要它刘离。因此室叉,一套方便快捷的訪問接口,無疑會讓業(yè)務方調(diào)用更加舒心硫惕,無形也提高開發(fā)效率茧痕。移動端賬號數(shù)據(jù)訪問特點
多讀少些是移動端賬號數(shù)據(jù)的訪問特點,往往是一次更新后續(xù)直接訪問恼除。對于數(shù)據(jù)同步方案踪旷,可以考慮加入讀寫鎖進行保護。賬號數(shù)據(jù)與服務器解耦
服務器往往因為重構(gòu)豁辉、優(yōu)化等導致接口數(shù)據(jù)字段變更令野,如果一開始直接使用接口數(shù)據(jù)Model的話,整個App所有相關(guān)都要進行修改徽级,如果是跨App或者跨項目气破,更是無可接受的。
因此餐抢,有必要設計內(nèi)部賬號Model现使,與外部隔離開。
三旷痕、設計方案
3.1碳锈、賬號模塊架構(gòu)設計圖
可以大致分為以下幾個部分:
BussinessLogic,專門負責賬號業(yè)務邏輯處理欺抗,例如登錄售碳、退出、修改密碼等绞呈,服務接口請求等贸人。
同時負責將服務器接口數(shù)據(jù)ResponseData 轉(zhuǎn)化為 賬號模塊需要的數(shù)據(jù)model。AccessInterface报强,針對高頻賬號數(shù)據(jù)提供的訪問接口灸姊。
AccountCenter,賬號數(shù)據(jù)管理核心類秉溉,
往往被設計成單例類力惯,有此僅有一份碗誉,很符合單例特性。
負責賬號數(shù)據(jù)組織父晶,處理緩存邏輯哮缺、安全性邏輯。
負責多賬號甲喝、多子賬號管理
切換賬號失敗數(shù)據(jù)回滾尝苇。Storage,負責賬號數(shù)據(jù)的存儲
Security埠胖,負責安全加密算法相關(guān)糠溜。
3.2、賬號的數(shù)據(jù)設計
賬號使用獨立的數(shù)據(jù)模型
將服務器接口返回的數(shù)據(jù)模型 轉(zhuǎn)為 獨立設計的賬號數(shù)據(jù)模型直撤。這樣在服務器接口移動的時候非竿,本地可以保持不變,業(yè)務層接口可以保持不變谋竖。賬號的數(shù)據(jù)模型
所有的屬性都為只讀红柱,避免外部輕易修改;只能通過方法接口修改更新蓖乘。
@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
- 賬號的相關(guān)數(shù)據(jù)進行分類锤悄,大致可分為以下:
銀行賬號、身份證等敏感信息
基礎用戶信息:手機號碼嘉抒、用戶名零聚、性別、生日众眨、區(qū)域等
第三方平臺賬號信息握牧,例如IM、七牛云娩梨、阿里云等賬號
賬號動態(tài)變化信息沿腰,如登錄sessionId、AccessToken信息等狈定。
教育App颂龙,用戶學校信息、用戶班級信息纽什、家長孩子信息措嵌。
用戶等級信息、Vip信息等
@interface UserInfo : NSObject <AccountModelProtocol>
@end
@interface UserLevelInfo : NSObject <AccountModelProtocol>
@end
@interface SchoolInfo : NSObject <AccountModelProtocol>
@end
- 針對常用的數(shù)據(jù)芦缰,專門提供專門易用接口企巢,方便上層使用。
同時让蕾, 對于提供接口浪规,保證數(shù)據(jù)可用性或听,為空不返回nil,而是空字符笋婿。保證上層不需要判空直接使用誉裆,不會導致crash。
// 通過類方法簡化
@protocol UserInfoAccessProtocol <NSObject>
+ (NSString *)userId;
@end
@protocol UserLevelAccessProtocol <NSObject>
+ (NSString *)userLevelName;
@end
// 易用接口訪問層
@interface AccountCenter (Access) <UserInfoAccessProtocol, UserLevelAccessProtocol>
@end
@implementation AccountCenter (Access)
+ (NSString *)userId {
return accountSingleton.userInfo.UserId ? : @"";
}
+ (NSString *)userLevelName {
return accountSingleton.userLevelInfo.levelName ? : @"";
}
@end
數(shù)據(jù)完整性校驗
針對保存進來的數(shù)據(jù)缸濒,需要進行完整性校驗足丢,保證數(shù)據(jù)的可用性。例如用戶數(shù)據(jù)庇配,userid斩跌、phone必須不為空;第三方賬號account讨永、appid必須不為空滔驶。賬號訪問接口建議提供同步接口
對于賬號數(shù)據(jù)訪問,都是要求快速且同步的卿闹;如果設計成異步,往往給業(yè)務調(diào)用者造成不必要麻煩萝快。遇見過將其設計成異步锻霎,真的是無盡的深淵。根據(jù)賬號訪問特性揪漩,設計讀寫鎖進行多線程同步旋恼。
可根據(jù)實際需要提供深拷貝的接口