iOS开发项目篇—20存储账号信息

iOS开发项目篇—20存储账号信息

一、简单说明

1.不论请求是否成功,都在发送Post请求后,隐藏遮罩。

2.在授权成功后,切换根控制器。

(1)说明

切换到控制器有几种情况,要么是切换到新特性,要么是切换到“首页”。

没有必要每次进入程序都需要登录,且每次返回的数据都是一样的,所以只需要把拿到的信息保存到沙盒里就可以了。

判断上次有没有登录成功(把拿到的access_token保存到沙盒中,如果沙盒中有access_token,说明上次登录成功),如果上次登陆成功,那么就判断是否要进入新特性。如果上次没有登陆成功,那么就跳转到登陆界面。

(2)图示

(3)代码

授权YYOAuthViewController.m文件

  1 //
  2 //  YYOAuthViewController.m
  3 //
  4
  5 #import "YYOAuthViewController.h"
  6 #import "MBProgressHUD+MJ.h"
  7 #import "AFNetworking.h"
  8 #import "YYTabBarViewController.h"
  9 #import "YYNewfeatureViewController.h"
 10
 11 @interface YYOAuthViewController ()<UIWebViewDelegate>
 12
 13 @end
 14
 15 @implementation YYOAuthViewController
 16
 17 - (void)viewDidLoad
 18 {
 19     [super viewDidLoad];
 20
 21     //1.创建UIWebView
 22     UIWebView *webView=[[UIWebView alloc]init];
 23     webView.frame=self.view.bounds;
 24     [self.view addSubview:webView];
 25
 26
 27     //2.加载登陆界面
 28     NSURL *url=[NSURL URLWithString:@"https://api.weibo.com/oauth2/authorize?client_id=1972915028&redirect_uri=http://www.cnblogs.com/wendingding/"];
 29     NSURLRequest *request=[[NSURLRequest alloc]initWithURL:url];
 30     [webView loadRequest:request];
 31
 32     //3.设置代理
 33     webView.delegate=self;
 34 }
 35
 36 #pragma mark-UIWebViewDelegate
 37 /**
 38  *  UIWebView开始加载资源的时候调用(开始发送请求)
 39  */
 40 -(void)webViewDidStartLoad:(UIWebView *)webView
 41 {
 42     [MBProgressHUD showMessage:@"正在努力加载中···"];
 43 }
 44
 45 /**
 46  *  UIWebView加载完毕的时候调用(请求结束)
 47  */
 48 -(void)webViewDidFinishLoad:(UIWebView *)webView
 49 {
 50     [MBProgressHUD hideHUD];
 51 }
 52
 53 /**
 54  *  UIWebView加载失败的时候调用(请求失败)
 55  */
 56 -(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
 57 {
 58     [MBProgressHUD hideHUD];
 59 }
 60
 61 /**
 62  *  UIWebView每当发送一个请求之前,都会先调用这个代理方法(询问代理允不允许加载这个请求)
 63  *  @param request        即将发送的请求
 64  *  @return YES允许加载,NO不允许加载
 65  */
 66 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
 67 {
 68     //1.获得请求地址
 69     NSString *urlStr=request.URL.absoluteString;
 70 //    NSLog(@"%@",urlStr);
 71
 72     //2.判断url是否为回调地址
 73     //urlStr在字符串中的范围
 74     //设置从等号位置开始,不用再额外的找位置
 75     NSRange range=[urlStr rangeOfString:@"http://www.cnblogs.com/wendingding/?code="];
 76     //判断是否为回调地址
 77     if (range.location!=NSNotFound) {//是回调地址
 78         //截取授权成功后的请求标记
 79         int from=range.location+range.length;
 80         NSString *code=[urlStr substringFromIndex:from];
 81 //        YYLog(@"%@--%@--",urlStr,code);
 82
 83         //根据code获得一个accessToken
 84         [self accessTokenWithCode:code];
 85
 86         //禁止加载回调页面,拿到想要的东西就好了。
 87         return NO;
 88     }
 89     return YES;
 90 }
 91 /**
 92  *  根据code获得一个accessToken(发送一个Post请求)
 93  *  @param code 授权成功后的请求标记
 94  */
 95 -(void)accessTokenWithCode:(NSString *)code
 96 {
 97     //1.获得请求管理者
 98     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
 99
100     //2.封装请求参数
101
102     NSMutableDictionary *params=[NSMutableDictionary dictionary];
103     params[@"client_id"] =@"1972915028";
104     params[@"client_secret"] =@"b255603c4dfd82b4785bf9a808ce2662";
105     params[@"grant_type"] =@"authorization_code";
106     params[@"code"] =code;
107     params[@"redirect_uri"] =@"http://www.cnblogs.com/wendingding/";
108
109     //3.发送Post请求
110     [mgr POST:@"https://api.weibo.com/oauth2/access_token" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary*responseObject) {
111         //隐藏遮罩
112         [MBProgressHUD hideHUD];
113
114         //3.1存储授权成功的账号信息
115         //获取文件夹
116        NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
117         //获取写入的文件路径
118         NSString *filePath=[doc stringByAppendingPathComponent:@"account.plist"];
119         //保存信息,把字典数据存储到plist文件中
120         [responseObject writeToFile:filePath atomically:YES];
121
122         //3.2切换控制器
123         UIWindow *window=[UIApplication sharedApplication].keyWindow;
124
125         NSString *versionKey=@"CFBundleVersion";
126         versionKey=(__bridge NSString *)kCFBundleVersionKey;
127
128         //从沙盒中取出上次存储的软件版本号(取出用户上次的使用记录)
129         NSUserDefaults *defaults=[[NSUserDefaults alloc]init];
130         NSString *lastVersion=[defaults objectForKey:versionKey];
131
132         //获得当前打开软件的版本号
133         NSString *currentVersion=[NSBundle mainBundle].infoDictionary[versionKey];
134         if ([currentVersion isEqualToString:lastVersion]) {//当前版本号==上次使用的版本号
135                window.rootViewController=[[YYTabBarViewController alloc]init];
136     //       self.window.rootViewController=[[YYNewfeatureViewController alloc]init];
137         }else{//当前版本号!=上次使用的版本号:显示新版本的特性
138                window.rootViewController=[[YYNewfeatureViewController alloc]init];
139             //存储这个使用的软件版本
140             [defaults setObject:currentVersion forKey:versionKey];
141             //立刻写入
142             [defaults synchronize];
143         }
144         YYLog(@"请求成功");
145     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
146         //隐藏遮罩
147          [MBProgressHUD hideHUD];
148         YYLog(@"请求失败");
149     }];
150 }
151 @end

