使用ShareSDK完成第三方(QQ、微信、微博)登入和分享
這幾天遇到一個需求:做第三方登入和分享。遇到了一些坑,把整個過程整理記錄下來,方便他人,同時也捋一下思路。
當時考慮過把每個平臺的SDK下載下來,一個一個弄,一番取捨後決定還是用ShareSDK。這裡只做了微博、微信和QQ。過程如下:
1.去ShareSDK官網註冊一個賬號方便以後對ShareSDK的配置。
2.按照整合文件的步驟開始做,不得不說這個整合文件裡面有坑,有坑的地方我會指出。
文件中心
3.新增一個應用。有很多種方式可以新增一個應用,多點點。這裡我建立了一個test應用。
新增應用
建立後進去的頁面如下:
應用概況
這裡的App Key和App Secret(不顯示的話,點選顯示)很重要,可以用來初始化ShareSDK,
4.下載SDK。
下載SDK
這裡是第一個坑,雖然你可以自定義下載SDK,如果你做QQ分享和登入,一定不要忘記下載QQ空間的SDK。因為QQ本身不支援第三方登入,但支援第三方分享包括QQ空間分享,QQ空間支援第三方登入,所以如果你做QQ分享和登入,一定要記得下載QQ空間的SDK。如果只做分享,那隻下載QQ的就行。這裡我被坑過,ShareSDK提供的文件裡面沒有說明。
自定義下載SDK
下載後的SDK檔案目錄:
下載後的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.到相應開發者平臺註冊開發者賬號,並新增你要進行分享和使用第三方登入應用的資訊。
注意:這三家的開放平臺,目前為止,頁面做的都跟山寨網站似的(微信的好一點),奇卡無比。當然這不是吐槽的重點,重點是註冊流程繁瑣,還要認證開發者身份,需要等一個工作日。其中如果做微信登入的話,每年要交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為例了