前言

最近在公司应用中集成QQ登录的时候遇到一些波折(坑点),觉得还是有必要记录一下.

一.集成SDK

1.集成官方Framework

首先下载官网SDK iOS_SDK下载,目前来说最新的包是V3.1.0,下载完解压后你会看到

  • TencentOpenAPI.framework打包了iOS SDK的头文件定义和具体实现
  • TencentOpenApi_iOS_Bundle.bundle 打包了iOS SDK需要的资源文件 然后将这两个文件拖入到工程中.

2.Cocoapods集成方式

除了导入官方Framework的方式,还有一种方式是集成Pods方式:TencentOpenApiSDK 目前我用的版本是2.9.5. 我用的方式是Cocoapods集成的方式.如何选择请根据自身情况做出决定.

二.配置工程

1.添加SDK依赖的系统库文件

此外还需要导入一些库分别是: "SystemConfiguration.framework" "Security.framework" "CoreTelephony.framework" "CoreGraphics.Framework" "libiconv.tbd" "libsqlite3.tbd" "libstdc++.tbd" "libz.tbd"

TIPS: .dylib在XCode7以后变成.tbd了,如果你是Xcode7以下的版本,就是.dylib,不过库的名字一样

在Xcode中打开工程配置文件,选择“general”一栏,在最下面找到"Linked Framewords and Libraries"选项点击下面添加按钮添加上面的库即可.

2. 修改必要的工程配置属性。

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

3.Info.Plist设置

在工程配置中的"Info"中找到"URL Types",添加一条新的“URL scheme”. 注意:

Identifier: tencentopenapi
URL Schemes: tencent + appid
复制代码

其中Identifier 和URL Schemes是必填项,Identifier是tencentopenapi,URL Schemes是tencent加上你在官网申请的appid. 申请APPID

你以为到了这步就完了吗,NO NO NO 要想实现点击之后跳转到QQ是应用间跳转的效果而不是打开一个登录网页的话我们还得再Info.plist表中添加一下链接. 找到工程的Info.plist,然后添加"LSApplicationQueriesSchemes"

<key>LSApplicationQueriesSchemes</key><array><string>mqqapi</string><string>mqq</string><string>mqqOpensdkSSoLogin</string><string>mqqconnect</string><string>mqqopensdkdataline</string><string>mqqopensdkgrouptribeshare</string><string>mqqopensdkfriend</string><string>mqqopensdkapi</string><string>mqqopensdkapiV2</string><string>mqqopensdkapiV3</string><string>mqzoneopensdk</string><string>mqqopensdkapiV3</string><string>mqqopensdkapiV3</string><string>mqzone</string><string>mqzonev2</string><string>mqzoneshare</string><string>wtloginqzone</string><string>mqzonewx</string><string>mqzoneopensdkapiV2</string><string>mqzoneopensdkapi19</string><string>mqzoneopensdkapi</string><string>mqzoneopensdk</string></array>
复制代码

三.业务集成

1. AppDelegate

到了这里,我们的工程配置算是完成了.接下来在AppDelegate中 #import <TencentOpenAPI/TencentOAuth.h> 并且重写AppDelegate 的handleOpenURL和openURL方法

openURL:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{return [TencentOAuth HandleOpenURL:url];
}handleOpenURL:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{return [TencentOAuth HandleOpenURL:url];
}
复制代码

2.初始化iOS SDK API数据对象TencentOAuth

(1) 创建TencentOAuth并初始化其appid,demo为123456789。delegate为实现TencentSessionDelegate的对象:

_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"123456789", andDelegate:self];
复制代码

这里delegate不能为空

(2)设置应用需要用户授权的API列表。 (建议如果授权过多的话,可能会造成用户不愿意授权。这里最好只授权应用需要用户赋予的授权。):

 NSArray *permissions = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_INFO, kOPEN_PERMISSION_GET_USER_INFO, kOPEN_PERMISSION_GET_SIMPLE_USER_INFO, nil];
// 这里调起登录[_tencentOAuth authorize:permissions];
复制代码

注意: 这个地方官网是下面的写法

_permissions = [[NSArray arrayWithObjects:@"get_user_info",@"get_simple_userinfo", @"add_t", nil] retain];
复制代码

但是本人试验了一下之后会报"msg = "this api without user authorization";ret=100030"

遵守代理

需要遵守TencentSessionDelegate协议,并在代码中实现协议中的方法,具体方法很多,这里就不一一列举了,具体协议可以参照TencentOpenAPI.framework /Headers中的TencentOAuth.h文件

调用SDK登录

1.调用登录的方法很简单

[_tencentOAuth authorize:permissions];
复制代码

2.登录完成之后,会调用TencentSessionDelegate中关于登录的协议方法

