iOS 登錄医男、退出流程整理

寫在前面

僅以此文記錄APP登錄砸狞、退出登錄比較簡單核心的流程。

流程梳理

登錄流程有兩種情況镀梭,1刀森、未登錄時,打開APP先進入登錄頁面报账,點擊登錄后進入首頁研底。2埠偿、已登錄時,打開APP直接進入首頁榜晦。

這里我們已最精簡的流程圖表示這兩種登錄情況冠蒋。

1:未登錄情況
未登錄.png
2:已登錄情況
已登錄.png

代碼編程

我項目是用的RAC+MVVM開發(fā)的,可能有些地方架構(gòu)不同乾胶,但是道理都是相通的抖剿。

一、LoginService

首先繼承NSObject創(chuàng)建LoginService用來做“登錄”功能的數(shù)據(jù)處理识窿。還有在登錄成功后需要存儲用戶的一些信息斩郎,這些信息往往我們將其以model的形式存儲。
在LoginService.h中最主要的兩個方法喻频。

@property (nonatomic, strong) UserInfoModel *signUser;

+ (instancetype)shareInstance;

- (RACSignal *)loginWithLoginName:(NSString *)loginName
                         loginPwd:(NSString *)loginPwd;

- (void)logOut;

在.m中:

1缩宜、先說- (RACSignal *)loginWithLoginName:(NSString *)loginNameloginPwd:(NSString *)loginPwd方法。請求服務(wù)器登錄成功后接受返回的參數(shù)甥温,返回的用戶信息我們用signUser接收锻煌。
if ([responseObject isKindOfClass:[NSString class]]) {
            //
            return @(NO);
        } else {
            NSDictionary *resultDic = responseObject[@"result"];
            UserInfoModel *userInfo = [UserInfoModel yy_modelWithDictionary:resultDic];
            self.signUser = userInfo;
            
            NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
            [userDefault setObject:loginName forKey:USERNAME];
            [userDefault setObject:[CryptoHelper Encrypt:loginPwd] forKey:PASSWORD];
            [userDefault setObject:@"ISLOGIN" forKey:ISLOGIN];
            NSData *signUserData = [NSKeyedArchiver archivedDataWithRootObject:userInfo];
            [userDefault setObject:signUserData forKey:SIGNUSERINFO];
            [userDefault synchronize];
            
            self.isLogin = YES;
            
            return @(YES);
        }

在這個方法中,使用NSUserDefaults用戶名密碼進行本地化存儲窿侈,(注意:密碼不要以明文方式存儲,需要加密)秋茫。另:將登錄狀態(tài)也存儲在NSUserDefaults本地中史简,以便在AppDelegate中使用。

這里有一個點肛著,我們都知道NSUserDefaults是不可以直接存儲對象的圆兵。但是我們又想存signUser這個UserInfoModel。這里需要對UserInfoModel進行處理枢贿。UserInfoModel繼承自NSObjec殉农,并遵循NSCoding協(xié)議。并實現(xiàn)兩個NSCoding代理方法:

//1:
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
        self.adminID = [aDecoder decodeObjectForKey:@"adminID"];
        self.adminName = [aDecoder decodeObjectForKey:@"adminName"];
    }
    return self;
}
//2:
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.adminID forKey:@"adminID"];
    [aCoder encodeObject:self.adminName forKey:@"adminName"];
}

這樣我們在存儲model對象的時候局荚,先將model轉(zhuǎn)成NSData類型超凳,然后將data存儲即可。
NSData *signUserData = [NSKeyedArchiver archivedDataWithRootObject:userInfo]; [userDefault setObject:signUserData forKey:SIGNUSERINFO];

2耀态、實現(xiàn)logOut方法

在注銷登錄的方法中轮傍,將本地存儲的密碼、登錄狀態(tài)標(biāo)識首装、用戶信息清除创夜,這里我們保留了“賬號”,后面將會提到這個用處仙逻。

- (void)logOut {
    self.isLogin = NO;
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
//    [userDefault removeObjectForKey:USERNAME];
    [userDefault removeObjectForKey:PASSWORD];
    [userDefault removeObjectForKey:ISLOGIN];
    [userDefault removeObjectForKey:SIGNUSERINFO];
    [userDefault synchronize];
}
3驰吓、這里說一下signUser屬性變量

