項目地址 : https://github.com/zhonggaorong/QQLoginDemo/tree/masterios
最新版本的qq登陸實現步驟實現:git
SDK內容以下:github
1. doc: 爲說明文檔, 方法參數說明。api
2.sample 這個是簡單的demo服務器
3. TencentOpenApi_IOS_Bundle.bundle 資源文件包網絡
4. TencentOpenApi.framework 核心開發框架app
接下來就進入正題:框架
在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>
在Info.plist中添加NSAppTransportSecurity
類型Dictionary
。
在NSAppTransportSecurity
下添加NSAllowsArbitraryLoads
類型Boolean
,值設爲YES
第一步:在plist中添加NSAppTransportSecurity項,此項爲NSDictionary
第二步:在NSAppTransportSecurity下添加 NSAllowsArbitraryLoads類型爲Boolean,value爲YES
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