使用ShareSDK完成第三方(QQ、微信、微博)登陸和分享

這幾天遇到一個需求:作第三方登陸和分享。遇到了一些坑,把整個過程整理記錄下來,方便他人,同時也捋一下思路。css

當時考慮過把每一個平臺的SDK下載下來,一個一個弄,一番取捨後決定仍是用ShareSDK。這裏只作了微博、微信和QQ。過程以下:c++

1.去ShareSDK官網註冊一個帳號方便之後對ShareSDK的配置。sql

2.按照集成文檔的步驟開始作,不得不說這個集成文檔裏面有坑,有坑的地方我會指出。api


文檔中心

3.添加一個應用。有不少種方式能夠添加一個應用,多點點。這裏我建立了一個test應用。服務器


添加應用

建立後進去的頁面以下:微信


應用概況

這裏的App Key和App Secret(不顯示的話,點擊顯示)很重要,能夠用來初始化ShareSDK,app

4.下載SDK。測試


下載SDK

這裏是第一個坑,雖然你能夠自定義下載SDK,若是你作QQ分享和登陸,必定不要忘記下載QQ空間的SDK。由於QQ自己不支持第三方登陸,但支持第三方分享包括QQ空間分享,QQ空間支持第三方登陸,因此若是你作QQ分享和登陸,必定要記得下載QQ空間的SDK。若是隻作分享,那隻下載QQ的就行。這裏我被坑過,ShareSDK提供的文檔裏面沒有說明。網站


自定義下載SDK

下載後的SDK文件目錄:ui


下載後的SDK文件目錄

5.把下載的ShareSDK添加到項目中。


項目中的ShareSDK

到如今爲止運行項目是會報錯的,緣由是沒有添加相關的依賴庫。

6.添加相關的依賴庫。

如下摘自ShareSDK提供的文檔。

必須添加的依賴庫以下:

SystemConfiguration.framework QuartzCore.framework CoreTelephony.framework libicucore.dylib libz.1.2.5.dylib Security.framework

如下依賴庫根據社交平臺添加
新浪微博SDK依賴庫 (從v2.10.5開始)

ImageIO.framework

QQ好友和QQ空間SSO必要(新註冊騰訊開放平臺賬號只支持SSO受權,只是老開發者纔可使用網頁受權)

libstdc++.dylib libsqlite3.dylib

添加相應依賴庫後的項目結構是這個樣子的:


添加相應依賴庫後項目結構
到這裏運行項目是不會報錯的,若是報錯,檢查添加的依賴庫是缺了、漏了、仍是錯了。

AppDelegate.m中添加如下頭文件,再運行項目看看,這是不會報錯的,若是報錯看提示信息,多搜索,相信是可以解決的。

#import <ShareSDK/ShareSDK.h> #import <TencentOpenAPI/QQApiInterface.h> #import <TencentOpenAPI/TencentOAuth.h> #import "WXApi.h" #import "WeiboSDK.h"

7.到相應開發者平臺註冊開發者帳號,並添加你要進行分享和使用第三方登陸應用的信息。

添加新浪微博應用 註冊網址 http://open.weibo.com
添加QQ應用 註冊網址  http://mobile.qq.com/api/
添加微信應用  http://open.weixin.qq.com

注意:這三家的開放平臺,目前爲止,頁面作的都跟山寨網站似的(微信的好一點),奇卡無比。固然這不是吐槽的重點,重點是註冊流程繁瑣,還要認證開發者身份,須要等一個工做日。其中若是作微信登陸的話,每一年要交300元的什麼費。這裏沒有什麼難度就是個體力活,就不詳說了,有什麼疑問,請留言,你的留言也是對個人信任和支持。

註冊完,申請完就能夠拿到AppID、AppSecret、AppKey等東西。


微博的

QQ的

微信的

注:QQ的AppKey在ShareSDK中叫AppSecret。名字不統一,這個比較扯淡。

拿到這些AppID、AppSecret、AppKey等東西后就能夠開始對ShareSDK進行初始化。

AppDelegate.m中添加下面這個方法,並記得在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中調用。

