iOS 用戶登陸信息存儲(轉)

天狐博客衍腥,原文地址

一.單例模式翔冀,登陸后把用戶數(shù)據(jù)存儲在單例對象我通常是存在AppDelegate,存在這里的好處是,用戶數(shù)據(jù)的生命周期與app運行周期相同,如果app關閉或者閃退,下次開啟app就是未登陸狀態(tài),以下是部分關鍵代碼

AppDelegate.h文件

#import "User.h"

?@interface AppDelegate : UIResponder@property (strong, nonatomic) User *user;

+(AppDelegate*)APP;

@end

//AppDelegate.m文件 這里只是增加了個方便的類方法而

@implementation AppDelegate

+(AppDelegate*)APP {

return (AppDelegate*)[[UIApplication sharedApplication] delegate];

}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

User 實體

#import "BaseModel.h"

@interface

User : BaseModel

@property(strong,nonatomic)NSString*userID;

@property(strong,nonatomic)NSString*userName;

@property(strong,nonatomic)NSString*passdword;

@property(strong,nonatomic)NSString*cellPhone;

+(NSURLSessionDataTask*)login:(NSDictionary*)paramDic

Success:(void(^)(NSDictionary*result))success

Failure:(void(^)(NSError*error))failue;

@end

在RootViewController(一般都是app的第一個界面即可)中判斷是否存在user對象,如果存在即登陸,可以獲取user實體中的各種信息,如果不存在即未登陸,彈出登錄框,登陸后賦值user對象

- (void)viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];

if (![AppDelegate APP].user) {

? ?LoginViewController *login = [[LoginViewController alloc]init];

? ?[self presentViewController:login animated:YES completion:nil];

? }

}

登陸界面,登陸成功賦值user對象

-(IBAction)loginTouched:(id)sender {

//網絡請求...

[User login:@{@"password":self.password.text,

@"cellphone":self.username.text}

Success:^(NSDictionary*result) {

[AppDelegateAPP].user=[[Useralloc]init];

[AppDelegateAPP].user.cellphone=self.username.text;

[AppDelegateAPP].user.password=self.password.text;

//如果登陸后反回的result是需要存的數(shù)據(jù),確保User model中有對應的結構,之后利用JsonModel(https://github.com/icanzilb/JSONModel)等框架直接進行轉換

比如? [AppDelegateAPP].user=[[Useralloc]

initWithDictionary:result

error:nil];

}

Failure:^(NSError*error){

}];

}

這樣就可以在任意類中[AppDelegate APP].user.cellphone 取類似數(shù)據(jù)了

二. NSUserDefaults .數(shù)據(jù)存儲后可以關閉app后依然存在,只有卸載App 或者手動刪除, 數(shù)據(jù)才會消失

(注:NSUserDefaults存儲的數(shù)據(jù)其實就是存儲在了一個.plist文件中,任何人把設備連接電腦后都可以找到對應文件看見存儲的原文內容,除非你存的時候加了密,所以NSUserDefaults之用來存儲不是很重要的數(shù)據(jù),比如用戶名等)

接著第一種方法登陸的過程,如果我想登陸一次后記錄用戶的用戶名,并且其他數(shù)據(jù)還是隨著app生命周期,那么只需寫入NSUserDefaults即可,記得不要忘了[userDefaults synchronize]

- (IBAction)loginTouched:(id)sender {

//網絡請求...

[User login:@{@"password":self.password.text,

@"cellphone":self.username.text} Success:^(NSDictionary *result) {

[AppDelegate APP].user = [[User alloc]init];

[AppDelegate APP].user.cellphone = self.username.text;

[AppDelegate APP].user.password = self.password.text;

//如果登陸后反回的result是需要存的數(shù)據(jù),確保User model中有對應的結構,之后利用JsonModel(https://github.com/icanzilb/JSONModel)等框架直接進行轉換

比如? [AppDelegate APP].user = [[User alloc] initWithDictionary:result error:nil];

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

[userDefaults setObject:self.username.text forKey:@"KEY_USER_NAME"];

[userDefaults synchronize];

} Failure:^(NSError *error) {

}];

}

關閉app后,從新進入app,想讀取這個數(shù)據(jù)只需要任意類中,即可獲得存下的數(shù)據(jù)

NSUserDefaults*userDefaults=[NSUserDefaultsstandardUserDefaults];

NSString*username=[userDefaults

objectForKey:@"KEY_USER_NAME"];

三.鑰匙串听系,數(shù)據(jù)可以刪除app后依然存在,鑰匙串由操作系統(tǒng)保護并且存儲后的數(shù)據(jù)是比較安全的,長用來存儲一些密碼,私鑰