delegate中YYAppDelegate.m文件

 1 //
 2 //  YYAppDelegate.m
 3 //
 4
 5 #import "YYAppDelegate.h"
 6 #import "YYTabBarViewController.h"
 7 #import "YYNewfeatureViewController.h"
 8 #import "YYOAuthViewController.h"
 9
10 @implementation YYAppDelegate
11
12 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
13 {
14
15    //1.创建窗口
16     self.window=[[UIWindow alloc]init];
17     self.window.frame=[UIScreen mainScreen].bounds;
18
19     //获取文件夹
20     NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
21     //获取写入的文件路径
22     NSString *filePath=[doc stringByAppendingPathComponent:@"account.plist"];
23     //获取信息,以进行判断
24     NSDictionary *account=[NSDictionary dictionaryWithContentsOfFile:filePath];
25
26     //2.设置窗口的根控制器
27     //如何知道是否是第一次使用这个版本?可以通过比较上次使用的版本进行判断
28     if (account) {  //  存在成功授权的账号信息
29         NSString *versionKey=@"CFBundleVersion";
30         versionKey=(__bridge NSString *)kCFBundleVersionKey;
31
32         //从沙盒中取出上次存储的软件版本号(取出用户上次的使用记录)
33         NSUserDefaults *defaults=[[NSUserDefaults alloc]init];
34         NSString *lastVersion=[defaults objectForKey:versionKey];
35
36         //获得当前打开软件的版本号
37         NSString *currentVersion=[NSBundle mainBundle].infoDictionary[versionKey];
38         if ([currentVersion isEqualToString:lastVersion]) {//当前版本号==上次使用的版本号
39             self.window.rootViewController=[[YYTabBarViewController alloc]init];
40             //       self.window.rootViewController=[[YYNewfeatureViewController alloc]init];
41         }else{//当前版本号!=上次使用的版本号:显示新版本的特性
42             self.window.rootViewController=[[YYNewfeatureViewController alloc]init];
43             //存储这个使用的软件版本
44             [defaults setObject:currentVersion forKey:versionKey];
45             //立刻写入
46             [defaults synchronize];
47         }
48     }else  //没有登陆过
49     {
50         self.window.rootViewController=[[YYOAuthViewController alloc]init];
51     }
52     //3.显示窗口(主窗口)
53     [self.window makeKeyAndVisible];
54     return YES;
55 }

演示:

登录后,跳转到新特性界面。

    

退出后,再次运行程序,则直接跳转到tabbar界面。

查看沙盒里的plist文件:

二、补充说明

  用户取消对应用的授权

点击删除--》确定,可以取消对相关应用的授权。

取消应用授权之后,重新运行程序,则进入到登录界面,需要重新进行授权。

iOS开发项目篇—20存储账号信息,布布扣,bubuko.com

时间: 2024-08-02 11:00:31

iOS开发项目篇—20存储账号信息的相关文章

iOS开发项目篇—34获取用户信息

