[iOS微博项目 - 2.2] - 在app中获取授权

github: https://github.com/hellovoidworld/HVWWeibo

 

A.发送授权请求

1.使用UIWebView加载请求页面

自定义一个继承UIViewController的HVWOAuthViewController

 1 //
 2 //  HVWOAuthViewController.m
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/4.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "HVWOAuthViewController.h"
10
11 @interface HVWOAuthViewController ()
12
13 @end
14
15 @implementation HVWOAuthViewController
16
17 - (void)viewDidLoad {
18     [super viewDidLoad];
19     // Do any additional setup after loading the view.
20
21     // 创建UIWebView
22     UIWebView *webView = [[UIWebView alloc] init];
23     webView.frame = self.view.bounds;
24
25     // 添加到主界面
26     [self.view addSubview:webView];
27
28     // 加载请求页面
29     NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/oauth2/authorize?client_id=3942775926&redirect_uri=http://www.cnblogs.com/hellovoidworld/"];
30     NSURLRequest *request = [NSURLRequest requestWithURL:url];
31     [webView loadRequest:request];
32 }
33
34
35 @end

把这个控制器作为window的根控制器运行测试:

AppDelegate:

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     // Override point for customization after application launch.
 3
 4     // 启动后显示状态栏
 5     UIApplication *app = [UIApplication sharedApplication];
 6     app.statusBarHidden = NO;
 7
 8     // 设置window
 9     self.window = [[UIWindow alloc] init];
10     self.window.frame = [UIScreen mainScreen].bounds;
11
12     self.window.rootViewController = [[HVWOAuthViewController alloc] init];
13     [self.window makeKeyAndVisible];
14
15     return YES;
16 }

2.使用UIWebView代理拦截发送url动作,发送授权请求之后发送的url就带有access_code

 1 /** 截取web发送请求 */
 2 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
 3
 4     NSString *urlStr = request.URL.absoluteString;
 5     NSRange range = [urlStr rangeOfString:@"http://www.cnblogs.com/hellovoidworld/?code="];
 6     if (range.length > 0) { // 如果是匹配的url,即发送的是带access_code的url
 7         // 截取access_code
 8         NSUInteger accessCodeLocation = range.length + range.location;
 9         NSString *accessCode = [urlStr substringFromIndex:accessCodeLocation];
10
11         HVWLog(@"%@", accessCode);
12
13         return NO; // 阻止发送,不需要跳转到重定向页面
14     }
15
16     return YES; // 其他情况照常发送
17 }

Output:

5bef5308ba902cc52d9f2dc34bbfdd1c

注意这个access_code每次都不一样的

3.获取access_token

(1)获取access_token的请求API,发送POST请求

(2)使用AFN框架来发送post请求

 1 /** 根据access_code获取access_token */
 2 - (void) accessTokenWithAccessCode:(NSString *) accessCode {
 3     // 创建AFN的http操作请求管理者
 4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 5
 6     // 参数设置
 7     NSMutableDictionary *param = [NSMutableDictionary dictionary];
 8     param[@"client_id"] = @"3942775926";
 9     param[@"client_secret"] = @"cc577953b2aa3aa8ea220fd15775ea35";
10     param[@"grant_type"] = @"authorization_code";
11     param[@"code"] = accessCode;
12     param[@"redirect_uri"] = @"http://www.cnblogs.com/hellovoidworld/";
13
14     // 发送请求
15     [manager POST:@"https://api.weibo.com/oauth2/access_token" parameters:param success:^(AFHTTPRequestOperation *operation, NSDictionary *accountInfo) {
16         [MBProgressHUD hideHUD];
17
18         // 返回的是用户信息字典
19         HVWLog(@"%@", accountInfo);
20
21
22     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
23         [MBProgressHUD hideHUD];
24
25         HVWLog(@"请求access_token失败 ----> %@", error);
26     }];
27
28 }

(3)由于新浪返回的json数据Content-Type是 text/plain,但是AFNetworking框架默认的json序列化器不能识别,所以要修改一下json序列化器的acceptableContentType

 1 - (instancetype)init {
 2     self = [super init];
 3     if (!self) {
 4         return nil;
 5     }
 6
 7     self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil];
 8
 9     return self;
10 }

Output:

