iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现

iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现 

标签: iOS第三方登录QQ登录增量授权第三方登录QQ详解
  7406人阅读  评论(0)  收藏  举报
本文章已收录于: 
  iOS知识库
  分类:
Object_c(53)    IOS高级知识总结(100) 

目录(?)[+]

项目地址 :  https://github.com/zhonggaorong/QQLoginDemo/tree/master

最新版本的qq登录实现步骤实现:


1. 首先,你需要去向腾讯申请账号。 地址:点击打开链接

2. 下载最新的SDK   地址: SDK下载

SDK内容如下:


1. doc: 为说明文档, 方法参数说明。

2.sample 这个是简单的demo

 3. TencentOpenApi_IOS_Bundle.bundle   资源文件包

4. TencentOpenApi.framework     核心开发框架

接下来就进入正题:

 1. 项目配置,手把手教学:

   1. 新建一个工程。 
   2. 把TencentOpenApi.framework 和  TencentOpenApi_IOS_Bundle.bundle  拖入工程。 
   3. 配置项目。

   3.1 添加依赖库:


3.2 在工程配置中的“Build Settings”一栏中找到“Linking”配置区,给“Other Linker Flags”配置项添加属性值“-fobjc-arc”






3.3 URLScheme 配置:


 3.4 针对ios9以后,需要添加白名单。 

在info.plist文件中加入 LSApplicationQueriesSchemes 


对应的info.plist 的source code 为

[objc]  view plain  copy
 
  1. LSApplicationQueriesSchemes  
  2.       
  3.         mqqapi  
  4.         mqq  
  5.         mqqOpensdkSSoLogin  
  6.         mqqconnect  
  7.         mqqopensdkdataline  
  8.         mqqopensdkgrouptribeshare  
  9.         mqqopensdkfriend  
  10.         mqqopensdkapi  
  11.         mqqopensdkapiV2  
  12.         mqqopensdkapiV3  
  13.         mqzoneopensdk  
  14.         wtloginmqq  
  15.         wtloginmqq2  
  16.         mqqwpa  
  17.         mqzone  
  18.         mqzonev2  
  19.         mqzoneshare  
  20.         wtloginqzone  
  21.         mqzonewx  
  22.         mqzoneopensdkapiV2  
  23.         mqzoneopensdkapi19  
  24.         mqzoneopensdkapi  
  25.         mqzoneopensdk  
  26.       

 3.5  针对iOS9默认使用https,现在先还原成http请求方式。

  在Info.plist中添加NSAppTransportSecurity类型Dictionary

 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES    

      第一步:在plist中添加NSAppTransportSecurity项,此项为NSDictionary

      第二步:在NSAppTransportSecurity下添加   NSAllowsArbitraryLoads类型为Boolean,value为YES


4. 开始码代码了, 最欢乐的时刻:

 1. 在刚刚新建的项目中 appdelegate.m, 添加代码:

          1.引入头文件 : 

          

[objc]  view plain  copy
 
  1. #import   
  2. #import   

   2. 并遵循代理

[objc]  view plain  copy
 
  1. @interface AppDelegate ()  
  2. @end  

  3. 在添加跳转的请求方法

      

[objc]  view plain  copy
 
  1. -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{  
  2.     /** 
  3.      处理由手Q唤起的跳转请求 
  4.      \param url 待处理的url跳转请求 
  5.      \param delegate 第三方应用用于处理来至QQ请求及响应的委托对象 
  6.      \return 跳转请求处理结果,YES表示成功处理,NO表示不支持的请求协议或处理失败 
  7.      */  
  8.     [QQApiInterface handleOpenURL:url delegate:self];  
  9.     return [TencentOAuth HandleOpenURL:url];  
  10. }  
  11.   
  12.   
  13. /** 
  14.  处理来至QQ的请求 
  15.  */  
  16. - (void)onReq:(QQBaseReq *)req{  
  17.     NSLog(@" ----req %@",req);  
  18. }  
  19.   
  20. /** 
  21.  处理来至QQ的响应 
  22.  */  
  23. - (void)onResp:(QQBaseResp *)resp{  
  24.      NSLog(@" ----resp %@",resp);  
  25. }  
  26.   
  27. /** 
  28.  处理QQ在线状态的回调 
  29.  */  
  30. - (void)isOnlineResponse:(NSDictionary *)response{  
  31.   
  32. }  

