一,iOS SDK 下載
請到SDK下載頁面下載最新版本QQ登錄iOS SDK。
二,iOS SDK目錄結構
iOS SDK包中帶有兩個文件:
1. TencentOpenAPI.framework打包了iOS SDK的頭文件定義和具體實現。
2. TencentOpenApi_iOS_Bundle.bundle 打包了iOS SDK需要的資源文件。
三,將iOS SDK文件添加到工程中
1. 將iOS SDK中的TencentOpenAPI.framewZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcmu6zVRlbmNlbnRPcGVuQXBpX0lPU19CdW5kbGUuYnVuZGxlzsS8/r+9sbS1vdOm08O/qreitcTEv8K8z8KhowrIu7rzvatUZW5jZW50T3BlbkFQSS5mcmFtZXdvcmu001NES7XEsaO05sS/wrzNz9entb25pLPMtby6vcrTzbyjqHByb2plY3QgbmF2aWdhdG9yo6nW0LXERnJhbWV3b3Jrc9DpxOLEv8K8z8Khowo8aW1nIHNyYz0="/uploadfile/Collfiles/20141126/20141126084353137.png" alt="\">
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.Framewor
k”、“libsqlite3.dylib”、“CoreTelephony.framework”、“libstdc++.dylib”、“libz.dylib”。
在Xcode中打開工程配置文件,選擇“summary”一欄。
4. 在“summary”中選擇“Linked Frameworks and Libraries”一欄,點擊“+”圖標。
5. 直接在默認庫文件中選擇後點擊“Add”添加“SystemConfiguration.framework”為例
6. 返回後看到“SystemConfiguration.framework”已經在“Linked Frameworks and Libraries”中出現。
7. 在Xcode中打開工程配置文件,選擇“Build Phases”一欄。
8. 修改必要的工程配置屬性。
在工程配置中的“Build Settings”一欄中找到“Linking”配置區,給“Other Linker Flags”配置項添加屬性值“-fobjc-arc”。
四,修改必要的代碼
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];
五,調用SDK登錄
1.登錄時,調用TencetnOAuth對象的authorize方法:
[_tencentOAuth authorize:_permissions inSafari:NO];
2. 登錄完成後,會調用TencentSessionDelegate中關於登錄的協議方法。
登錄成功:
@protocol TencentSessionDelegate
- (void)tencentDidLogin
{
_labelTitle.text = @"登錄完成";
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length])
{
// 記錄登錄用戶的OpenID、Token以及過期時間
_labelAccessToken.text = _tencentOAuth.accessToken;
}
else
{
_labelAccessToken.text = @"登錄不成功 沒有獲取accesstoken";
}
}
非網絡錯誤導致登錄失敗:
@protocol TencentSessionDelegate
-(void)tencentDidNotLogin:(BOOL)cancelled
{
if (cancelled)
{
_labelTitle.text = @"用戶取消登錄";
}
else
{
_labelTitle.text = @"登錄失敗";
}
}
網絡錯誤導致登錄失敗:
@protocol TencentSessionDelegate
-(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接口獲得該用戶的頭像、昵稱並顯示在界面上,使用戶體驗統一。