上一篇博客中提到了用CoreData來(lái)進(jìn)行數(shù)據(jù)的持久化,CoreData的配置和使用步驟還是挺復(fù)雜的。但熟悉CoreData的使用流程后,CoreData還是蠻好用的。今天要說(shuō)的是如何記錄我們用戶的登陸狀態(tài)。例如微信,QQ等,在用戶登陸后,關(guān)閉應(yīng)用在打開(kāi)就直接登陸了。那么我們?cè)贏pp開(kāi)發(fā)中如何記錄用戶的登陸狀態(tài)呢?之前在用PHP或者Java寫(xiě)B(tài)/S結(jié)構(gòu)的東西的時(shí)候,我們用Session來(lái)存儲(chǔ)用戶的登陸信息,Session是存在服務(wù)器上僅在一次回話中有效,如果要記錄用戶的登陸狀態(tài),那么會(huì)用到一個(gè)叫Cookie的東西。Cookie和Session不同,Cookie是存在用戶本地的一個(gè)文件,Cookie中存的就是用戶的登陸信息,當(dāng)用戶在此登陸時(shí),自動(dòng)從Cookie中讀取用戶的登陸信息。
不扯Web的啦,在我們App開(kāi)發(fā)中同樣也遇到這要的問(wèn)題,如何記錄用戶的登陸狀態(tài)呢? 用我們的CoreData蠻? CoreData適合處理大量的數(shù)據(jù),一般和TableView來(lái)結(jié)合起來(lái)使用,當(dāng)然我們可以用CoreData來(lái)存儲(chǔ)用戶的登陸信息,但這不免有點(diǎn)大材小用,而且用起來(lái)也是比較復(fù)雜的。那么我們有其他更便捷的方法嗎?蘋(píng)果這么注重用戶體驗(yàn),當(dāng)然有其他的方法了,就是NSUserDefault. NSUserDefault設(shè)置完值以后要進(jìn)行同步
NSUserDefault是蘋(píng)果提供給我們用來(lái)存儲(chǔ)用戶的登陸信息的一個(gè)類(lèi),當(dāng)然是持久化的了,廢話不多說(shuō)了。我們就模擬一個(gè)用戶登陸和注銷(xiāo)的demo來(lái)學(xué)習(xí)一下如何使用NSUserDefault來(lái)存儲(chǔ)用戶的登陸信息。
1.首先我們得有一個(gè)登陸頁(yè)面對(duì)應(yīng)的類(lèi)為ViewController.h, 在登陸頁(yè)面有兩個(gè)TextField和一個(gè)Button用來(lái)接受用戶的輸入,在點(diǎn)擊Button中的回調(diào)的方法中,如果用戶登陸成功,則把用戶信息存入U(xiǎn)serDefault中,然后以模態(tài)的方式來(lái)跳轉(zhuǎn)到主界面,首先我們要獲取UserDefault的單例,登陸頁(yè)面中的登陸按鈕回調(diào)的方法代碼如下:
- (IBAction)tapLogin:(id)sender { //獲取用戶輸入的信息 NSString *username = self.usernameTextField.text; NSString *password = self.passwordTextField.text; //對(duì)用戶信息的驗(yàn)證 if ([username isEqualToString:password]){ //獲取userDefault單例 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; //登陸成功后把用戶名和密碼存儲(chǔ)到UserDefault [userDefaults setObject:username forKey:@"name"]; [userDefaults setObject:password forKey:@"password"]; [userDefaults synchronize]; //用模態(tài)跳轉(zhuǎn)到主界面 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; id mainViewController = [storyboard instantiateViewControllerWithIdentifier:@"MainView"]; [self presentViewController:mainViewController animated:YES completion:^{ }]; } }
2.處理完登陸頁(yè)面,我們會(huì)處理根據(jù)UserDefault中的name屬性是否有值來(lái)選擇加載哪個(gè)頁(yè)面。在storybaord中我們默認(rèn)的是主界面,在AppDelegate.m中如果未登陸,我們會(huì)設(shè)置一下rootViewController,代碼如下
//判斷是否登陸,由登陸狀態(tài)判斷啟動(dòng)頁(yè)面 //獲取UserDefault NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSString *name = [userDefault objectForKey:@"name"]; //獲取storyboard UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; //如果用戶未登陸則把根視圖控制器改變成登陸視圖控制器 if (name == nil) { NSLog(@"%@",name); id view = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"]; self.window.rootViewController = view; }
3.經(jīng)過(guò)上面的代碼我們就可以根據(jù)用戶登陸狀態(tài)來(lái)選擇加載的信息,在登陸后的頁(yè)面中,我們添加一個(gè)按鈕,用來(lái)退出。在退出按鈕回調(diào)的方法中,我們需要把之前保存的用戶信息進(jìn)行remove掉,同時(shí)用模態(tài)的方式來(lái)跳轉(zhuǎn)到登陸頁(yè)面,代碼如下:
- (IBAction)tapLoginOut:(id)sender { //獲取UserDefaults單例 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; //移除UserDefaults中存儲(chǔ)的用戶信息 [userDefaults removeObjectForKey:@"name"]; [userDefaults removeObjectForKey:@"password"]; [userDefaults synchronize]; //獲取storyboard UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; //獲取注銷(xiāo)后要跳轉(zhuǎn)的頁(yè)面 id view = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"]; //模態(tài)展示出登陸頁(yè)面 [self presentViewController:view animated:YES completion:^{ }];
下面的截圖是在storyboard中的截圖,運(yùn)行出的效果和下面一樣,到此我們就可以實(shí)現(xiàn)記錄用戶的登陸狀態(tài)了
聯(lián)系客服