IOS
发表于 2015-4-3 13:35:30
继续学习中,谢谢楼主
陈晓强
发表于 2015-4-15 17:23:40
{:soso_e101:} {:soso_e101:} {:soso_e101:} {:soso_e101:}
xiaoyuzaizoulu
发表于 2015-6-1 19:18:47
hao ba今天我又来了
Miul
发表于 2015-6-19 14:09:15
继续学习。楼主热心帮助解答问题,给力~
Miul
发表于 2015-6-30 16:37:45
这讲感觉实现起来需要很多其他知识。新浪认证倒是没啥问题,但是redirect_uri一定要填写对,不然页面总是会显示不正确。另外就是AFNetworking已经更新了版本,下的新版本发现和楼主工程的老版本变化很多。自己对这块的知识没有多少概念,感觉实现起来比较吃力。工程中先用WebView请求服务器的授权。
//请求
https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com/response&response_type=code
这个接口会返回数据code。当打开页面填写完用户名密码后,点击登录,webView会自动把之前服务器返回的code这部分数据再发送给服务器是吗?这都是webView内部来处理的?
Sian
发表于 2015-6-30 21:52:13
本帖最后由 Sian 于 2015-6-30 21:53 编辑
Miul 发表于 2015-6-30 16:37
这讲感觉实现起来需要很多其他知识。新浪认证倒是没啥问题,但是redirect_uri一定要填写对,不然页面总是会 ...
1、AFNetworking已经更新了版本没有关系,因为AFNetworking在项目中已经封装了,所以不需要关心AFNetworking的具体细节,至于AFNetworking的新版本特性这里就不做过多讨论,其实很简单只是换几个方法而已,原理是一样的;
2、SAOAuthController的view是被替换成了webView,不用太在意他是不是浏览器,这里主要做了两件事件:
2.1、通过通过加载新浪的登录界面发送http请求,验证用户名密码成功后,新浪会返回一个重定向页面,这个重定向页面,这个重定向页面会让你去访问你的kRedirect_uri,即所谓的回调地址。而这个重定向url中包含了我们认证通过后所需要的code值,我们手机端就不让他再去访问重定向url了,只要截取url里面的code就行,这个过程在webView的代理方法中实现:
#pragma mark 代理方法获取Token
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
// 1、获取全路径,将URL转换成字符串
NSString *url = request.URL.absoluteString;
// 2、查找code范围
NSRange range = ; // 匹配包含"code="的URL
if (range.length){ // 如果有,取"code="后跟的串,即为requestToken
NSInteger index = range.location + range.length;
NSString *requestToken = ;
// 3、换取accessToken
;
return NO;
}
return YES;
}
2.2、获取到了code后,调用新浪提供的另一个接口换取AccessToken,这个东西是我们调取所有接口都必传的一个字段:
-(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 = ;
[ saveAccount:account];
// 2 跳转到主页面
self.view.window.rootViewController = [init];
// MyLog(@"%@", JSON);
// 3 清除页面加载提示
;
// 获取信息失败
} failure:^(NSError *error) {
// 1 打印错误提示
MyLog(@"请求失败-%@", );
// 2 清除页面加载提示
;
}];
}
2.3、SAOAuthController理解以上两点就足够了。
Miul
发表于 2015-6-30 23:42:42
楼主解答非常清楚明了,解答了我心中的很多问题。再次谢谢楼主,能这么热心的解答我的问题。:loveliness:
Miul
发表于 2015-7-5 13:15:12
给使用AFNetworking2.0以上版本的同学提个醒,新浪返回access_Token数据时,有个坑。
AFJSONRequestOperation默认不接收text/plain类型的数据,当服务器返回text/plain类型的数据时,会认为出错了。可以通过修改源代码解决问题
+ (NSSet *)acceptableContentTypes {
return ;
}
nullptr
发表于 2015-7-22 10:36:39
666666666666666
sk91600
发表于 2015-7-28 21:43:28
代码结构清晰,继续学习中