如果想存儲用戶的密碼,當然可以存在NSUserDefaults中,但是直接存到 plist 里顯然是不負責任的

用ios的 Security.framework 就可以實現(xiàn)鑰匙串的訪問弛饭、讀寫

這里我借助第三方開源庫SSKeychain(https://github.com/soffes/sskeychain)與NSUserDefaults配合使用進行示例,如果想用原生方法自行學習

以下是User實體新增的三個類方法 用于操作信息

//清除數(shù)據(jù)

+ (void)logoutAccount{

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSString *username = [userDefaults objectForKey:@"KEY_USER_NAME"];

[SSKeychain deletePasswordForService:@"KEY_KEYCHAIN_SERVICE" account:username];

[userDefaults removeObjectForKey:@"KEY_USER_NAME"];

[userDefaults synchronize];

}

//獲取? 任意位置調用

+ (void)getAccount:(void (^)(NSString *username,NSString *password))block{

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSString *username = [userDefaults objectForKey:@"KEY_USER_NAME"];

NSString *password = [SSKeychain passwordForService:@"KEY_KEYCHAIN_SERVICE" account:username];

block(username?:@"",password?:@"");

}

//保存方法 登陸成功后調用

+ (void)saveAccount:(NSString *)name andPassword:(NSString *)password {

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

[userDefaults setObject:name forKey:@"KEY_USER_NAME"];

[userDefaults synchronize];

[SSKeychain setPassword:password forService:@"KEY_KEYCHAIN_SERVICE" account:name];

}

還是登陸的例子

Objective-C

-(IBAction)loginTouched:(id)sender{

//網絡請求...

[User

login:@{@"password":self.password.text,

@"cellphone":self.username.text}

Success:^(NSDictionary*result){

[User

saveAccount:self.username.text

andPassword:self.password.text];

}

Failure:^(NSError*error){

}];

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末雷逆,一起剝皮案震驚了整個濱河市壤追,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌示弓,老刑警劉巖讳侨,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奏属,居然都是意外死亡跨跨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門囱皿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勇婴,“玉大人,你說我怎么就攤上這事嘱腥「剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵齿兔,是天一觀的道長橱脸。 經常有香客問我,道長分苇,這世上最難降的妖魔是什么添诉? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮组砚,結果婚禮上吻商,老公的妹妹穿的比我還像新娘。我一直安慰自己糟红,他們只是感情好艾帐,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布乌叶。 她就那樣靜靜地躺著,像睡著了一般柒爸。 火紅的嫁衣襯著肌膚如雪准浴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天捎稚,我揣著相機與錄音乐横,去河邊找鬼。 笑死今野,一個胖子當著我的面吹牛葡公,可吹牛的內容都是我干的。 我是一名探鬼主播条霜,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼催什,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宰睡?” 一聲冷哼從身側響起蒲凶,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拆内,沒想到半個月后旋圆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡麸恍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年灵巧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹沪。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡孩等,死狀恐怖,靈堂內的尸體忽然破棺而出采够,到底是詐尸還是另有隱情,我是刑警寧澤冰垄,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布蹬癌,位于F島的核電站,受9級特大地震影響虹茶,放射性物質發(fā)生泄漏逝薪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一蝴罪、第九天 我趴在偏房一處隱蔽的房頂上張望董济。 院中可真熱鬧,春花似錦要门、人聲如沸虏肾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽封豪。三九已至谴轮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吹埠,已是汗流浹背第步。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缘琅,地道東北人粘都。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像刷袍,于是被迫代替她去往敵國和親翩隧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內容

  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內容...
    i得深刻方得S閱讀 4,675評論 1 9
  • 本文中所有代碼演示均有GitHub源碼做个,點擊下載 普通加密方法是講密碼進行加密后保存到用戶偏好設置中 鑰匙串是以明...
    si1ence閱讀 39,933評論 20 197
  • 普通加密方法是講密碼進行加密后保存到用戶偏好設置中 鑰匙串是以明文形式保存居暖,但是不知道存放的具體位置 一. bas...
    Bo_cake閱讀 566評論 0 2
  • 普通加密方法是講密碼進行加密后保存到用戶偏好設置中 鑰匙串是以明文形式保存顽频,但是不知道存放的具體位置 一. bas...
    奮斗ing0310閱讀 823評論 0 1
  • 日本的道德準則極端要求回報義務和自我約束,似乎堅決要把私欲譴責為罪惡并要求從內心根除太闺。古典佛教的教義就是這樣糯景。但日...
    酒旗斜閱讀 230評論 0 1