iOS QQ实现第三方登录以及遇到的问题

(一)、腾讯开放平台创建应用http://op.open.qq.com/manage_centerv2/ios?owner=897240781&uin=897240781

创建好之后我们可以获取到appID 

之后点击上图中的《QQ登录》==》《应用调试者》填写测试QQ

(二)、下载SDK:http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD

               1、找到以下两个文件,拖入到工程中

        2、托入工程后,添加需要的依赖库

           

    3、修改必要的工程配置属性

         在工程配置中的“Build Settings”一栏中找到“Linking”配置区,给“Other Linker Flags”配置项添加属性值“-fobjc-arc”

(四)、代码实现

         1、在AppDelegate.m中 添加 

               #import

          2、重新下面两个方法

               

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    return [TencentOAuth HandleOpenURL:url];
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    return [TencentOAuth HandleOpenURL:url];
}

          3、在你QQ登录界面声明一个

                TencentOAuth *tencentOAuth   对象,然后在QQ登录按钮的点击事件中

            tencentOAuth = [[TencentOAuth alloc]initWithAppId:@"1105198010"andDelegate:self];
            //4,设置需要的权限列表,此处尽量使用什么取什么。
            NSArray *permissions= [NSArray arrayWithObjects:@"get_user_info", @"get_simple_userinfo", @"add_t", nil];
            [tencentOAuth authorize:permissions inSafari:NO];
                4、实现代理方法

#pragma mark -- TencentSessionDelegate
//登陆完成调用
- (void)tencentDidLogin
{
//    resultLable.text = @"登录完成";
    JYLog(@"登录完成");
    
    if (tencentOAuth.accessToken && 0 != [tencentOAuth.accessToken length])
    {
        //  记录登录用户的OpenID、Token以及过期时间
//        tokenLable.text = tencentOAuth.accessToken;
        [tencentOAuth getUserInfo];
    }
    else
    {
//        tokenLable.text = @"登录不成功 没有获取accesstoken";
        JYLog(@"登录不成功 没有获取accesstoken");
    }
}

//非网络错误导致登录失败:
-(void)tencentDidNotLogin:(BOOL)cancelled
{
    NSLog(@"tencentDidNotLogin");
    if (cancelled)
    {
//        resultLable.text = @"用户取消登录";
        JYLog(@"用户取消登录");
    }else{
//        resultLable.text = @"登录失败";
        JYLog(@"登录失败");
    }
}
// 网络错误导致登录失败:
-(void)tencentDidNotNetWork
{
    NSLog(@"tencentDidNotNetWork");
//    resultLable.text = @"无网络连接,请设置网络";
    JYLog(@"无网络连接,请设置网络");
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)getUserInfoResponse:(APIResponse *)response
{
    NSLog(@"respons:%@",response.jsonResponse);
}

做到这基本能实现登录了


(五)、过程中遇到的问题

          1.  l_OBJC_PROTOCOL_$_TencentApiInterfaceDelegate", referenced from:  和  linker command failed with exit code 1 (use -v to see invocation)

这个问题重点还是在   <TencentSessionDelegate> 这代理的警告: Cannot find protocol definition for 'TencentsessionDelegate'

          这种明明都能运行还说我没有定义的警告,是因为你这个协议虽然定义了,但是你这个协议可能还遵守了XX协议,然后这个XX协议没有定义导致会报这种警告,所以遇到这种警告要往“父协议”找。 举个栗子,上面这行就是腾讯授权的库里面报的警告

           注:  解决办法  :此协议遵守了TencentApiInterfaceDelegate协议,在TencentOAuth.h类中#import "TencentApiInterface.h" 警告就没有了

现在就应该可以运行了

**************************** *****************最近项目中要使用到QQ第三方登录(2016-11-09), 发现这个方法已经无法解决这个问题了, 看了下代码, 腾讯应该改了好多东西, 所以这个应该是老版本了, 不适用, 今天拿来用又研究了一段时间., 瞬间感觉QQ贼蛋疼了,好了 不说了,干正事要紧 ************************************************************

// 首页,错误原因还是一样的(很多时候搞不懂, 网上好多这个解释, 说的各种配置)

解决办法:

1.    找到TencentOAuth.h iOS QQ实现第三方登录以及遇到的问题_第1张图片

2.  大概450多行找到TencentSessionDelegate的声明中
iOS QQ实现第三方登录以及遇到的问题_第2张图片


好了, 问题应该解决了, 可以运行了, 觉得有用的点个赞, 没解决的可以评论

          2.如果你的输出信息是 xxxx - error: "This app is not allowed to query for scheme xxxx"

            (在这里因为我的 App 集成了分享到QQ、微信、微博的功能,xxxx部分我看到了 mqq、wechat、sinaweibosso 等多条信息)

       解决办法: 去 Info.plist 里面建立一个叫 LSApplicationQueriesSchemes 的 Array,把你在xxxx部分看到的词汇一个一个填进去,直至控制台没有任何相关输出即可。

iOS QQ实现第三方登录以及遇到的问题_第3张图片

//  若有问题后面再完善

你可能感兴趣的:(iOS)