当前位置: 首页 > news >正文

学习HM微博项目第4天

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

OAuth授权01_加载登录界面

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

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

 

APP的界面:

 

OAuth授权02_获得accessToken

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

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

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

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

OAuth授权03_存储账号信息

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

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

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

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

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

HMAccount.m的具体代码如下: 

HMAccount.h的具体代码如下:

 

OAuth授权04_封装账号存储

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

 HMAccountTool.m的具体代码如下:

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

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

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

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

 

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

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

说明:
1.AppDelegate类的代码:

 

2.在HMOAuthViewController类中,可以:

 

 

 

 

 

 

 

 

 

 

http://www.lryc.cn/news/44157.html

相关文章:

  • 一次完整的OCR实践记录
  • Java中常见的密码学知识
  • Leetcode.2171 拿出最少数目的魔法豆
  • day1 计算机组成与结构考点汇总
  • Java虚拟机的类加载机制
  • 分治法实现合并排序(归并排序),理解分治算法思想,实现分治算法的完美例子合并排序(含码源与解析)
  • Typescript 类 (class)
  • KDZD程控超低频高压发生器
  • 【华为OD机试 2023最新 】 过滤组合字符串(C++)
  • Java笔记034-坦克大战【2】
  • 【算法】【数组与矩阵模块】桶排序思想解决无序数组排序后相邻数间的最大差值
  • C语言—函数
  • Autosar模式管理实战系列03-基于Davinci工具的WDGM配置
  • AutoML-sklearn and torch
  • 《扬帆优配》算力概念股大爆发,主力资金大扫货
  • 机械臂+底盘三维模型从solidworks到moveit配置功能包
  • 高并发系统设计:缓存、降级、限流、(熔断)
  • 《辉煌优配》放量大涨,A股成交额重回万亿!PCB板块继续领跑
  • Vue封装的过度与动画
  • 流量监控-ntopng
  • C++ 21 set容器
  • 什么是JWT
  • Gradle7.4安装
  • 【华为OD机试 2023最新 】 箱子之字形摆放(C++ 100%)
  • Matplotlib库入门
  • 学生党用什么蓝牙耳机比较好?300内高性价比蓝牙耳机排行
  • Lambda 表达式与函数式接口
  • 后端代码规范
  • web自动化测试:Selenium+Python基础方法封装(建议收藏)
  • while实现1到100相加求和-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)