一步一步实现iOS QQ第三方登录
前言
最近在公司应用中集成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"选项点击下面添加按钮添加上面的库即可.
ImporFrameworks.png2. 修改必要的工程配置属性。
在工程配置中的“Build Settings”一栏中找到“Linking”配置区,给“Other Linker Flags”配置项添加属性值“-fobjc-arc”
Build Settings.png3.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我.