(一)、腾讯开放平台创建应用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贼蛋疼了,好了 不说了,干正事要紧 ************************************************************
// 首页,错误原因还是一样的(很多时候搞不懂, 网上好多这个解释, 说的各种配置)
解决办法:
2. 大概450多行找到TencentSessionDelegate的声明中
好了, 问题应该解决了, 可以运行了, 觉得有用的点个赞, 没解决的可以评论
2.如果你的输出信息是 xxxx - error: "This app is not allowed to query for scheme xxxx"
(在这里因为我的 App 集成了分享到QQ、微信、微博的功能,xxxx部分我看到了 mqq、wechat、sinaweibosso 等多条信息)
解决办法: 去 Info.plist 里面建立一个叫 LSApplicationQueriesSchemes 的 Array,把你在xxxx部分看到的词汇一个一个填进去,直至控制台没有任何相关输出即可。
// 若有问题后面再完善