Swift - QQ授权登录,并获取个人信息(用户资料)
(本文代码已升级至Swift3)
现在很多APP或者网站都支持使用QQ帐号进行登录。本文演示如何实现QQ的第三方登录,以及登录后的获取用户的个人信息。
可以参考我原来写的这篇文章:Swift - 腾讯官方SDK的配置及使用(分享到QQ空间、分享到好友)
按照文章中的1,2,3步骤进行操作。
注意:如果应用未上线,这时需要在你的应用中的"应用调试者"设置调试账号才能使用,不然登录授权的时候就会报登录授权失败110406错误。

2,登录授权,并获取用户资料信息
(1)点击“登录并获取用户资料”按钮

(2)程序会自动跳转到QQ,显示登录页面(页面上会显示需要的授权)

(3)登录成功后又会自动返回原来的APP。本样例中我们在登录成功后,获取用户信息并打印出来

附:返回参数说明
参数名称 | 描述 |
---|---|
ret | 返回码。详见公共返回码说明#OpenAPI V3.0 返回码。 |
msg | 如果错误,返回错误信息。 |
is_lost | 判断是否有数据丢失。如果应用不使用cache,不需要关心此参数。 0或者不返回:没有数据丢失,可以缓存。 |
nickname | 昵称。 |
gender | 性别。 |
country | 国家(当pf=qzone、pengyou或qplus时返回)。 |
province | 省(当pf=qzone、pengyou或qplus时返回)。 |
city | 市(当pf=qzone、pengyou或qplus时返回)。 |
figureurl | 头像URL。详见:前端页面规范#6. 关于用户头像的获取和尺寸说明。 |
openid | 用户QQ号码转化得到的ID(当pf=qplus时返回)。 |
qq_level | 用户QQ等级(当pf=qplus时返回)。 |
qq_vip_level | 用户QQ会员等级(当pf=qplus时返回)。 |
qplus_level | 用户Q+等级(当pf=qplus时返回)。 |
is_yellow_vip | 是否为黄钻用户(0:不是; 1:是)。 (当pf=qzone、pengyou或qplus时返回) |
is_yellow_year_vip | 是否为年费黄钻用户(0:不是; 1:是)。 (当pf=qzone、pengyou或qplus时返回) |
yellow_vip_level | 黄钻等级,目前最高级别为黄钻8级(如果是黄钻用户才返回此参数)。 (当pf=qzone、pengyou或qplus时返回) |
is_yellow_high_vip | 是否为豪华版黄钻用户(0:不是; 1:是)。 (当pf=qzone、pengyou或qplus时返回) |
is_blue_vip | 是否为蓝钻用户(0:不是; 1:是)。 (当pf=qqgame或3366时返回) |
is_blue_year_vip | 是否为年费蓝钻用户(0:不是; 1:是)。 (当pf=qqgame或3366时返回) |
blue_vip_level | 蓝钻等级(如果是蓝钻用户才返回此参数)。 (当pf=qqgame或3366时返回) |
3366_level | 3366用户的大等级。 (当pf=3366时返回) |
3366_level_name | 3366用户的等级名,如小游游、小游仙。 (当pf=3366时返回) |
3366_grow_level | 3366用户的成长等级。 (当pf=3366时返回) |
3366_grow_value | 3366用户的成长值。 (当pf=3366时返回) |
is_super_blue_vip | 是否是豪华蓝钻。 (当pf=qqgame或3366时返回) |
(4)样例代码:
import UIKit class ViewController: UIViewController, TencentSessionDelegate{ var _tencentOAuth:TencentOAuth! override func viewDidLoad() { super.viewDidLoad() _tencentOAuth = TencentOAuth.init(appId: "1105212016", andDelegate: self) } //登录按钮点击 @IBAction func login(_ sender: AnyObject) { //设置权限列表 let permissions = ["get_user_info","get_simple_userinfo"]; //登陆 _tencentOAuth.authorize(permissions) } //登陆完成调用 func tencentDidLogin() { if !_tencentOAuth.accessToken.isEmpty { print("----------------------------------------") print("登录成功!") print("openId:\(_tencentOAuth.openId)", "accessToken:\(_tencentOAuth.accessToken)", "expirationDate:\(_tencentOAuth.expirationDate)") print("开始获取用户资料") _tencentOAuth.getUserInfo() }else { print("登录失败!没有获取到accessToken") } } /** * 登录失败后的回调 */ func tencentDidNotLogin(_ cancelled:Bool) { if cancelled { print("用户取消登录!") }else{ print("登录失败!") } } /** * 登录时网络有问题的回调 */ func tencentDidNotNetWork() { print("没有网络,无法登录!") } /** * 取得用户信息的回调 */ func getUserInfoResponse(_ response: APIResponse!) { print("----------------------------------------") print("用户资料获取成功:") print(response.jsonResponse) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
要退出登录、取消授权。只需要调用 TencentOAuth 对象的 logout() 方法即可。
_tencentOAuth.logout(self)
源码下载:

我把源码下载后进行测试是可以调用手机qq登录,但是自己的app却没调用,反复比对了设置信息和代码,但是没找到问题,请问有可能是那里出了错误?
请问怎么调用手机qq快速登录啊? 这个我试的只能网页登录
class ViewController: UIViewController, TencentSessionDelegate
出现Type 'ViewController"does not conform to protocol 'TencentLoginDelegate'错误, 怎么解决
谢谢
微信登录是不是也类似的?还有微博。。
我这里登录完成后,openid那些内容都能打印出来,
但tencentDidLogin这个方法为什么一直没回调呢,
麻烦有空帮想想,是哪里有问题,跪谢
不错不错,顶