您的位置:首页 > 移动开发 > IOS开发

IOS博客项目搭建-10-OAuth02授权封装工具类

2016-04-06 00:00 555 查看
授权流程图:



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



//
//  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);

}];

}


多抽工具类的好处:

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

②、屏蔽业务细节(别人不需要关心业务逻辑怎么实现,如果代码改了,只需修改业务逻辑内部的东东)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息