一. 首先需要下載騰訊qq登錄所需的庫,下載地址是http://open.qq.com/ 。需要用到的有TencentOpenAPI.framework 和TencentOpenApi_IOS_Bundle.bundle,將兩者加入工程。
二.下面就來實現QQ第三方登錄1.聲明屬性,且viewcontroller實現TencentSessionDelegate@interface LoginViewController :UIViewController@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 =? [[TencentOAuth alloc]initWithAppId:QQid andDelegate:self];
BOOL isInstallQQ = [TencentOAuth iphoneQQInstalled];
if (isInstallQQ ==NO) {
[self.QQButton setHidden:YES];
}
其中initWithAppId:QQid中的QQid,是申請的騰訊開放平臺的appid。
3.使用qq第三方登錄,大概需要三部:
1)獲取認證
2)獲取用戶信息
3)登錄
下面我們來單步分析
1)獲取認證。比如點擊了 使用qq登錄按鈕
#pragma mark ----------- 點擊qq登錄 ----------------
- (IBAction)touchQQLoginButton:(id)sender {
self.tencentOAuth =? [[TencentOAuth alloc]initWithAppId:QQid andDelegate:self];
self.permission = [NSMutableArrayarrayWithObjects:@"get_user_info",@"get_simple_userinfo",nil];
[self.tencentOAuth authorize:self.permission inSafari:NO];
}
登錄結束會調用delegate
#pragma mark --------- qq登錄狀態回調 ------
//登錄完成后,會調用TencentSessionDelegate中關于登錄的協議方法。
- (void)tencentDidLogin
{
NSLog(@"qq登錄完成");
if (_tencentOAuth.accessToken &&0 != [_tencentOAuth.accessToken length])
{
//? 記錄登錄用戶的OpenID、Token以及過期時間
_labelAccessToken.text = _tencentOAuth.accessToken;
NSLog(@"token===%@",[_tencentOAuth accessToken] );
NSLog(@"openId===%@",[_tencentOAuth openId]) ;//這個是用戶的唯一id,使用它來登錄自己的服務器,因為它不像微信登錄那樣和userInfo一起打印出來,所以需要把它變成一個全局變量才能傳給后臺
NSLog(@"appid === %@",[_tencentOAuth appId]);
[self getQQUserInfo];//自己實現的方法,得到用戶信息,見下一步說明。?
}
else{
_labelAccessToken.text = @"登錄不成功沒有獲取accesstoken";
}
}
//非網絡錯誤導致登錄失敗:
-(void)tencentDidNotLogin:(BOOL)cancelled
{
NSLog(@"非網絡錯誤導致登錄失敗");
if (cancelled)
{
NSLog(@"用戶取消登錄操作");
}
else
{
}
}
//網絡錯誤導致登錄失敗:
-(void)tencentDidNotNetWork
{
NSLog(@"網絡錯誤導致登錄失敗:");
}
2)獲取用戶信息
#pragma mark ---------- 獲取qq用戶信息 ----
- (void)getQQUserInfo {
if(![_tencentOAuth getUserInfo]){
NSLog(@"獲取qq用戶信息失敗");
}
}
獲取用戶信息結束回調
#pragma mark -------- qq用戶信息回調 -------
/**
* Called when the get_user_info has response.
*/
- (void)getUserInfoResponse:(APIResponse*) response {
if (response.retCode ==URLREQUEST_SUCCEED)
{
NSMutableString *str=[NSMutableString stringWithFormat:@""];
for (id keyin response.jsonResponse) {
[strappendString: [NSString stringWithFormat:@"%@:%@\n",key,[response.jsonResponseobjectForKey:key]]];
}
MyNSLog(@"%@",str);
NSString* url = [[NSString alloc]initWithString:[response.jsonResponseobjectForKey:@"figureurl_qq_2"]];
NSString* nickname = [[NSString alloc]initWithString:[response.jsonResponseobjectForKey:@"nickname"]];
if (NO_VALUE(url) ||NO_VALUE(nickname)) {
MyNSLog(@"獲取qq用戶信息失敗");
}else{
NSNumber* typeQQ = [NSNumber numberWithInteger:1];
[selflogin:self.openIDandNickname:nickname andAvatar:url ?andType:typeQQ];//自己的登錄函數
}
}
else
{
[self showHint: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個測試賬號進行登錄。
我是個小白,文章如有錯誤,請指出,謝謝。