一步一步实现iOS QQ第三方登录
2017-04-06 10:05
260 查看
前言
最近在公司应用中集成QQ登录的时候遇到一些波折(坑点),觉得还是有必要记录一下.
一.集成SDK
1.集成官方Framework
首先下载官网SDK iOS_SDK下载,目前来说最新的包是V3.1.0,下载完解压后你会看到iOS_SDK.pngTencentOpenAPI.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 andLibraries"选项点击下面添加按钮添加上面的库即可.ImporFrameworks.png
2. 修改必要的工程配置属性。
在工程配置中的“Build Settings”一栏中找到“Linking”配置区,给“Other LinkerFlags”配置项添加属性值“-fobjc-arc”Build Settings.png
3.Info.Plist设置
在工程配置中的"Info"中找到"URL Types",添加一条新的“URL scheme”.注意:[code]Identifier: tencentopenapi URL Schemes: tencent + appid其中Identifier 和URL Schemes是必填项,Identifier是tencentopenapi,URL
Schemes是tencent加上你在官网申请的appid.申请APPIDinfo.png你以为到了这步就完了吗,NO NO NO
要想实现点击之后跳转到QQ是应用间跳转的效果而不是打开一个登录网页的话我们还得再Info.plist表中添加一下链接.找到工程的Info.plist,然后添加"LSApplicationQueriesSchemes"
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">key>LSApplicationQueriesSchemes</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">key>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">array>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqapi</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqq</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqOpensdkSSoLogin</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqconnect</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqopensdkdataline</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqopensdkgrouptribeshare</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqopensdkfriend</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqopensdkapi</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqopensdkapiV2</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqopensdkapiV3</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzoneopensdk</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqopensdkapiV3</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqqopensdkapiV3</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzone</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzonev2</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzoneshare</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>wtloginqzone</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzonewx</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzoneopensdkapiV2</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzoneopensdkapi19</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzoneopensdkapi</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
<<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>mqzoneopensdk</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">string>
</<span class="hljs-name" style="box-sizing: border-box; color: rgb(38, 139, 210);">array>
[/code]
三.业务集成到了这里,我们的工程配置算是完成了.接下来在AppDelegate中
1. AppDelegate#import
并且重写AppDelegate 的handleOpenURL和openURL方法[code]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]; }
[/code](1)
2.初始化iOS SDK API数据对象TencentOAuth
创建TencentOAuth并初始化其appid,demo为123456789。delegate为实现TencentSessionDelegate的对象:[code]_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"123456789", andDelegate:self];
[/code]这里delegate不能为空(2)设置应用需要用户授权的API列表。
(建议如果授权过多的话,可能会造成用户不愿意授权。这里最好只授权应用需要用户赋予的授权。):[code] NSArray *permissions = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_INFO, kOPEN_PERMISSION_GET_USER_INFO, kOPEN_PERMISSION_GET_SIMPLE_USER_INFO, nil]; // 这里调起登录 [_tencentOAuth authorize:permissions];
[/code]注意: 这个地方官网是下面的写法[code]_permissions = [[NSArray arrayWithObjects:@"get_user_info",@"get_simple_userinfo", @"add_t", nil] retain];
[/code]但是本人试验了一下之后会报"msg = "this api without user
authorization";ret=100030"需要遵守
遵守代理TencentSessionDelegate协议,并在代码中实现协议中的方法,具体方法很多,这里就不一一列举了,具体协议可以参照TencentOpenAPI.framework
/Headers中的TencentOAuth.h文件1.调用登录的方法很简单
调用SDK登录[code][_tencentOAuth authorize:permissions];
[/code]2.登录完成之后,会调用TencentSessionDelegate中关于登录的协议方法[code]//登录成功: - (void)tencentDidLogin { if (_tencentOAuth.accessToken.length > 0) { // 获取用户信息 [_tencentOAuth getUserInfo]; } else { NSLog(@"登录不成功 没有获取accesstoken"); } } //非网络错误导致登录失败: - (void)tencentDidNotLogin:(BOOL)cancelled { if (cancelled) { NSLog(@"用户取消登录"); } else { NSLog(@"登录失败"); } }
[/code]3.获取用户信息实现- (void)getUserInfoResponse:(APIResponse*) response;方法,从response获取用户的个人信息[code]// 获取用户信息 - (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); } }
[/code]
相关文章推荐
- 一步一步实现iOS QQ第三方登录
- 实现QQ的第三方登录 iOS开发
- iOS QQ实现第三方登录以及遇到的问题
- iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现
- iOS开发 实现QQ第三方登录
- iOS QQ实现第三方登录以及遇到的问题
- iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现
- iOS QQ第三方登录实现
- iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现
- iOS QQ第三方登录实现
- iOS开发中 实现登录时关于使用QQ做为第三方授权登录的问题
- iOS QQ第三方登录的简单实现
- 使用Sharesdk实现第三方平台登录(qq,新浪微博)
- 实现iOS应用内付费(In-App&nbsp;P…
- 第三方QQ账号登录的实现
- IOS项目集成ShareSDK实现第三方登录、分享、关注等功能。
- iOS--登录验证用第三方不能实现时用系统自带的解析方式
- IOS项目集成ShareSDK实现第三方登录、分享、关注等功能。
- Android 实现QQ第三方登录
- Android 实现QQ第三方登录