iOS开发项目篇—34获取用户信息 一.简单说明 需求:获取当前用户的昵称 ,需要获取当前登录用户的个人信息. 查看接口 要求传递的参数 这里要获取的时用户的昵称(所以使用用户id作为参数传入) 二.实现代码 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 //设置导航栏内容 6 [self setupNavBar]; 7 8 //集成刷新控件 9 [self setupRefresh]; 10 11 //设置用户的昵称为标题 12 [s

iOS开发项目篇—39获取用户未读的微博信息(信息提醒)

iOS开发项目篇—39获取用户未读的微博信息(信息提醒) 一.简单说明 1.实现效果       2.实现 (1)新建一个类,封装请求 查看新浪官方要求的请求参数 该类中的代码设计 YYUnreadCountParam.h文件 1 // YYUnreadCountParam.h 2 //封装请求参数的类 3 4 #import "YYBaseParam.h" 5 6 @interface YYUnreadCountParam : YYBaseParam 7 /**uid true in

iOS开发项目篇—36封装微博业务

iOS开发项目篇—36封装微博业务 一.简单说明 1.请求参数面向模型 2.请求结果面向模型 3.对控制器来说应该屏蔽业务细节.不让控制器关心(知道)业务细节,它只需要知道自己在做某个业务 @通过一个专门的业务处理类:处理微博业务细节 说明: 业务:加载新的微博首页数据 实现:给新浪服务器发送一个GET请求 业务:加载更多的首页微博数据 实现1:给新浪服务器发送一个GET请求 实现2:去沙盒中加载以前离线缓存的微博数据  二.实现 1.新建一个微博业务处理类,继承自NSObject 微博业务处理

iOS开发项目篇—21抽取工具类

iOS开发项目篇—21抽取工具类 一.抽取宏 把和应用相关的信息抽取出来 App Key:1972915028 App Secret:b255603c4dfd82b4785bf9a808ce2662 回调地址:http://www.cnblogs.com/wendingding/ (1)appkey和回调页面在很多地方都要用到 (2)如果是不同应用的话,只需要把这几个参数换掉就可以了.把它们抽取成一个宏,写到pch文件中. 项目的PCH文件 1 #import <Availability.h>

iOS开发项目篇—37封装其他业务

iOS开发项目篇—37封装其他业务 一.简单说明 项目分层的步骤: (1)新建一个模型类封装请求参数 (2)新建一个模型类封装请求结果(返回结果) (3)新建一个业务类封装专一的业务 二.获得用户信息业务的封装 (1)新建一个模型类封装请求参数 查看新浪官方获取用户信息需要哪些请求参数: 封装请求参数的类的代码设计: YYUserInfoParam.h文件 1 // 2 // YYUserInfoParam.h 3 // 4 5 #import <Foundation/Foundation.h>

iOS开发项目篇—38深层重构

iOS开发项目篇—38深层重构 一.简单说明 说明:可以发现每个工具类,内部方法的代码长相都差不多,可以考虑再抽取出一个处理业务的公共的工具类,让其他的业务类继承自这个工具类,降低代码的冗余度. 1.新建一个工具类 该基础业务处理工具类中的代码设计: YYBaseTool.h文件 1 // 2 // YYBaseTool.h 3 4 //最基本的业务工具类 5 6 #import <Foundation/Foundation.h> 7 8 @interface YYBaseTool : NSO

iOS开发项目篇—41cell的frame的细节处理

iOS开发项目篇—41cell的frame的细节处理 一.简单说明 在首页控制器中使用自定义的UITableViewcell 代码如下: YYHomeTableViewController.m文件 1 // 2 // YYHomeTableViewController.m 3 // 4 5 #import "YYHomeTableViewController.h" 6 #import "YYOneViewController.h" 7 #import "Y

iOS开发项目篇—35封装网络请求

iOS开发项目篇—35封装网络请求 一.简单说明 1.分析项目对网路请求(AFN框架)的依赖 项目中,多个控制器都使用了AFN框架发送网络请求,如果AFN2.0存在重大BUg,或者是升级至3.0版本,那么对于整个项目都是及其危险的,所有用到AFN的地方都需要做出相应的修改. 另外,如果现在要求不再使用AFN框架,而是使用一个新的框架,那么有关AFN的依赖所关联的所有代码都需要重新来过. 如果把afn这个第三方框架从项目中删除的话,那么项目就相当于作废了,这就是项目对第三方框架的强依赖的体现. 说

iOS开发项目篇—30下拉刷新

iOS开发项目篇—30下拉刷新 一.网络监控 当应用所处的网络环境不好的时候,获取不到相应的网络数据,考虑到用户对应用的使用体验,有必要对网络的状况进行监听. 在程序启动完的时候,监控网络 YYAppDelegate.m文件代码: 1 // 2 // YYAppDelegate.m 3 // 4 5 #import "YYAppDelegate.h" 6 #import "YYOAuthViewController.h" 7 #import "YYCont