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这个方法为什么一直没回调呢,
麻烦有空帮想想,是哪里有问题,跪谢
不错不错,顶