iOS開發之第三方登陸QQ -- 史上最全最新第三方登陸QQ方式實現

項目地址 :  https://github.com/zhonggaorong/QQLoginDemo/tree/masterios

最新版本的qq登陸實現步驟實現:git

 

1. 首先,你須要去向騰訊申請帳號。 地址:點擊打開連接

2. 下載最新的SDK   地址: SDK下載

SDK內容以下:github

1. doc: 爲說明文檔, 方法參數說明。api

2.sample 這個是簡單的demo服務器

 3. TencentOpenApi_IOS_Bundle.bundle   資源文件包網絡

4. TencentOpenApi.framework     核心開發框架app

接下來就進入正題:框架

 1. 項目配置,手把手教學:

   1. 新建一個工程。 
   2. 把TencentOpenApi.framework 和  TencentOpenApi_IOS_Bundle.bundle  拖入工程。 
   3. 配置項目。

   3.1 添加依賴庫:

3.2 在工程配置中的「Build Settings」一欄中找到「Linking」配置區,給「Other Linker Flags」配置項添加屬性值「-fobjc-arc」

 

 

 

 

3.3 URLScheme 配置:

 3.4 針對ios9之後,須要添加白名單。 

在info.plist文件中加入 LSApplicationQueriesSchemes ui

對應的info.plist 的source code 爲url

 

<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>mqqapi</string>
		<string>mqq</string>
		<string>mqqOpensdkSSoLogin</string>
		<string>mqqconnect</string>
		<string>mqqopensdkdataline</string>
		<string>mqqopensdkgrouptribeshare</string>
		<string>mqqopensdkfriend</string>
		<string>mqqopensdkapi</string>
		<string>mqqopensdkapiV2</string>
		<string>mqqopensdkapiV3</string>
		<string>mqzoneopensdk</string>
		<string>wtloginmqq</string>
		<string>wtloginmqq2</string>
		<string>mqqwpa</string>
		<string>mqzone</string>
		<string>mqzonev2</string>
		<string>mqzoneshare</string>
		<string>wtloginqzone</string>
		<string>mqzonewx</string>
		<string>mqzoneopensdkapiV2</string>
		<string>mqzoneopensdkapi19</string>
		<string>mqzoneopensdkapi</string>
		<string>mqzoneopensdk</string>
	</array>

 

 3.5  針對iOS9默認使用https,如今先還原成http請求方式。

  在Info.plist中添加NSAppTransportSecurity類型Dictionary

 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設爲YES    

      第一步:在plist中添加NSAppTransportSecurity項,此項爲NSDictionary

      第二步:在NSAppTransportSecurity下添加   NSAllowsArbitraryLoads類型爲Boolean,value爲YES

 

 

4. 開始碼代碼了, 最歡樂的時刻:

 1. 在剛剛新建的項目中 appdelegate.m, 添加代碼:

          1.引入頭文件 : 

          

#import <TencentOpenAPI/QQApiInterface.h>
#import <TencentOpenAPI/TencentOAuth.h>

 

 

 

   2. 並遵循代理

 

@interface AppDelegate ()<QQApiInterfaceDelegate>
@end

 

 

  3. 在添加跳轉的請求方法

      

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
    /**
     處理由手Q喚起的跳轉請求
     \param url 待處理的url跳轉請求
     \param delegate 第三方應用用於處理來至QQ請求及響應的委託對象
     \return 跳轉請求處理結果,YES表示成功處理,NO表示不支持的請求協議或處理失敗
     */
    [QQApiInterface handleOpenURL:url delegate:self];
    return [TencentOAuth HandleOpenURL:url];
}


/**
 處理來至QQ的請求
 */
- (void)onReq:(QQBaseReq *)req{
    NSLog(@" ----req %@",req);
}

/**
 處理來至QQ的響應
 */
- (void)onResp:(QQBaseResp *)resp{
     NSLog(@" ----resp %@",resp);
}

/**
 處理QQ在線狀態的回調
 */
- (void)isOnlineResponse:(NSDictionary *)response{

}


如今就是具體的登陸controller.m了。

 

 

受權相關的字段

 

/** 發表一條說說到QQ空間(<b>須要申請權限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC;

/** 發表一篇日誌到QQ空間(<b>須要申請權限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ONE_BLOG;

/** 建立一個QQ空間相冊(<b>須要申請權限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM;

/** 上傳一張照片到QQ空間相冊(<b>須要申請權限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC;

/** 獲取用戶QQ空間相冊列表(<b>須要申請權限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM;

/** 同步分享到QQ空間、騰訊微博 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_SHARE;

/** 驗證是否定證空間粉絲 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS;

/** 獲取登陸用戶本身的詳細信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO;

/** 獲取其餘用戶的詳細信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO;

/** 獲取會員用戶基本信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO;

/** 獲取會員用戶詳細信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO;

/** 獲取用戶信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO;

/** 移動端獲取用戶信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO;



 

直接上源碼, 源碼裏面有註釋,一看就明白了

 

 

//
//  ViewController.m
//  QQLoginDemo
//
//  Created by 張國榮 on 16/6/17.
//  Copyright © 2016年 BateOrganization. All rights reserved.
//

#import "ViewController.h"

#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/TencentApiInterface.h>

#define APP_ID @"你的appid"
@interface ViewController ()<TencentSessionDelegate>
{
    TencentOAuth *_tencentOAuth;
    NSMutableArray *_permissionArray;   //權限列表
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
}


- (IBAction)loginAction:(id)sender {
    _tencentOAuth=[[TencentOAuth alloc]initWithAppId:APP_ID andDelegate:self];
    
    //設置權限數據 , 具體的權限名,在sdkdef.h 文件中查看。
    _permissionArray = [NSMutableArray arrayWithObjects: kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,nil];
    
    //登陸操做
    [_tencentOAuth authorize:_permissionArray inSafari:NO];
}

/**
 * 登陸成功後的回調
 */