{
    "access_token" = "2.00A5GpAGGIUpSEff44478fe90yykBw";
    "expires_in" = 181897;
    "remind_in" = 181897;
    uid = 5508976272;

}

(4)保存返回的用户信息到沙盒

// 返回的是用户信息字典
        // 存储用户信息,包括access_token到沙盒中
        NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *filePath = [docPath stringByAppendingPathComponent:@"accountInfo.plist"];

[accountInfo writeToFile:filePath atomically:YES];

时间: 2024-09-30 11:37:44

[iOS微博项目 - 2.2] - 在app中获取授权的相关文章

iOS利用HealthKit框架从健康app中获取步数信息

微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为我们统计好了步数数据 我们只要使用HealthKit框架从健康app中获取这个数据信息就可以了 这篇文章对HealthKit框架进行了简单的介绍:http://www.cocoachina.com/ios/20140915/9624.html 对HealthKit框架有了简单的了解后我们就可以开始了

[iOS微博项目 - 2.6] - 获取微博数据

github: https://github.com/hellovoidworld/HVWWeibo   A.新浪获取微博API 1.读取微博API 2.“statuses/home_timeline”接口 B.在app中获取微博数据 1.在“首页”控制器发送请求,获取json数据 1 /** 加载微博数据 */ 2 - (void) loadWeiboData { 3 // 创建AFNetworking的http操作中管理器 4 AFHTTPRequestOperationManager *m

[iOS微博项目 - 2.3] - 用户取消对app的授权

github: https://github.com/hellovoidworld/HVWWeibo   A.用户取消对app的授权 用户可以在微博网站上取消对某个应用(app)的授权 1.打开"我的应用" 2.删除掉要取消授权的app 这样下次登陆会要求重新授权

【IOS】App中OAuth授权的实现方式

OAuth 授权在 iOS 中的实现方式 在 iOS App 中,需要绑定微博.twitter.flickr 等第三方平台账号时,一般用OAuth 授权的方式. OAuth 1.0 授权大致分为以下三步: 客户端向平台申请一个 request token,该 token 是未授权的: 客户端打开平台提供的登陆页面,引导用户输入用户名密码,对 request token 进行授权. 登陆页面的 url 中会附带一个 redirect_url,当授权成功后会重定向到这个地址,返回客户端. 客户端拿着

[iOS微博项目 - 2.0] - OAuth授权3步

A.概念 OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的.oAuth是Open Authorization的简写. B.使用3步骤 OAUTH认证授权就三个步骤,三句话可以概括: 1. 获取未授权的Request Token 2. 获取用户授权的Request Token 3. 用授权的Requ

蓝懿ios微博项目之自定义cell

/重写转发微博View的get方法  懒加载,实现了转发微博view复用 // 懒加载就是在程序运行后,不是一下子加载很多的控件,而是后期需要的时候再复用 // 懒加载的形式是重写get方法的同时,里面进行判断跟着 if(obj==nil),这种形式 //  这里的转发的微博view也要考虑view的复用问题 -(LYWeiboView *)reWeiboView{ // if里面判断进行的时候要写成_reWeiboView,如果写self.reWeiboView,它属于_eWeiboView的

[iOS微博项目 - 2.1] - 获得新浪授权接口

A.如何获得新浪的授权接口 登陆新浪的开放平台 注册新浪账号 创建应用 获得应用id和请求地址 查阅相关API 关联需要进行测试的账号 1.登陆开放平台 http://open.weibo.com 2.注册账号 (略) 3.创建应用 4.填写开发者资料 5.创建应用 5.取得应用的App Key和App Secret B.新浪微博API 1.OAuth授权API 上面的redirect_uri也是必填参数,需要在"我的应用"管理页中填写 随便填一个就可以了,其实就是授权成功或者失败的跳

[iOS微博项目 - 2.4] - 重新安排app启动步骤

github: https://github.com/hellovoidworld/HVWWeibo   A.app启动步骤 1.加入了授权步骤之后,最先要判断app内是否已经登陆了账号 2.在程序启动的时候,先检测是否已有登陆账号 AppDelegate: 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 // Ov

[iOS微博项目 - 1.0] - 搭建基本框架

A.搭建基本环境 github: https://github.com/hellovoidworld/HVWWeibo 项目结构: 1.使用代码构建UI,不使用storyboard AppDelegate: 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 // Override point for customiza