iOS 第三方登录之 QQ登录

摘要:
2、 接下来,我们将实现QQ第三方登录1。声明属性,viewcontroller实现TencentSessionDelegate@interfaceLoginViewController:UIViewController@propertyTentOAuth*tencentOAuth;@propertyNSMutableArray*权限;//点击qq登录-touchQQLoginButton:sender@End2。在iOS中,如果iPhone没有安装QQ客户端,则在使用QQ进行第三方登录时会提示安装QQ,这将影响应用程序的启动。因此,你应该首先检查手机上是否安装了qq。如果没有,你需要隐藏qq的第三方登录按钮。
 

一. 首先需要下载腾讯qq登录所需的库,下载地址是http://open.qq.com/ 。

需要用到的有TencentOpenAPI.framework 和TencentOpenApi_IOS_Bundle.bundle,将两者加入工程。

二.下面就来实现QQ第三方登录

1.声明属性,且viewcontroller实现TencentSessionDelegate

@interface LoginViewController :UIViewController<TencentSessionDelegate>

@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 =  [[TencentOAuthalloc]initWithAppId:gQQidandDelegate:self];

BOOL isInstallQQ = [TencentOAuthiphoneQQInstalled];

if (isInstallQQ ==NO) {

    [self.QQButtonsetHidden:YES];

}

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

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

1)获取认证

2)获取用户信息

3)登录

下面我们来单步分析

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

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

- (IBAction)touchQQLoginButton:(id)sender {

    self.tencentOAuth =  [[TencentOAuthalloc]initWithAppId:gQQidandDelegate:self];

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

    [self.tencentOAuthauthorize:self.permissioninSafari:NO];

}

登录结束会调用delegate

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

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

- (void)tencentDidLogin

{

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

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

    {

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

        _labelAccessToken.text = _tencentOAuth.accessToken;

       MyNSLog(@"token===%@",[_tencentOAuthaccessToken] );

       MyNSLog(@"openId===%@",[_tencentOAuthopenId]) ;//这个是用户的唯一id,使用它来登录自己的服务器

       MyNSLog(@"appid === %@",[_tencentOAuthappId]);

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

    }

   else{

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

    }

}

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

-(void)tencentDidNotLogin:(BOOL)cancelled

{

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

   if (cancelled)

    {

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

    }

   else

    {

        

    }

}

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

-(void)tencentDidNotNetWork

{

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

}

 
2)获取用户信息 

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

- (void)getQQUserInfo {

    if(![_tencentOAuthgetUserInfo]){

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

    }

}

获取用户信息结束回调 

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

/**

 * Called when the get_user_info has response.

 */

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

   if (response.retCode ==URLREQUEST_SUCCEED)

    {

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

       for (id keyin response.jsonResponse) {

            [strappendString: [NSStringstringWithFormat:@"%@:%@ ",key,[response.jsonResponseobjectForKey:key]]];

        }

       MyNSLog(@"%@",str);

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

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

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

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

        }else{

           NSNumber* typeQQ = [NSNumbernumberWithInteger:1];

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

        }

    }

   else

    {

        [selfshowHint: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个测试账号进行登录。

文章如有错误,请指出,谢谢。

免责声明:文章转载自《iOS 第三方登录之 QQ登录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ES_HEAD基本查询操作ClamAV下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

表单的提交方法

定义和用法 method 属性规定如何发送表单数据(表单数据发送到 action 属性所规定的页面)。 表单数据可以作为 URL 变量(method="get")或者 HTTP post (method="post")的方式来发送。 实例 在下面的例子中,表单数据将通过 method 属性附加到 URL 上: <form action="form_...

HttpClient4.5.2 连接池原理及注意事项

随着微服务的流行,服务之间的http调用越来越多,遇到的问题也比较多,写这边文章的目的也是将自己遇到的坑和解决方案跟大家分享 一、为什么要用Http连接池 1、降低延迟:如果不采用连接池,每次连接发起Http请求的时候都会重新建立TCP连接(经历3次握手),用完就会关闭连接(4次挥手),如果采用连接池则减少了这部分时间损耗,别小看这几次握手,本人经过测试发...

node中的request模块(http.get封装版)

1.下载并引入request cnpm install request --save; const request = require("request"); 2.基本使用 request({ url: url,//请求路径 method: "POST",//请求方式,默认为get headers: {//设置请求头...

解决来QQ消息后歌曲音量降低问题

今天学了一天,晚上听歌放松一下,谁知碰到了一个很纠结的问题,我正在聊天,每当来QQ消息后,我的歌曲音量自动降低,降到非常小,然后我就调高音量,把音乐的音量调到最大,又把系统音量调到最大,谁知音乐的声音还是很小,鼓捣了一阵,终于找到原因了,在右下角音乐图标点一下,然后点击合成器,就出现下面的界面:看到原因了吧,千千静听的声音比其他三个都低很多,怪不得不管怎么...

[转]网站优化-IIS7下静态文件的优化

本文转自:http://www.cnblogs.com/Leung/archive/2009/10/26/1590256.html 在网站开发过程中,通常我们会对网站的静态文件做处事,像图片文件,CSS,JS文件,其实以前也写过类似的文章,现在只是做一个针对性的总结下. JS文件处理: 网站优化来说,其实是见议我们放在网页最后来来加载,因为JS文件它是一个...

将文件以流的形式另存为下载

//【1】附件为本地磁盘路径(附件可以为图片、pdf、word等等)string strFile = Server.MapPath("/images/526763.pdf"); using (FileStream fs = new FileStream(strFile, FileMode.Open)) { byte[] bytes = new b...