现在就是具体的登录controller.m了。


授权相关的字段

[objc]  view plain  copy
 
  1. /** 发表一条说说到QQ空间(需要申请权限) */  
  2. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC;  
  3.   
  4. /** 发表一篇日志到QQ空间(需要申请权限) */  
  5. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ONE_BLOG;  
  6.   
  7. /** 创建一个QQ空间相册(需要申请权限) */  
  8. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM;  
  9.   
  10. /** 上传一张照片到QQ空间相册(需要申请权限) */  
  11. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC;  
  12.   
  13. /** 获取用户QQ空间相册列表(需要申请权限) */  
  14. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM;  
  15.   
  16. /** 同步分享到QQ空间、腾讯微博 */  
  17. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_SHARE;  
  18.   
  19. /** 验证是否认证空间粉丝 */  
  20. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS;  
  21.   
  22. /** 获取登录用户自己的详细信息 */  
  23. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO;  
  24.   
  25. /** 获取其他用户的详细信息 */  
  26. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO;  
  27.   
  28. /** 获取会员用户基本信息 */  
  29. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO;  
  30.   
  31. /** 获取会员用户详细信息 */  
  32. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO;  
  33.   
  34. /** 获取用户信息 */  
  35. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO;  
  36.   
  37. /** 移动端获取用户信息 */  
  38. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO;  


直接上源码, 源码里面有注释,一看就明白了


