IOS博客项目搭建-10-OAuth02授权封装工具类
2016-04-06 00:00
555 查看
授权流程图:
原有的代码有许多重复的地方,这里可以对原有的代码进行重构,对账号的有关操作可以抽出一个工具类:
在IWOAuthViewController.m控制器中,可以调用accountTool.h工具类,这样代码会更简洁:
多抽工具类的好处:
①、业务逻辑分明(把这一段业务逻辑放到最应该处理的类中做)
②、屏蔽业务细节(别人不需要关心业务逻辑怎么实现,如果代码改了,只需修改业务逻辑内部的东东)
原有的代码有许多重复的地方,这里可以对原有的代码进行重构,对账号的有关操作可以抽出一个工具类:
// // IWAccountTool.h // ItcastWeibo // // Created by kaiyi on 16-4-6. // Copyright (c) 2016年 itcast. All rights reserved. // // 账号管理工具类 #import <Foundation/Foundation.h> @class IWAccount; @interface IWAccountTool : NSObject // 存储账号信息 +(void)saveAccount:(IWAccount *)account; /** * 返回存储的账号 */ +(IWAccount *)account; @end
// // IWAccountTool.m // ItcastWeibo // // Created by kaiyi on 16-4-6. // Copyright (c) 2016年 itcast. All rights reserved. // #import "IWAccount.h" #import "IWAccountTool.h" #define IWAccountFile [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"account.data"] @implementation IWAccountTool +(void)saveAccount:(IWAccount *)account{ // 先判断有无存储账号信息 // NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // NSString *file = [doc stringByAppendingPathComponent:@"account.data"]; // 初始化保存时间 // account.expiresTime = [NSDate date]; // 获取当前时间 NSDate *now = [NSDate date]; account.expiresTime = [now dateByAddingTimeInterval:account.expires_in]; [NSKeyedArchiver archiveRootObject:account toFile:IWAccountFile]; } /** * 返回存储的账号 */ +(IWAccount *)account{ // 先判断有无存储账号信息 IWAccount *account = [NSKeyedUnarchiver unarchiveObjectWithFile:IWAccountFile]; // 判断账号是否过期 NSDate *now = [NSDate date]; // NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending if([now compare:account.expiresTime] == NSOrderedAscending){ return account; }else{ // 过期 return nil; } } @end
在IWOAuthViewController.m控制器中,可以调用accountTool.h工具类,这样代码会更简洁:
/** * 通过code换取一个accessToken redirect_uri true string 回调地址,需需与注册应用里的回调地址一致。 */ -(void)accessTokenWithCode:(NSString *)code { // 发送POST请求给新浪,通过code换取一个accessToken // 发送请求一般用别人封装好的请求框架,如ASI,AFN(项目中使用这个) // ASI:HTTP终结者,已经被淘汰 // AFN(AFNetworking)\AFN // 1.创建请求管理对象 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; // 说明服务器返回的为JSON mgr.responseSerializer = [AFJSONResponseSerializer serializer]; // 2.封装请求参数 NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"client_id"] = @"26999********"; params[@"client_secret"] = @"737ea9bf13***********"; params[@"grant_type"] = @"authorization_code"; params[@"code"] = code; params[@"redirect_uri"] = @"http://digtime.cn"; // 3.发送请求,参数用字典封装,请求成功后服务器端响应一个对象responseObject [mgr POST:@"https://api.weibo.com/oauth2/access_token" parameters: params success:^(AFHTTPRequestOperation *operation, id responseObject) { // IWLog(@"请求成功:%@", [responseObject class]);从字典中取出数据 // 4.先将字典转为模型(创建model,IWAccount.h 取数据放数据非常方便) IWAccount *account = [IWAccount accountWithDict:responseObject]; // 通过返回的数据,判断授权是否过期,如果过期,则重新授权,打开登陆页面 // 5.存储模型数据---存储accessToken信息 ---归档 // 5.1获取沙盒路径 NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 5.2 拼接文件路径 NSString *file = [doc stringByAppendingPathComponent:@"account.data"]; [NSKeyedArchiver archiveRootObject:account toFile:file]; // 5.3 Account.h 需要遵守 NSCoding协议,哪些属性需要归档,哪些需要解档 // 5.4 然后需要在IWAppDelegate.m中当应用加载完后,需要判断用户以前是否有登陆成功过,沙盒里边有数据,然后判断沙盒数据授权信息是否有过期,如果没有过期则直接进入微博 // 5.存储模型数据 [IWAccountTool saveAccount:account]; // 6.新特性\去首页 [IWWeiboTool chooseRootController]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { IWLog(@"请求失败:%@", error); }]; }
多抽工具类的好处:
①、业务逻辑分明(把这一段业务逻辑放到最应该处理的类中做)
②、屏蔽业务细节(别人不需要关心业务逻辑怎么实现,如果代码改了,只需修改业务逻辑内部的东东)
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 五款PHP代码重构工具推荐
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- iOS推送的那些事