- (void)initShareSDK { [ShareSDK registerApp:@"884a1b86xxxx"]; //對新浪微博SDK進行初始化 [ShareSDK connectSinaWeiboWithAppKey:@"406116xxxx"  appSecret:@"b6a542582057e39a6fca582b14dxxxxxx"  redirectUri:@"http://www.xxxx.com"]; //注這裏的redirectUri要與你在新浪微博開放平臺上填寫的那個受權回調頁的URL保持一致,不然在使用微博登陸的時候會報一個redirectUri找不到的錯誤,這裏是一個坑。 //忽然發現這裏redirectUri是什麼鬼?難道ShareSDK的製做者敲錯了?不該該是URL嗎? //QQ分享SDK初始化 [ShareSDK connectQQWithQZoneAppKey:@"110467xxxx"  qqApiInterfaceCls:[QQApiInterface class]  tencentOAuthCls:[TencentOAuth class]]; //QQ登陸SDK初始化 [ShareSDK connectQZoneWithAppKey:@"1104677455"  appSecret:@"KnjAB2I0G8Vxxxxx"  qqApiInterfaceCls:[QQApiInterface class]  tencentOAuthCls:[TencentOAuth class]]; // 注:QQ登陸的appSecret參數,是你在QQ開放平臺是拿到的AppKey //對微信SDK進行初始化 [ShareSDK connectWeChatWithAppId:@"wx02e84c8fa45xxxx"  appSecret:@"ef9006286ce2637caeb648cb58dxxxx"  wechatCls:[WXApi class]]; }

8.添加URL Schemes。
點擊:項目名 > TARGETS > info > URL Types 點擊添加URL Types。
如圖:


添加URL Schemes

在URL Schemes後面的框裏添上對應信息。

新浪微博的URL Schemes是:wb 加上在微博開放平臺申請的AppKey。
微信的URL Schemes是:微信開放平臺申請的AppID。
QQ空間的URL Schemes是:QQ開放平臺申請的 tencent 加上 AppID。(若是隻作分享的話,能夠不添加,作登陸的話必須添加)
QQ的URL Schemes是:QQ 加上 AppID的16進制(若是AppID轉換的16進制數不夠8位則在前面補0,如轉換的是:5FB8B52,則最終填入爲:QQ05FB8B52 注意:轉換後的字母要大寫)

轉換16進制的方法:echo 'ibase=10;obase=16;801312852'|bc,其中801312852爲QQ的AppID,見下圖:


QQ URLSchemes

添加完URL Schemes後,在AppDelegate.m文件中添加如下對URL處理的代碼:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [ShareSDK handleOpenURL:url wxDelegate:self]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [ShareSDK handleOpenURL:url sourceApplication:sourceApplication annotation:annotation wxDelegate:self]; }

到此第三方的準備工做就算是作完了。

9.寫分享的代碼。

(1)在界面上添加按鈕,並綁定響應事件。
(2)寫事件處理代碼。

事件處理代碼,以下:

- (void)thridPartyShareWithShareType:(ShareType)shareType { //只須要在響應分享按鈕的方法中添加如下代碼便可 NSString *img = [[NSBundle mainBundle] pathForResource:@"mm" ofType:@"png"]; //構造分享內容 id<ISSContent> publishContent = [ShareSDK content:@"ShareSDK無比強大哦" defaultContent:@"" image:[ShareSDK imageWithPath:img] title:@"演示Demo中的標題" url:@"http://www.mob.com" description:@"測試DEMO正在製做中,歡迎你們觀看" mediaType:SSPublishContentMediaTypeNews]; [ShareSDK shareContent:publishContent type:shareType authOptions:nil shareOptions:nil statusBarTips:YES result:^(ShareType type, SSResponseState state, id<ISSPlatformShareInfo> statusInfo, id<ICMErrorInfo> error, BOOL end) { if (state == SSPublishContentStateSuccess) { NSLog(NSLocalizedString(@"TEXT_SHARE_SUC", @"發表成功")); } else if (state == SSPublishContentStateFail) { NSLog(NSLocalizedString(@"TEXT_SHARE_FAI", @"發佈失敗!error code == %d, error code == %@"), [error errorCode], [error errorDescription]); } }]; }

方法中的shareType參數傳什麼值就分享到什麼平臺:

ShareTypeSinaWeibo            //新浪微博 ShareTypeQQSpace //QQ空間 (注意:填寫這個類型就能夠分享到好友和QQ空間,也能夠用來作登陸) ShareTypeWeixiSession //微信好友 (這個類型也能夠用來作微信登陸) ShareTypeWeixiTimeline //微信朋友圈
到這裏分享就算是作好了。


10.寫登陸代碼。(這裏在ShareSDK的文檔裏,又有一個坑)
(1)在ShareSDK作第三方登陸的文檔裏,這裏要求去一個Parse的網站註冊下載一大堆東西。並添加一堆依賴庫,可這些並無什麼卵用。理由以下:

它讓在應用了集成Parse,就是作一個對第三方平臺返回的信息(id、nickname、profileImage)進行存儲,可這些,咱們都是存本身公司服務器的,作這些都是扯淡的,但文檔裏並無說明。我靠,讓我鬱悶半天。

(2)在界面添加按鈕,並綁定響應事件。
(3)寫響應代碼(以QQ登陸爲例,三個平臺的代碼是同樣的,不一樣點在Type這個參數上)。

- (IBAction)QQLogin:(UIButton *)sender { [ShareSDK getUserInfoWithType:ShareTypeQQSpace authOptions:nil result:^(BOOL result, id<ISSPlatformUser> userInfo, id<ICMErrorInfo> error) { if (result) { NSLog(@"%hhd", result); NSLog(@"%@", [userInfo uid]); NSLog(@"%@", [userInfo nickname]); NSLog(@"%@", [userInfo profileImage]); //在這裏把拿到的userInfo裏面的值作處理,存服務器或者什麼的 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"歡迎註冊" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles: nil]; [alertView show]; } else { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"歡迎回來" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles:nil]; [alertView show]; } }]; }

到這裏第三方登陸就算是作好了。
最後,退出登陸受權使用一下代碼。

[ShareSDK cancelAuthWithType:ShareTypeQQSpace]; //這裏以QQ爲例了
相關文章
相關標籤/搜索