学习HM微博项目第4天

步骤:OAuth授权01_加载登录界面 -> OAuth授权02_获得accessToken -> OAuth授权03_存储账号信息 -> OAuth授权04_封装账号存储 -> OAuth授权05_封装控制器的切换

OAuth授权01_加载登录界面

为了测试方便,暂时把window的根控制器固定设置为授权控制器,如下:

window的根控制器.png

在HMOAuthViewController类(继承UIViewController)的viewDidLoad方法中,新建一个webView类,并用webView加载登陆界面(新浪提供的),如下:

学习HM微博项目第4天_第1张图片
viewDidLoad方法.png

APP的界面:

学习HM微博项目第4天_第2张图片
APP的界面.png

OAuth授权02_获得accessToken

在前文中已经加载登陆界面,输入账号信息后并点击登陆按钮后,通过-webView:shouldStartLoadWithRequest:navigationType:方法拦截url请求,并从中判断是否为回调地址,若是就利用code的请求标识(授权成功后的request token)换取一个accessToken。如下:

学习HM微博项目第4天_第3张图片
-webView:shouldStartLoadWithRequest:navigationType:方法.png

具体如何利用code的请求标识(授权成功后的request token)换取一个accessToken可看accessTokenWith:方法,如下:

学习HM微博项目第4天_第4张图片
accessTokenWith:方法.png

注意:这里的网络请求用的是AFN框架,并且由于新浪返回的数据Content-Type是text/plain类型的原因,需要对AFN的AFJSONResponseSerializer做下修改。

授权成功后APP会进入回调地址的页面,这里的回调地址为www.baidu.com。如下:

学习HM微博项目第4天_第5张图片
回调地址的页面.png

OAuth授权03_存储账号信息

在授权成功后,利用code向新浪服务器发送请求,成功后会向返回账号的相关信息,这时候应该对账号信息进行存储,避免以后需要再次对应用进行授权。

在前文的发送请求代码中继续完善请求成功的代码,如下:

学习HM微博项目第4天_第6张图片
请求成功的代码.png

说明:
1.返回的账号字典数据要转换成数据模型进行存储,并且用归档的方式进行存储。
2.请求成功后APP应该切换窗口的控制器,而不能再进入回调地址的页面,所以要在-webView:shouldStartLoadWithRequest:navigationType:禁止加载回调地址,如下:

学习HM微博项目第4天_第7张图片
禁止加载回调地址.png

3.在请求成功后切换窗口的控制器需要对版本进行判断,另外APPDelegate类也需要修改下,之前暂时把window的根控制器固定设置为授权控制器,现在需要通过是否存储过账号信息对根控制器进行选择,如下:

学习HM微博项目第4天_第8张图片
APPDelegate类.png

4.HMAccount账号模型归档和解档要特别注意遵守NSCoding协议,否则会出现这样的错误信息:


归档和解档没遵守NSCoding协议.png

HMAccount.m的具体代码如下:

学习HM微博项目第4天_第9张图片
HMAccount.m.png

HMAccount.h的具体代码如下:

学习HM微博项目第4天_第10张图片
HMAccount.h.png

OAuth授权04_封装账号存储

前文中,将返回的账号字典数据存进账号模型和存进沙盒的操作应该抽取出来并封装到HMAccount和HMAccountTool两个类中,如下:

学习HM微博项目第4天_第11张图片
封装账号存储 .png

HMAccountTool.m的具体代码如下:

学习HM微博项目第4天_第12张图片
HMAccountTool.m.png

说明:
1.saveAccount:方法除了存储前文必要的账号信息,还需要存储获得账号存储的时间(accessToken的产生时间),以便以后授权过期提醒用户重新登录。
具体代码如下:

学习HM微博项目第4天_第13张图片
saveAccount:方法.png

2.由于还要存储获得账号存储的时间(accessToken的产生时间),所以要对HMAccount做下修改,添加created_time属性,并对归档encodeWithCoder:方法和解档initWithCoder:方法做下修改。

3.在APPDelegate类中,可对之前的代码进行简化(直接通过HMAccountTool的account:方法取出HMAccount的账号数据),如下:

学习HM微博项目第4天_第14张图片
APPDelegate类.png

4.account方法中,如果账号过期,应该返回nil(即会重新返回登录界面),具体代码:

学习HM微博项目第4天_第15张图片
屏幕快照 2015-09-07 下午8.07.57.png

OAuth授权05_封装控制器的切换

前文窗口的根控制器的切换在多处地方使用到,所以应该对其进行封装。这里,只需要做简单的版本判断来切换控制器,所以没必要特意新建一个类来封装,只要通过category对UIWindow进行扩展就可以,具体如下:

学习HM微博项目第4天_第16张图片
UIWindow+Extension.png

说明:
1.AppDelegate类的代码:

学习HM微博项目第4天_第17张图片
AppDelegate类.png

2.在HMOAuthViewController类中,可以:

HMOAuthViewController类.png

你可能感兴趣的:(学习HM微博项目第4天)