在這里我將LoginService做了一個單例,因為這里面的signUser會在項目中其他地方用到,所以這里我使用了懶加載矮瘟。在懶加載中先判斷有沒有登錄狀態(tài)的記錄遵湖,如果有的話直接從本地里面取出signUser。沒有的話給signUser進行初始化偎蘸,具體見下面代碼:

這里也有一個點:從本地取出之前存儲的model對象庄蹋。在這里操作的時候先將[userDefault objectForKey:SIGNUSERINFO]轉(zhuǎn)換為NSData,然后使用NSKeyedUnarchiver解檔成 UserInfoModel。如下代碼:

- (UserInfoModel *)signUser {
    if (!_signUser) {
        NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
        if ([[userDefault objectForKey:ISLOGIN] isEqualToString:@"ISLOGIN"]) {
            NSData *signUserData = [userDefault objectForKey:SIGNUSERINFO];
            _signUser = (UserInfoModel *)[NSKeyedUnarchiver unarchiveObjectWithData:signUserData];
        } else {
            _signUser = [[UserInfoModel alloc] init];
        }
    }
    return _signUser;
}

二迷雪、AppDelegate

在APPDelegate中限书,判斷本地是否有存儲的ISLOGIN標(biāo)識,進行不同邏輯的跳轉(zhuǎn)章咧。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    BOOL isLogin = [[userDefault objectForKey:@"ISLOGIN"] isEqualToString:@"ISLOGIN"];
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[UIViewController new]];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    
    if (isLogin) {

        HomePageVC *vc = [[HomePageVC alloc] init];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
        self.window.rootViewController = nav;
    } else {
        LoginVC *vc = [[LoginVC alloc] init];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
        nav.navigationBarHidden = YES;
        self.window.rootViewController = nav;
    }
    return YES;
}

三倦西、SettingVC

在這個界面點擊退出登錄按鈕執(zhí)行如下方法:
在這里最后不要用push或pop來切換界面。采用直接改變[UIApplication sharedApplication].keyWindow.rootViewController的方法赁严。

        [self.viewModel logout];
        LoginVC *vc = [[LoginVC alloc] init];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
        [UIApplication sharedApplication].keyWindow.rootViewController = nav;

總結(jié)

以上就是登錄->退出登錄的核心邏輯,在此基礎(chǔ)上再添加別的業(yè)務(wù)邏輯疼约。比如啟動頁卤档,引導(dǎo)頁之類的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末程剥,一起剝皮案震驚了整個濱河市劝枣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌织鲸,老刑警劉巖舔腾,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搂擦,居然都是意外死亡稳诚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門瀑踢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扳还,“玉大人,你說我怎么就攤上這事橱夭∑瞻欤” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵徘钥,是天一觀的道長衔蹲。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么舆驶? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任橱健,我火速辦了婚禮,結(jié)果婚禮上沙廉,老公的妹妹穿的比我還像新娘拘荡。我一直安慰自己,他們只是感情好撬陵,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布珊皿。 她就那樣靜靜地躺著,像睡著了一般巨税。 火紅的嫁衣襯著肌膚如雪蟋定。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天草添,我揣著相機與錄音驶兜,去河邊找鬼。 笑死远寸,一個胖子當(dāng)著我的面吹牛抄淑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驰后,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肆资,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灶芝?” 一聲冷哼從身側(cè)響起郑原,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎监署,沒想到半個月后颤专,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纽哥,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡钠乏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了春塌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晓避。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖只壳,靈堂內(nèi)的尸體忽然破棺而出俏拱,到底是詐尸還是另有隱情,我是刑警寧澤吼句,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布锅必,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搞隐。R本人自食惡果不足惜驹愚,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劣纲。 院中可真熱鬧逢捺,春花似錦、人聲如沸癞季。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绷柒。三九已至志于,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辉巡,已是汗流浹背恨憎。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留郊楣,地道東北人憔恳。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像净蚤,于是被迫代替她去往敵國和親钥组。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容