前言
平時我們經(jīng)常會在一些app的登錄界面中見到第三方登錄,一些應(yīng)用中一般會使用一些類似shareSDK的集成平臺,他們是將QQ、微信、微博等第三方進(jìn)行了二次封裝,靈活性不太高,其實(shí)直接集成也是比較容易的。今天就來簡單的說一下QQ的第三方登錄的集成。
注冊開發(fā)者賬號
騰訊開放平臺 http://open.qq.com/
下載所需SDK
SDK下載地址:http://wiki.open.qq.com/wiki/mobile/SDK下載

SDK的目錄結(jié)構(gòu)

sample:示例代碼
1. TencentOpenAPI.framework打包了iOS SDK的頭文件定義和具體實(shí)現(xiàn)。
2. TencentOpenApi_iOS_Bundle.bundle 打包了iOS SDK需要的資源文件。
創(chuàng)建項(xiàng)目導(dǎo)入SDK添加依賴庫
- 將
TencentOpenAPI.framework和TencentOpenApi_iOS_Bundle.bundle拖入工程,注意勾選copy items if needed

- 點(diǎn)擊Project navigator 點(diǎn)擊TARGETS ---> General ---> Linked Frameworks and Libraries
點(diǎn)擊加號添加

添加SDK依賴的系統(tǒng)庫文件。分別是
”Security.framework”,
“l(fā)ibiconv.dylib”,
“SystemConfiguration.framework”,
“CoreGraphics.Framework”、
“l(fā)ibsqlite3.dylib”、
“CoreTelephony.framework”、
“l(fā)ibstdc++.dylib”、
“l(fā)ibz.dylib”。
修改工程配置屬性
- 在工程配置中的
Build Settings一欄中找到Linking配置區(qū),給Other Linker Flags配置項(xiàng)添加屬性值-fobjc-arc

配置之后:

- 在XCode中,選擇你的工程設(shè)置項(xiàng),選中
TARGETS一欄,在“info”標(biāo)簽欄的URL type添加一條新的URL scheme,新的scheme = tencent + appid(例如你的appid是123456則填入tencent123456)identifier填寫:tencentopenapi。
注意:此處的配置是實(shí)現(xiàn)應(yīng)用間的跳轉(zhuǎn)即跳轉(zhuǎn)至QQ進(jìn)行授權(quán)以及跳轉(zhuǎn)回app進(jìn)行其他的操作。

創(chuàng)建應(yīng)用
在騰訊開發(fā)者平臺中創(chuàng)建應(yīng)用,獲得appId及appKey,具體步驟詳見開發(fā)中心,這里不再贅述。
開始添加代碼
做好了之前的步驟,現(xiàn)在開始添加調(diào)用授權(quán)的代碼。
AppDelegate.m:
#import "AppDelegate.h"
#import <TencentOpenAPI/TencentOAuth.h> //導(dǎo)入頭文件
@interface AppDelegate () <TencentSessionDelegate>
{
TencentOAuth *_tencentOAth;//創(chuàng)建授權(quán)對象
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
_tencentOAth = [[TencentOAuth alloc] initWithAppId:@"這里填寫你申請的appID" andDelegate:self];
return YES;
}
//重寫appDelegate中的回調(diào)方法
- (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];
}
你所要調(diào)用第三方登錄的controller
#import "ViewController.h"
#import <TencentOpenAPI/TencentOAuth.h>
@interface ViewController () <TencentSessionDelegate>
{
TencentOAuth *_tencentOAth;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)qqLogin:(id)sender
{
_tencentOAth = [[TencentOAuth alloc] initWithAppId:@"你所申請的appID" andDelegate:self];
//設(shè)置需要獲取的權(quán)限列表,需要什么就寫什么
NSArray *permissions = [NSArray arrayWithObjects:@"get_user_info",@"get_simple_userinfo",@"add_t",nil];
//調(diào)用此方法開始跳轉(zhuǎn)進(jìn)行授權(quán)
[_tencentOAth authorize:permissions inSafari:NO];
}
#pragma mark -- TencentSessionDelegate
//登陸完成調(diào)用
- (void)tencentDidLogin
{
if (_tencentOAth.accessToken &&0 != [_tencentOAth.accessToken length])
{
//這里可獲取accessToken,Access Token憑證,用于后續(xù)訪問各開放接口
NSLog(@"accessToken %@",_tencentOAth.accessToken);
//這里可獲取openID,openId是用戶授權(quán)登錄后對該用戶的唯一標(biāo)識
NSLog(@"openId %@",_tencentOAth.openId);
//獲取用戶信息
[_tencentOAth getUserInfo];
}
else
{
NSLog(@"登錄不成功沒有獲取accesstoken");
}
}
//非網(wǎng)絡(luò)錯誤導(dǎo)致登錄失敗:
-(void)tencentDidNotLogin:(BOOL)cancelled
{
NSLog(@"tencentDidNotLogin");
if (cancelled)
{
NSLog(@"用戶取消登錄");
}
else
{
NSLog(@"登錄失敗");
}
}
// 網(wǎng)絡(luò)錯誤導(dǎo)致登錄失?。?
- (void)tencentDidNotNetWork
{
NSLog(@"tencentDidNotNetWork");
}
- (void)getUserInfoResponse:(APIResponse *)response
{
NSLog(@"respons:%@",response.jsonResponse);
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:response.jsonResponse[@"figureurl_2"]]];
UIImage *image = [UIImage imageWithData:imageData scale:1];
self.headerImageView.image = image;
self.nameLabel.text = response.jsonResponse[@"nickname"];
self.sexLabel.text = response.jsonResponse[@"gender"];
self.provinceLabel.text = response.jsonResponse[@"province"];
self.cityLabel.text = response.jsonResponse[@"city"];
}
@end
具體步驟再來敘述一下:
- 初始化TencentOAuth 對象 appid來自應(yīng)用寶創(chuàng)建的應(yīng)用, deletegate設(shè)置為self 記得要實(shí)現(xiàn)代理方法
- 設(shè)置需要獲取的權(quán)限列表,需要什么就寫什么
- 調(diào)用方法開始跳轉(zhuǎn)進(jìn)行授權(quán) [_tencentOAth authorize:permissions inSafari:NO];
- 在tencentDidLogin代理中獲取openId、acess_token
- 調(diào)用[_tencentOAth getUserInfo] 獲取用戶的信息
- 在 - (void)getUserInfoResponse:(APIResponse *)response 代理中獲取用戶的信息。
至此,QQ的授權(quán)登錄就算是基本的實(shí)現(xiàn)了,至于具體的其他注冊邏輯就需要自己進(jìn)行改寫了。