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

学习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.kler.cn/a/4680.html

相关文章:

  • 流批一体计算引擎-18-离线和实时缝合成的流批一体缘何成为主流
  • Bundlephobia前端强大的包分析工具
  • Springboot Rabbitmq + 线程池技术控制指定数量task执行
  • python milvus 如何检查有多少个collection 以及多少个index,多少个database
  • Elasticsearch—索引库操作(增删查改)
  • Blazor中Syncfusion Word组件使用方法
  • 12、MySQL数据类型
  • 三个月从功能测试进阶到自动化测试,涨薪5k?你在想啥呢?
  • ICG-PEG-OH 结构式,吲哚菁绿-聚乙二醇-羟基的相关说明
  • 循环神经网络RNN基础
  • 数据结构与算法笔记--堆栈和队列的使用
  • NPM 组件包 epic-geo-ip 等恶意获取主机敏感信息(MPS-2023-8302)
  • P1659拉拉队排练 manacher经典题
  • PyInstaller库的使用及Koch曲线及推广,绘制康托尔集
  • 2023学生党适用的蓝牙耳机有哪些?四款学生党值得入手的蓝牙耳机推荐
  • 软件框架-实现使用@Component@Data@Configuration@Bean(配置类控制类实体类)等方法实现将配置文件从8080端口显示在网页上
  • QT中字符转换
  • 支付宝跳转
  • cron表达式 详解
  • vue3 编写 svg 通用组件 修改颜色和尺寸
  • Unity Animation -- Overview
  • Vue3 の 组合式函数
  • C语言通讯录应用程序:从设计到实现
  • 如何使用python删除一个文件?好用到上头.....
  • ElasticSearch系列 - SpringBoot整合ES:组合多个查询条件 bool 查询
  • 正则表达式(含管道符)