iOS QQ登入 傻瓜式整合
一,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喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcmu6zVRlbmNlbnRPcGVuQXBpX0lPU19CdW5kbGUuYnVuZGxlzsS8/r+9sbS1vdOm08O/qreitcTEv8K8z8KhowrIu7rzvatUZW5jZW50T3BlbkFQSS5mcmFtZXdvcmu001NES7XEsaO05sS/wrzNz9entb25pLPMtby6vcrTzbyjqHByb2plY3QgbmF2aWdhdG9yo6nW0LXERnJhbWV3b3Jrc9DpxOLEv8K8z8Khowo8aW1nIHNyYz0="http://www.2cto.com/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.Framework”、“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介面獲得該使用者的頭像、暱稱並顯示在介面上,使使用者體驗統一。