zoukankan      html  css  js  c++  java
  • iOS 第三方登录之 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个测试账号进行登录。

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

  • 相关阅读:
    转录组分析的正确姿势
    NGS基础
    蛋白质组学研究概述
    Real-time qPCR So Easy?
    UI设计师给的px尺寸单位,安卓如何换算成dp?
    用户·角色·权限·表的设计
    ie浏览器多开-----同时登陆多个账号
    WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种
    WPF 单个触发器、多个触发器、多条件触发器
    WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute)
  • 原文地址:https://www.cnblogs.com/fendou0320/p/5262235.html
Copyright © 2011-2022 走看看