//登录成功:
- (void)tencentDidLogin
{if (_tencentOAuth.accessToken.length > 0) {// 获取用户信息[_tencentOAuth getUserInfo];} else {NSLog(@"登录不成功 没有获取accesstoken");}
}//非网络错误导致登录失败:
- (void)tencentDidNotLogin:(BOOL)cancelled {if (cancelled) {NSLog(@"用户取消登录");} else {NSLog(@"登录失败");}
}
复制代码

3.获取用户信息 实现- (void)getUserInfoResponse:(APIResponse*) response;方法,从response获取用户的个人信息

// 获取用户信息
- (void)getUserInfoResponse:(APIResponse *)response {if (response && response.retCode == URLREQUEST_SUCCEED) {NSDictionary *userInfo = [response jsonResponse];NSString *nickName = userInfo[@"nickname"];// 后续操作...} else {NSLog(@"QQ auth fail ,getUserInfoResponse:%d", response.detailRetCode);}
}
复制代码

4.增量授权 当第三方应用调用某个API接口时,如果服务器返回操作未被授权,则会触发增量授权逻辑。第三方应用需自行实现tencentNeedPerformIncrAuth:withPermissions:协议接口才能够进入增量授权逻辑,否则默认第三方应用放弃增量授权。示例如下:

- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth
withPermissions:(NSArray *)permissions {// incrAuthWithPermissions是增量授权时需要调用的登录接口// permissions是需要增量授权的权限列表[tencentOAuth incrAuthWithPermissions:permissions];return NO; // 返回NO表明不需要再回传未授权API接口的原始请求结果;// 否则可以返回YES
}
复制代码

结束语

至此如何集成QQ第三方登录就介绍完毕,本人集成的时候也是跳了几个坑,慢慢来总会弄好的.如果大家有啥问题可以issue我.

转载于:https://juejin.im/post/5aa53fb55188255581549a0c

一步一步实现iOS QQ第三方登录相关推荐

  1. iOS QQ第三方登录

    今天做了QQ第三方登录,由于公司需要,没用集成的ShareSDK或友盟,走了些弯路,说一下我遇到的问题,以及解决的方式 1. pod 导入QQ的SDK pod 'TencentOpenApiSDK', ...

  2. iOS QQ第三方登录的简单实现

    平时我们经常会在一些app的登录界面中见到第三方登录,一些应用中一般会使用一些类似shareSDK的集成平台,他们是将QQ.微信.微博等第三方进行了二次封装,灵活性不太高,其实直接集成也是比较容易的. ...

  3. iOS QQ第三方登实现

    iOS QQ第三方登实现 标签: iOSqqsdk第三方登陆 2015-06-09 13:40 26692人阅读 评论(7) 收藏 举报  分类: iOS(120)  版权声明:本文为博主原创文章,未 ...

  4. IOS QQ第三方登陆提交AppleStore 被拒解决

    IOS QQ第三方登陆提交AppleStore 被拒解决的原因,大多是苹果的审核人员手机里没有安装QQ,又没有跳到网页登陆,导致审核不通过. 解决办法: 找腾讯开放平台的客服开通申请应用的webvie ...

  5. iOS微信第三方登录实现

    iOS微信第三方登录实现 字数2824 阅读7603 评论19 喜欢46 注意:代码自己动手写,不要复制! 一.接入微信第三方登录准备工作. 移动应用微信登录是基于OAuth2.0协议标准构建的微信O ...

  6. java实现支付宝第三方登录_Java 实现QQ第三方登录(附赠:完整代码)

    老铁,转发+关注+私信 获取完整代码 前言:很多时候我们都需要如下的第三方登录,用QQ帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户. 下面让我们来实现吧,可以参考官网文档,也可以看我下 ...

  7. web实现QQ第三方登录

    web实现QQ第三方登录 开放平台-web实现QQ第三方登录 应用场景 web应用通过QQ登录授权实现第三方登录. 操作步骤 1  注册成为QQ互联平台开发者, http://connect.qq.c ...

  8. QQ第三方登录的详细教程

    这次说一下我自己第一次使用QQ第三方登录的过程 1 .我们开始需要在开发者网站上注册,http://open.qq.com/ 进入这个网站后点应用接入中的应用接入(因为那个按不动),开始注册,这个注册 ...

  9. 公司网站如何让用户使用QQ第三方登录

    我们做了一个中农物联网系统,为了简化用户使用门槛,并保证用户资料安全,准备在自身的用户管理基础上加入第三方登录,主要是QQ登录.微信二维码扫描登录.手机微信登录等.     QQ第三方登录,用的是QQ ...

最新文章

  1. C# 未来新特性:静态委托和函数指针
  2. 面试官问我平时怎么看源码的,我把这篇文章甩给他了。
  3. 标贝科技语音论文入选全球顶级语音学术大会INTERSPEECH2019
  4. 2020最新android教程,Android教程2020
  5. Eclipse 编译项目
  6. mysql安装无法创建mysqld_MySQL 5.7安装错误`mysqld:无法创建/写入文件’/ var / lib / mysql / is_writable’...
  7. 让面试官赞扬的IO读取方法:大文件进行词频统计(单线程与多线程分别解决)利用Buffer流简单又快捷
  8. 读后感系列-2.《看见》柴静(二)
  9. 谷歌浏览器Chrome快速打开Internet选项
  10. 绕过disable_functions,LD_PRELOAD hijack so file
  11. python中tmp什么意思_python中tmp
  12. Flask中自定义红图拆分视图函数的方法以及——为什么蓝图不适合用于拆分试图函数
  13. 1. Boost.Asio入门
  14. 5G大数据时代到来是全面多领域的变革
  15. 怎么从Apache maven 官网下载旧版本
  16. Reactor And Gev 详解 通俗易懂
  17. Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)的用法
  18. 大学“电路分析基础”试题合集第六章(文末附PDF文档与Word文档)
  19. 同功能不同的代码,差别呢?
  20. 【收藏夹】人工智能领域的一些博客/论文/资讯 2017

热门文章

  1. java8避免null_在 Java 8 中避免 Null 检查
  2. 凯里一中2021高考成绩查询,贵州凯里第一中学2021年排名
  3. c语言以冒号分割字符串,C语言里面的冒号
  4. php实现小说字典功能_四十章 PHP实现获取并生成数据库字典的方法
  5. 【每周CV论文推荐】 初学深度学习人脸属性分析必读的文章
  6. 基于墨刀的软件界面原型设计——小说搜索阅读软件
  7. 天天沉迷于皇上本宫的都是sb
  8. Spark 精品文章转载(目录)
  9. ios tableview分组间距
  10. conflicting types for xx错误