步驟:OAuth授權(quán)01_加載登錄界面 -> OAuth授權(quán)02_獲得accessToken -> OAuth授權(quán)03_存儲賬號信息 -> OAuth授權(quán)04_封裝賬號存儲 -> OAuth授權(quán)05_封裝控制器的切換
OAuth授權(quán)01_加載登錄界面
為了測試方便携茂,暫時把window的根控制器固定設(shè)置為授權(quán)控制器鸳谜,如下:
在HMOAuthViewController類(繼承UIViewController)的viewDidLoad方法中览绿,新建一個webView類逛绵,并用webView加載登陸界面(新浪提供的),如下:
APP的界面:
OAuth授權(quán)02_獲得accessToken
在前文中已經(jīng)加載登陸界面法焰,輸入賬號信息后并點擊登陸按鈕后陕赃,通過-webView:shouldStartLoadWithRequest:navigationType:方法攔截url請求,并從中判斷是否為回調(diào)地址梧疲,若是就利用code的請求標(biāo)識(授權(quán)成功后的request token)換取一個accessToken。如下:
具體如何利用code的請求標(biāo)識(授權(quán)成功后的request token)換取一個accessToken可看accessTokenWith:方法,如下:
注意:這里的網(wǎng)絡(luò)請求用的是AFN框架喂分,并且由于新浪返回的數(shù)據(jù)Content-Type是text/plain類型的原因,需要對AFN的AFJSONResponseSerializer做下修改。
授權(quán)成功后APP會進入回調(diào)地址的頁面,這里的回調(diào)地址為www.baidu.com。如下:
OAuth授權(quán)03_存儲賬號信息
在授權(quán)成功后颜懊,利用code向新浪服務(wù)器發(fā)送請求,成功后會向返回賬號的相關(guān)信息侄刽,這時候應(yīng)該對賬號信息進行存儲,避免以后需要再次對應(yīng)用進行授權(quán)徙垫。
在前文的發(fā)送請求代碼中繼續(xù)完善請求成功的代碼荣瑟,如下:
說明:
1.返回的賬號字典數(shù)據(jù)要轉(zhuǎn)換成數(shù)據(jù)模型進行存儲霹娄,并且用歸檔的方式進行存儲。
2.請求成功后APP應(yīng)該切換窗口的控制器,而不能再進入回調(diào)地址的頁面漩氨,所以要在-webView:shouldStartLoadWithRequest:navigationType:禁止加載回調(diào)地址蔗坯,如下:
3.在請求成功后切換窗口的控制器需要對版本進行判斷,另外APPDelegate類也需要修改下择卦,之前暫時把window的根控制器固定設(shè)置為授權(quán)控制器,現(xiàn)在需要通過是否存儲過賬號信息對根控制器進行選擇,如下:
4.HMAccount賬號模型歸檔和解檔要特別注意遵守NSCoding協(xié)議月褥,否則會出現(xiàn)這樣的錯誤信息:
HMAccount.m的具體代碼如下:
HMAccount.h的具體代碼如下:
OAuth授權(quán)04_封裝賬號存儲
前文中佛猛,將返回的賬號字典數(shù)據(jù)存進賬號模型和存進沙盒的操作應(yīng)該抽取出來并封裝到HMAccount和HMAccountTool兩個類中码荔,如下:
HMAccountTool.m的具體代碼如下:
說明:
1.saveAccount:方法除了存儲前文必要的賬號信息,還需要存儲獲得賬號存儲的時間(accessToken的產(chǎn)生時間),以便以后授權(quán)過期提醒用戶重新登錄。
具體代碼如下:
2.由于還要存儲獲得賬號存儲的時間(accessToken的產(chǎn)生時間),所以要對HMAccount做下修改戒良,添加created_time屬性奏司,并對歸檔encodeWithCoder:方法和解檔initWithCoder:方法做下修改黄锤。
3.在APPDelegate類中,可對之前的代碼進行簡化(直接通過HMAccountTool的account:方法取出HMAccount的賬號數(shù)據(jù))奏篙,如下:
4.account方法中,如果賬號過期,應(yīng)該返回nil(即會重新返回登錄界面)蔓倍,具體代碼:
OAuth授權(quán)05_封裝控制器的切換
前文窗口的根控制器的切換在多處地方使用到,所以應(yīng)該對其進行封裝环疼。這里,只需要做簡單的版本判斷來切換控制器栅贴,所以沒必要特意新建一個類來封裝斟湃,只要通過category對UIWindow進行擴展就可以厨剪,具體如下:
說明:
1.AppDelegate類的代碼:
2.在HMOAuthViewController類中,可以: