首页 > 代码库 > iOS开发项目篇—20存储账号信息

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 YYAppDelegate11 12 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions13 {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文件:
二、补充说明
  用户取消对应用的授权
 
点击删除--》确定,可以取消对相关应用的授权。
 
取消应用授权之后,重新运行程序,则进入到登录界面,需要重新进行授权。