第三方登录 — QQ登录

一. 首先需要下载腾讯qq登录所需的库,下载地址是http://open.qq.com/ 。需要用到的有TencentOpenAPI.framework 和TencentOpenApi_IOS_Bundle.bundle,将两者加入工程。

二.下面就来实现QQ第三方登录1.声明属性,且viewcontroller实现TencentSessionDelegate@interface LoginViewController :UIViewController@property (nonatomic,strong)TencentOAuth *tencentOAuth;

@property (nonatomic,strong)NSMutableArray* permission;

//点击qq登录

- (IBAction)touchQQLoginButton:(id)sender;

@end

2.iOS中,如果iphone没有安装QQ客户端,当用qq进行第三方登录时会提示要安装qq,这样会影响app上架,

所以,应该先检测一下手机上时候安装了qq,没有安装就需要隐藏qq的第三方登录按钮。

//判断是否安装了qq

self.tencentOAuth =  [[TencentOAuth alloc]initWithAppId:QQid andDelegate:self];

BOOL isInstallQQ = [TencentOAuth iphoneQQInstalled];

if (isInstallQQ ==NO) {

[self.QQButton setHidden:YES];

}

其中initWithAppId:QQid中的QQid,是申请的腾讯开放平台的appid。

3.使用qq第三方登录,大概需要三部:

1)获取认证

2)获取用户信息

3)登录

下面我们来单步分析

1)获取认证。比如点击了 使用qq登录按钮

#pragma mark ----------- 点击qq登录 ----------------

- (IBAction)touchQQLoginButton:(id)sender {

self.tencentOAuth =  [[TencentOAuth alloc]initWithAppId:QQid andDelegate:self];

self.permission = [NSMutableArrayarrayWithObjects:@"get_user_info",@"get_simple_userinfo",nil];

[self.tencentOAuth authorize:self.permission inSafari:NO];

}

登录结束会调用delegate

#pragma mark --------- qq登录状态回调 ------

//登录完成后,会调用TencentSessionDelegate中关于登录的协议方法。

- (void)tencentDidLogin

{

NSLog(@"qq登录完成");

if (_tencentOAuth.accessToken &&0 != [_tencentOAuth.accessToken length])

{

//  记录登录用户的OpenID、Token以及过期时间

_labelAccessToken.text = _tencentOAuth.accessToken;

NSLog(@"token===%@",[_tencentOAuth accessToken] );

NSLog(@"openId===%@",[_tencentOAuth openId]) ;//这个是用户的唯一id,使用它来登录自己的服务器,因为它不像微信登录那样和userInfo一起打印出来,所以需要把它变成一个全局变量才能传给后台

NSLog(@"appid === %@",[_tencentOAuth appId]);

[self getQQUserInfo];//自己实现的方法,得到用户信息,见下一步说明。 

}

else{

_labelAccessToken.text = @"登录不成功没有获取accesstoken";

}

}

//非网络错误导致登录失败:

-(void)tencentDidNotLogin:(BOOL)cancelled

{

NSLog(@"非网络错误导致登录失败");

if (cancelled)

{

NSLog(@"用户取消登录操作");

}

else

{

}

}

//网络错误导致登录失败:

-(void)tencentDidNotNetWork

{

NSLog(@"网络错误导致登录失败:");

}

2)获取用户信息

#pragma mark ---------- 获取qq用户信息 ----

- (void)getQQUserInfo {

if(![_tencentOAuth getUserInfo]){

NSLog(@"获取qq用户信息失败");

}

}

获取用户信息结束回调

#pragma mark -------- qq用户信息回调 -------

/**

* Called when the get_user_info has response.

*/

- (void)getUserInfoResponse:(APIResponse*) response {

if (response.retCode ==URLREQUEST_SUCCEED)

{

NSMutableString *str=[NSMutableString stringWithFormat:@""];

for (id keyin response.jsonResponse) {

[strappendString: [NSString stringWithFormat:@"%@:%@\n",key,[response.jsonResponseobjectForKey:key]]];

}

MyNSLog(@"%@",str);

NSString* url = [[NSString alloc]initWithString:[response.jsonResponseobjectForKey:@"figureurl_qq_2"]];

NSString* nickname = [[NSString alloc]initWithString:[response.jsonResponseobjectForKey:@"nickname"]];

if (NO_VALUE(url) ||NO_VALUE(nickname)) {

MyNSLog(@"获取qq用户信息失败");

}else{

NSNumber* typeQQ = [NSNumber numberWithInteger:1];

[selflogin:self.openIDandNickname:nickname andAvatar:url  andType:typeQQ];//自己的登录函数

}

}

else

{

[self showHint:response.errorMsg];

}

}

3) 登录自己的服务器

[self login:self.openID andNickname:nickname andAvatar:url andType:typeQQ];//自己的登录函数

三.当从qq认证返回我们自己的app,需要在appdelegate中实现

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

if ([url.host isEqualToString:@"qzapp"]) {

return  [TencentOAuth HandleOpenURL:url];

}

return YES;

}

-(BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url{

if ([url.host isEqualToString:@"qzapp"]) {

return  [TencentOAuth HandleOpenURL:url];

}

}

注意事项:

1. 需要特别注意使用第三方登录对审核带来的影响,如果审核人员的设备未安装QQ,如果是跳转到下载微信和QQ的页面,可能会被拒绝。

2. app发布前,只有添加进测试帐号的帐号才能登录成功,否则会报错。

3. 开发完成后需要提交审核,否则只能允许100个测试账号进行登录。

我是个小白,文章如有错误,请指出,谢谢。

你可能感兴趣的:(第三方登录 — QQ登录)