QQ登錄iOS SDK 封裝了QQ登錄的登錄授權以及大部分OpenAPI,應用只需要修改相應參數,不需要理解驗證授權流程,即可快速實現QQ登錄功能。
iOS平台上(iPad,iPhone,iPod)的應用,請在申請appid,appkey后,使用QQ互聯提供的iOS SDK。
//申請網址 http://connect.qq.com
1. iOS SDK 下載
請到SDK下載頁面下載最新版本QQ登錄iOS SDK。
2. iOS SDK目錄結構
iOS SDK包中帶有兩個文件:
1. TencentOpenAPI.framework打包了iOS SDK的頭文件定義和具體實現。
2. TencentOpenApi_iOS_Bundle.bundle 打包了iOS SDK需要的資源文件。
3. 將iOS SDK文件添加到工程中
1. 將iOS SDK中的TencentOpenAPI.framework和TencentOpenApi_IOS_Bundle.bundle文件拷貝到應用開發的目錄下。
然后將TencentOpenAPI.framework從SDK的保存目錄拖拽到工程導航視圖(project navigator)中的Frameworks虛擬目錄下。
2. 在彈出的對話框中勾選“Create groups for any added folders”,去掉“copy items into destination group’s folder(if needed)”,在Add to targets中選擇要加入SDK的target之后點擊finish。完成之后就將iOS SDK的framework文件加入了開發工程中。
3. 添加SDK依賴的系統庫文件。分別是”Security.framework”, “libiconv.dylib”,“SystemConfiguration.framework”,“CoreGraphics.Framework”、“libsqlite3.dylib”、“CoreTelephony.framework”、“libstdc++.dylib”、“libz.dylib”。
4. 在Xcode中打開工程配置文件,選擇“Build Phases”一欄。
5.在“Build Phases”中選擇展開“Copy Bundle Resources”一欄,並點擊“+”圖標
6. 選擇“Add Other...”,進入iOS SDK文件所在目錄,選擇TencentOpenApi_IOS_Bundle.bundle,點擊回車或者點擊“Open”。
7. 修改必要的工程配置屬性。
在工程配置中的“Build Settings”一欄中找到“Linking”配置區,給“Other Linker Flags”配置項添加屬性值“-fobjc-arc”。
4. 修改必要的代碼
4.1 修改工程配置文件
在XCode中,選擇你的工程設置項,選中“TARGETS”一欄,在“info”標簽欄的“URL type”添加一條新的“URL scheme”,新的scheme = tencent + appid。如果您使用的是XCode3或者更低的版本,則需要在plist文件中添加。Demo中我們注冊的appid是222222。如下圖
另外在Xcode 6.0創建工程時,默認可能沒有單獨設置Bundle display name屬性值。但是因為SDK需要用到Bundle display name的值,所以務必請檢查確保這個屬性存在,如果沒有請添加上。
4.2 重寫AppDelegate 的handleOpenURL和openURL方法
openURL:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [TencentOAuth HandleOpenURL:url];
}
handleOpenURL:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [TencentOAuth HandleOpenURL:url];
}
4.3 在代碼中實現TencentSessionDelegate協議中的方法
具體協議可以參照TencentOpenAPI.framework /Headers中的TencentOAuth.h文件
4.4 初始化iOS SDK API數據對象TencentOAuth。
(1) 創建TencentOAuth並初始化其appid,demo為222222。delegate為實現TencentSessionDelegate的對象:
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222", andDelegate:self];
這里delegate不能為空
(2) 初始化redirectURI(這里需要填寫注冊APP時填寫的域名。默認可以不用填寫。建議不用填寫。demo中注冊時的地址是“www.qq.com”):
_tencentOAuth.redirectURI = @"www.qq.com";
(3)設置應用需要用戶授權的API列表。
(建議如果授權過多的話,可能會造成用戶不願意授權。這里最好只授權應用需要用戶賦予的授權。):
_permissions = [[NSArray arrayWithObjects:@"get_user_info", @"get_simple_userinfo", @"add_t", nil] retain];
5. 調用SDK登錄
1.登錄時,調用TencetnOAuth對象的authorize方法:
[_tencentOAuth authorize:_permissions inSafari:NO];
2. 登錄完成后,會調用TencentSessionDelegate中關於登錄的協議方法。
登錄成功:
@protocol TencentSessionDelegate <NSObject>
- (void)tencentDidLogin
{
_labelTitle.text = @"登錄完成";
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length])
{
// 記錄登錄用戶的OpenID、Token以及過期時間
_labelAccessToken.text = _tencentOAuth.accessToken;
}
else
{
_labelAccessToken.text = @"登錄不成功 沒有獲取accesstoken";
}
}
非網絡錯誤導致登錄失敗:
@protocol TencentSessionDelegate <NSObject>
-(void)tencentDidNotLogin:(BOOL)cancelled
{
if (cancelled)
{
_labelTitle.text = @"用戶取消登錄";
}
else
{
_labelTitle.text = @"登錄失敗";
}
}
網絡錯誤導致登錄失敗:
@protocol TencentSessionDelegate <NSObject>
-(void)tencentDidNotNetWork
{
_labelTitle.text=@"無網絡連接,請設置網絡";
}
3. 登錄成功后,即可獲取到access token和openid。accessToken和 openid保存在TencentOAuth對象中。可以通過相應的屬性方法直接獲得。
[_tencentOAuth accessToken] ;
[_tencentOAuth openId] ;
特別提示:
1.由於登錄是異步過程,這里可能會由於用戶的行為導致整個登錄的的流程無法正常走完,即有可能由於用戶行為導致登錄完成后不會有任何登錄回調被調用。開發者在使用SDK進行開發的時候需要考慮到這點,防止由於一直在同步等待登錄的回調而造成應用的卡死,建議在登錄的時候將這個實現做成一個異步過程。
2.獲取到的access token具有3個月有效期,過期后提示用戶重新登錄授權。
3. 第三方網站可存儲access token信息,以便后續調用OpenAPI訪問和修改用戶信息時使用。如果需要保存授權信息,需要保存登錄完成后返回的accessToken,openid 和 expirationDate三個數據,下次登錄的時候直接將這三個數據是設置到TencentOAuth對象中即可。
獲得:
[_tencentOAuth accessToken] ;
[_tencentOAuth openId] ;
[_tencentOAuth expirationDate] ;
設置:
[_tencentOAuth setAccessToken:accessToken] ;
[_tencentOAuth setOpenId:openId] ;
[_tencentOAuth setExpirationDate:expirationDate] ;
4. 建議應用在用戶登錄后,即調用getUserInfo接口獲得該用戶的頭像、昵稱並顯示在界面上,使用戶體驗統一。