IOS博客项目搭建

Wesley13
• 阅读 470

授权流程图:

IOS博客项目搭建

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

IOS博客项目搭建

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

    }];
    
}

多抽工具类的好处:

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

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

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
tomcat、netty以及nodejs的helloworld性能对比
最近闲来无事,对tomcat、netty以及nodejs的性能对比比较有兴趣,于是自行测试了一下。测试环境:!(http://static.oschina.net/uploads/space/2013/0405/160739_fycm_1021320.png)测试工具:ApacheJMeter2.9测试代码:1.tomcat下的js
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
swing开发测试工具
要项目测试需要,使用swing编写个工具,给需要的人,留下代码:)界面如下:!(http://static.oschina.net/uploads/space/2016/1102/224313_1MMG_559291.png)用java写界面,真费事,使用delphi,分分钟的事情。特点:1、给JTextArea增加行数显示2、给
可莉 可莉
3年前
15道非常经典的Java面试题
试题如下:!(http://static.oschina.net/uploads/space/2016/0729/022902_IBMr_121944.jpg)!(http://static.oschina.net/uploads/space/2016/0729/022923_Exeo_121944.jpg)!(http://static.o
Stella981 Stella981
3年前
AngularJS 学习笔记 (六) 基本概念和用法 之 Service与Provider
1、使用$http服务!(http://static.oschina.net/uploads/space/2016/0623/092916_7mPM_199513.gif)HTML代码:!(http://static.oschina.net/uploads/space/2016/0623/093044_Y
Wesley13 Wesley13
3年前
POI
!(http://static.oschina.net/uploads/space/2016/0120/131416_Dswb_1444646.png)!(http://static.oschina.net/uploads/space/2016/0120/131416_cIpL_1444646.jpg)ApachePOI是Apache(
Stella981 Stella981
3年前
Python入门教程之安装MyEclipse插件和安装Python环境
!(http://static.oschina.net/uploads/space/2015/0303/121617_wJt9_1444646.jpg)!(http://static.oschina.net/uploads/space/2016/0120/130908_6m1a_1444646.jpg)http://dlwt.c
Stella981 Stella981
3年前
Discuz X3.1 论坛修改的方法
!(http://static.oschina.net/uploads/space/2016/0120/131055_Yzo0_1444646.png)!(http://static.oschina.net/uploads/space/2016/0120/131056_khNy_1444646.jpg)本人在实际操作中遇到的一些问题。自己
Stella981 Stella981
3年前
Eclipse的常用功能
1、eclipse的基础不要使用中文版1.1、workspace所有的开发项目都需要在workspace中,记住workspace放置在一个不会被删除的目录中!(http://static.oschina.net/uploads/space/2016/0802/120110_nDPN_2625464.png)改变workspace
Stella981 Stella981
3年前
Linux环境下软件安装
下载——解压缩:!(http://static.oschina.net/uploads/space/2016/0319/203947_DDF5_2312175.png)把得到的目录放到一个不碍事的目录,我们可以设置隐藏目录:!(http://static.oschina.net/uploads/space/2016/0319/204016