本帖最后由 Sian 于 2015-6-30 21:53 编辑
1、AFNetworking已经更新了版本没有关系,因为AFNetworking在项目中已经封装了,所以不需要关心AFNetworking的具体细节,至于AFNetworking的新版本特性这里就不做过多讨论,其实很简单只是换几个方法而已,原理是一样的;
2、SAOAuthController的view是被替换成了webView,不用太在意他是不是浏览器,这里主要做了两件事件:
2.1、通过通过加载新浪的登录界面发送http请求,验证用户名密码成功后,新浪会返回一个重定向页面,这个重定向页面,这个重定向页面会让你去访问你的kRedirect_uri,即所谓的回调地址。而这个重定向url中包含了我们认证通过后所需要的code值,我们手机端就不让他再去访问重定向url了,只要截取url里面的code就行,这个过程在webView的代理方法中实现:
[Objective-C] 纯文本查看 复制代码 #pragma mark 代理方法获取Token
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
// 1、获取全路径,将URL转换成字符串
NSString *url = request.URL.absoluteString;
// 2、查找code范围
NSRange range = [url rangeOfString:@"code="]; // 匹配包含"code="的URL
if (range.length){ // 如果有,取"code="后跟的串,即为requestToken
NSInteger index = range.location + range.length;
NSString *requestToken = [url substringFromIndex:index];
// 3、换取accessToken
[self getAccessToken:requestToken];
return NO;
}
return YES;
}
2.2、获取到了code后,调用新浪提供的另一个接口换取AccessToken,这个东西是我们调取所有接口都必传的一个字段:
[Objective-C] 纯文本查看 复制代码 -(void)getAccessToken:(NSString *)requestToken
{
// SAHttpTool类中自定义方法,实为封装AFNetWorking的方法获取网页数据
[SAHttpTool httpToolPostWithBaseURL:@"https://api.weibo.com" path:@"oauth2/access_token" params:
@{
// 新浪要求必须传递的五个参数
@"client_id" : kAppKey,
@"client_secret" : kAppSecret,
@"grant_type" : @"authorization_code",
@"code" : requestToken,
@"redirect_uri" : kRedirect_uri
// 成功获取JSON
} success:^(id JSON) {
MyLog(@"请求成功");
// 1 将JSON转换成数据模型并归档
SAAccount *account = [SAAccount accountWithDict:JSON];
[[SAAccountTool sharedAccountTool] saveAccount:account];
// 2 跳转到主页面
self.view.window.rootViewController = [[SAMainController alloc]init];
// MyLog(@"%@", JSON);
// 3 清除页面加载提示
[MBProgressHUD hideAllHUDsForView:self.view animated:YES];
// 获取信息失败
} failure:^(NSError *error) {
// 1 打印错误提示
MyLog(@"请求失败-%@", [error localizedDescription]);
// 2 清除页面加载提示
[MBProgressHUD hideAllHUDsForView:self.view animated:YES];
}];
}
2.3、SAOAuthController理解以上两点就足够了。 |