- (void)tencentDidLogin{
    
    /** Access Token憑證,用於後續訪問各開放接口 */
    if (_tencentOAuth.accessToken) {
        
        //獲取用戶信息。 調用這個方法後,qq的sdk會自動調用
        //- (void)getUserInfoResponse:(APIResponse*) response
        //這個方法就是 用戶信息的回調方法。
        
        [_tencentOAuth getUserInfo];
    }else{
    
        NSLog(@"accessToken 沒有獲取成功");
    }
    
}

/**
 * 登陸失敗後的回調
 * \param cancelled 表明用戶是否主動退出登陸
 */
- (void)tencentDidNotLogin:(BOOL)cancelled{
    if (cancelled) {
        NSLog(@" 用戶點擊取消按鍵,主動退出登陸");
    }else{
        NSLog(@"其餘緣由, 致使登陸失敗");
    }
}

/**
 * 登陸時網絡有問題的回調
 */
- (void)tencentDidNotNetWork{
    NSLog(@"沒有網絡了, 怎麼登陸成功呢");
}


/**
 * 因用戶未授予相應權限而須要執行增量受權。在用戶調用某個api接口時,若是服務器返回操做未被受權,則觸發該回調協議接口,由第三方決定是否跳轉到增量受權頁面,讓用戶從新受權。
 * \param tencentOAuth 登陸受權對象。
 * \param permissions 需增量受權的權限列表。
 * \return 是否仍然回調返回原始的api請求結果。
 * \note 不實現該協議接口則默認爲不開啓增量受權流程。若須要增量受權請調用\ref TencentOAuth#incrAuthWithPermissions: \n注意:增量受權時用戶可能會修改登陸的賬號
 */
- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions{
    
    // incrAuthWithPermissions是增量受權時須要調用的登陸接口
    // permissions是須要增量受權的權限列表
    [tencentOAuth incrAuthWithPermissions:permissions];
    return NO; // 返回NO代表不須要再回傳未受權API接口的原始請求結果;
    // 不然能夠返回YES
}

/**
 * [該邏輯未實現]因token失效而須要執行從新登陸受權。在用戶調用某個api接口時,若是服務器返回token失效,則觸發該回調協議接口,由第三方決定是否跳轉到登陸受權頁面,讓用戶從新受權。
 * \param tencentOAuth 登陸受權對象。
 * \return 是否仍然回調返回原始的api請求結果。
 * \note 不實現該協議接口則默認爲不開啓從新登陸受權流程。若須要從新登陸受權請調用\ref TencentOAuth#reauthorizeWithPermissions: \n注意:從新登陸受權時用戶可能會修改登陸的賬號
 */
- (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth{
    return YES;
}

/**
 * 用戶經過增量受權流程從新受權登陸,token及有效期限等信息已被更新。
 * \param tencentOAuth token及有效期限等信息更新後的受權實例對象
 * \note 第三方應用需更新已保存的token及有效期限等信息。
 */
- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth{
    NSLog(@"增量受權完成");
    if (tencentOAuth.accessToken
        && 0 != [tencentOAuth.accessToken length])
    { // 在這裏第三方應用須要更新本身維護的token及有效期限等信息
        // **務必在這裏檢查用戶的openid是否有變動,變動需從新拉取用戶的資料等信息** _labelAccessToken.text = tencentOAuth.accessToken;
    }
    else
    {
        NSLog(@"增量受權不成功,沒有獲取accesstoken");
    }

}

/**
 * 用戶增量受權過程當中因取消或網絡問題致使受權失敗
 * \param reason 受權失敗緣由,具體失敗緣由參見sdkdef.h文件中\ref UpdateFailType
 */
- (void)tencentFailedUpdate:(UpdateFailType)reason{
    
    switch (reason)
    {
        case kUpdateFailNetwork:
        {
            //            _labelTitle.text=@"增量受權失敗,無網絡鏈接,請設置網絡";
            NSLog(@"增量受權失敗,無網絡鏈接,請設置網絡");
            break;
        }
        case kUpdateFailUserCancel:
        {
            //            _labelTitle.text=@"增量受權失敗,用戶取消受權";
            NSLog(@"增量受權失敗,用戶取消受權");
            break;
        }
        case kUpdateFailUnknown:
        default:
        {
            NSLog(@"增量受權失敗,未知錯誤");
            break;
        }
    }

    
}

/**
 * 獲取用戶我的信息回調
 * \param response API返回結果,具體定義參見sdkdef.h文件中\ref APIResponse
 * \remarks 正確返回示例: \snippet example/getUserInfoResponse.exp success
 *          錯誤返回示例: \snippet example/getUserInfoResponse.exp fail
 */
- (void)getUserInfoResponse:(APIResponse*) response{
    NSLog(@" response %@",response);
}

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

@end
相關文章
相關標籤/搜索