博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS博客项目搭建-10-OAuth02授权封装工具类
阅读量:2384 次
发布时间:2019-05-10

本文共 3869 字,大约阅读时间需要 12 分钟。

授权流程图:

234839_qUI2_2557944.png

原有的代码有许多重复的地方,这里可以对原有的代码进行重构,对账号的有关操作可以抽出一个工具类:

021043_vMur_2557944.png

////  IWAccountTool.h//  ItcastWeibo////  Created by kaiyi on 16-4-6.//  Copyright (c) 2016年 itcast. All rights reserved.//// 账号管理工具类#import 
@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);    }];    }

多抽工具类的好处:

①、业务逻辑分明(把这一段业务逻辑放到最应该处理的类中做)

②、屏蔽业务细节(别人不需要关心业务逻辑怎么实现,如果代码改了,只需修改业务逻辑内部的东东)

转载于:https://my.oschina.net/corwien/blog/653236

你可能感兴趣的文章
C#获取CPU序列号代码、硬盘ID、网卡硬件地址等类文件
查看>>
Html常用符号
查看>>
WinForm控制Webbrowser自动登录
查看>>
access表(.mdb文件) 导入 power designer
查看>>
PowerDesigner如何设计表之间的关联
查看>>
SQLite通用数据库类
查看>>
CMD下修改IP地址!
查看>>
安卓手机可以连上wifi但无法上网的解决办法
查看>>
C++程序员常用工具集
查看>>
在CSDN博客中添加量子恒道统计功能的做法
查看>>
C++调用IDL程序的做法(一)
查看>>
外部修改应用程序图标的做法
查看>>
database disk image is malformed解决方法
查看>>
有关error PRJ0003错误的思考
查看>>
实现自定义对话框程序快捷键的两种方法
查看>>
如何对抗微软霸权,google给我们上了一课
查看>>
获取windows版本信息的做法
查看>>
忆父亲
查看>>
png库结合zlib库使用出现的一个链接问题的解决
查看>>
STL数组和com数组相互转换的做法
查看>>