[objc]  view plain  copy
 
  1. //  
  2. //  ViewController.m  
  3. //  QQLoginDemo  
  4. //  
  5. //  Created by 张国荣 on 16/6/17.  
  6. //  Copyright © 2016年 BateOrganization. All rights reserved.  
  7. //  
  8.   
  9. #import "ViewController.h"  
  10.   
  11. #import   
  12. #import   
  13.   
  14. #define APP_ID @"你的appid"  
  15. @interface ViewController ()  
  16. {  
  17.     TencentOAuth *_tencentOAuth;  
  18.     NSMutableArray *_permissionArray;   //权限列表  
  19. }  
  20. @end  
  21.   
  22. @implementation ViewController  
  23.   
  24. - (void)viewDidLoad {  
  25.     [super viewDidLoad];  
  26.       
  27.     self.view.backgroundColor = [UIColor whiteColor];  
  28. }  
  29.   
  30.   
  31. - (IBAction)loginAction:(id)sender {  
  32.     _tencentOAuth=[[TencentOAuth alloc]initWithAppId:APP_ID andDelegate:self];  
  33.       
  34.     //设置权限数据 , 具体的权限名,在sdkdef.h 文件中查看。  
  35.     _permissionArray = [NSMutableArray arrayWithObjects: kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,nil];  
  36.       
  37.     //登录操作  
  38.     [_tencentOAuth authorize:_permissionArray inSafari:NO];  
  39. }  
  40.   
  41. /** 
  42.  * 登录成功后的回调 
  43.  */  
  44. - (void)tencentDidLogin{  
  45.       
  46.     /** Access Token凭证,用于后续访问各开放接口 */  
  47.     if (_tencentOAuth.accessToken) {  
  48.           
  49.         //获取用户信息。 调用这个方法后,qq的sdk会自动调用  
  50.         //- (void)getUserInfoResponse:(APIResponse*) response  
  51.         //这个方法就是 用户信息的回调方法。  
  52.           
  53.         [_tencentOAuth getUserInfo];  
  54.     }else{  
  55.       
  56.         NSLog(@"accessToken 没有获取成功");  
  57.     }  
  58.       
  59. }  
  60.   
  61. /** 
  62.  * 登录失败后的回调 
  63.  * \param cancelled 代表用户是否主动退出登录 
  64.  */  
  65. - (void)tencentDidNotLogin:(BOOL)cancelled{  
  66.     if (cancelled) {  
  67.         NSLog(@" 用户点击取消按键,主动退出登录");  
  68.     }else{  
  69.         NSLog(@"其他原因, 导致登录失败");  
  70.     }  
  71. }  
  72.   
  73. /** 
  74.  * 登录时网络有问题的回调 
  75.  */  
  76. - (void)tencentDidNotNetWork{  
  77.     NSLog(@"没有网络了, 怎么登录成功呢");  
  78. }  
  79.   
  80.   
  81. /** 
  82.  * 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时,如果服务器返回操作未被授权,则触发该回调协议接口,由第三方决定是否跳转到增量授权页面,让用户重新授权。 
  83.  * \param tencentOAuth 登录授权对象。 
  84.  * \param permissions 需增量授权的权限列表。 
  85.  * \return 是否仍然回调返回原始的api请求结果。 
  86.  * \note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意:增量授权时用户可能会修改登录的帐号 
  87.  */  
  88. - (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions{  
  89.       
  90.     // incrAuthWithPermissions是增量授权时需要调用的登录接口  
  91.     // permissions是需要增量授权的权限列表  
  92.     [tencentOAuth incrAuthWithPermissions:permissions];  
  93.     return NO// 返回NO表明不需要再回传未授权API接口的原始请求结果;  
  94.     // 否则可以返回YES  
  95. }  
  96.   
  97. /** 
  98.  * [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时,如果服务器返回token失效,则触发该回调协议接口,由第三方决定是否跳转到登录授权页面,让用户重新授权。 
  99.  * \param tencentOAuth 登录授权对象。 
  100.  * \return 是否仍然回调返回原始的api请求结果。 
  101.  * \note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意:重新登录授权时用户可能会修改登录的帐号 
  102.  */  
  103. - (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth{  
  104.     return YES;  
  105. }  
  106.   
  107. /** 
  108.  * 用户通过增量授权流程重新授权登录,token及有效期限等信息已被更新。 
  109.  * \param tencentOAuth token及有效期限等信息更新后的授权实例对象 
  110.  * \note 第三方应用需更新已保存的token及有效期限等信息。 
  111.  */  
  112. - (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth{  
  113.     NSLog(@"增量授权完成");  
  114.     if (tencentOAuth.accessToken  
  115.         && 0 != [tencentOAuth.accessToken length])  
  116.     { // 在这里第三方应用需要更新自己维护的token及有效期限等信息  
  117.         // **务必在这里检查用户的openid是否有变更,变更需重新拉取用户的资料等信息** _labelAccessToken.text = tencentOAuth.accessToken;  
  118.     }  
  119.     else  
  120.     {  
  121.         NSLog(@"增量授权不成功,没有获取accesstoken");  
  122.     }  
  123.   
  124. }  
  125.   
  126. /** 
  127.  * 用户增量授权过程中因取消或网络问题导致授权失败 
  128.  * \param reason 授权失败原因,具体失败原因参见sdkdef.h文件中\ref UpdateFailType 
  129.  */  
  130. - (void)tencentFailedUpdate:(UpdateFailType)reason{  
  131.       
  132.     switch (reason)  
  133.     {  
  134.         case kUpdateFailNetwork:  
  135.         {  
  136.             //            _labelTitle.text=@"增量授权失败,无网络连接,请设置网络";  
  137.             NSLog(@"增量授权失败,无网络连接,请设置网络");  
  138.             break;  
  139.         }  
  140.         case kUpdateFailUserCancel:  
  141.         {  
  142.             //            _labelTitle.text=@"增量授权失败,用户取消授权";  
  143.             NSLog(@"增量授权失败,用户取消授权");  
  144.             break;  
  145.         }  
  146.         case kUpdateFailUnknown:  
  147.         default:  
  148.         {  
  149.             NSLog(@"增量授权失败,未知错误");  
  150.             break;  
  151.         }  
  152.     }  
  153.   
  154.       
  155. }  
  156.   
  157. /** 
  158.  * 获取用户个人信息回调 
  159.  * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 
  160.  * \remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success 
  161.  *          错误返回示例: \snippet example/getUserInfoResponse.exp fail 
  162.  */  
  163. - (void)getUserInfoResponse:(APIResponse*) response{  
  164.     NSLog(@" response %@",response);  
  165. }  
  166.   
  167. - (void)didReceiveMemoryWarning {  
  168.     [super didReceiveMemoryWarning];  
  169.     // Dispose of any resources that can be recreated.  
  170. }  
  171.   
  172. @end  


你可能感兴趣的:(iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现)