這幾天遇到一個(gè)需求:做第三方登錄和分享捞高。遇到了一些坑氯材,把整個(gè)過(guò)程整理記錄下來(lái),方便他人硝岗,同時(shí)也捋一下思路氢哮。
當(dāng)時(shí)考慮過(guò)把每個(gè)平臺(tái)的SDK下載下來(lái),一個(gè)一個(gè)弄型檀,一番取舍后決定還是用ShareSDK命浴。這里只做了微博、微信和QQ贱除。過(guò)程如下:
1.去ShareSDK官網(wǎng)注冊(cè)一個(gè)賬號(hào)方便以后對(duì)ShareSDK的配置生闲。
2.按照集成文檔的步驟開(kāi)始做,不得不說(shuō)這個(gè)集成文檔里面有坑月幌,有坑的地方我會(huì)指出碍讯。
3.添加一個(gè)應(yīng)用。有很多種方式可以添加一個(gè)應(yīng)用扯躺,多點(diǎn)點(diǎn)捉兴。這里我創(chuàng)建了一個(gè)test應(yīng)用蝎困。
創(chuàng)建后進(jìn)去的頁(yè)面如下:
這里的App Key和App Secret(不顯示的話,點(diǎn)擊顯示)很重要倍啥,可以用來(lái)初始化ShareSDK禾乘,
4.下載SDK。
這里是第一個(gè)坑虽缕,雖然你可以自定義下載SDK始藕,如果你做QQ分享和登錄,一定不要忘記下載QQ空間的SDK氮趋。因?yàn)镼Q本身不支持第三方登錄伍派,但支持第三方分享包括QQ空間分享,QQ空間支持第三方登錄剩胁,所以如果你做QQ分享和登錄诉植,一定要記得下載QQ空間的SDK。如果只做分享昵观,那只下載QQ的就行晾腔。這里我被坑過(guò),ShareSDK提供的文檔里面沒(méi)有說(shuō)明啊犬。
下載后的SDK文件目錄:
5.把下載的ShareSDK添加到項(xiàng)目中建车。
到現(xiàn)在為止運(yùn)行項(xiàng)目是會(huì)報(bào)錯(cuò)的,原因是沒(méi)有添加相關(guān)的依賴庫(kù)椒惨。
6.添加相關(guān)的依賴庫(kù)。
以下摘自ShareSDK提供的文檔潮罪。
必須添加的依賴庫(kù)如下:
SystemConfiguration.framework
QuartzCore.framework
CoreTelephony.framework
libicucore.dylib
libz.1.2.5.dylib
Security.framework
以下依賴庫(kù)根據(jù)社交平臺(tái)添加
新浪微博SDK依賴庫(kù) (從v2.10.5開(kāi)始)
ImageIO.framework
QQ好友和QQ空間SSO必要(新注冊(cè)騰訊開(kāi)放平臺(tái)帳號(hào)只支持SSO授權(quán)康谆,只是老開(kāi)發(fā)者才可以使用網(wǎng)頁(yè)授權(quán))
libstdc++.dylib
libsqlite3.dylib
添加相應(yīng)依賴庫(kù)后的項(xiàng)目結(jié)構(gòu)是這個(gè)樣子的:
到這里運(yùn)行項(xiàng)目是不會(huì)報(bào)錯(cuò)的,如果報(bào)錯(cuò)嫉到,檢查添加的依賴庫(kù)是缺了沃暗、漏了、還是錯(cuò)了何恶。
在AppDelegate.m
中添加以下頭文件孽锥,再運(yùn)行項(xiàng)目看看,這是不會(huì)報(bào)錯(cuò)的细层,如果報(bào)錯(cuò)看提示信息惜辑,多搜索,相信是能夠解決的疫赎。
#import <ShareSDK/ShareSDK.h>
#import <TencentOpenAPI/QQApiInterface.h>
#import <TencentOpenAPI/TencentOAuth.h>
#import "WXApi.h"
#import "WeiboSDK.h"
7.到相應(yīng)開(kāi)發(fā)者平臺(tái)注冊(cè)開(kāi)發(fā)者賬號(hào)盛撑,并添加你要進(jìn)行分享和使用第三方登錄應(yīng)用的信息。
添加新浪微博應(yīng)用 注冊(cè)網(wǎng)址 http://open.weibo.com
添加QQ應(yīng)用 注冊(cè)網(wǎng)址 http://mobile.qq.com/api/
添加微信應(yīng)用 http://open.weixin.qq.com
注意:這三家的開(kāi)放平臺(tái)捧搞,目前為止抵卫,頁(yè)面做的都跟山寨網(wǎng)站似的(微信的好一點(diǎn))狮荔,奇卡無(wú)比。當(dāng)然這不是吐槽的重點(diǎn)介粘,重點(diǎn)是注冊(cè)流程繁瑣殖氏,還要認(rèn)證開(kāi)發(fā)者身份,需要等一個(gè)工作日姻采。其中如果做微信登錄的話雅采,每年要交300元的什么費(fèi)。這里沒(méi)有什么難度就是個(gè)體力活偎谁,就不詳說(shuō)了总滩,有什么疑問(wèn),請(qǐng)留言巡雨,你的留言也是對(duì)我的信任和支持闰渔。
注冊(cè)完,申請(qǐng)完就可以拿到AppID铐望、AppSecret冈涧、AppKey等東西。
注:QQ的AppKey在ShareSDK中叫AppSecret正蛙。名字不統(tǒng)一督弓,這個(gè)比較扯淡。
拿到這些AppID乒验、AppSecret愚隧、AppKey等東西后就可以開(kāi)始對(duì)ShareSDK進(jìn)行初始化。
在AppDelegate.m
中添加下面這個(gè)方法锻全,并記得在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中調(diào)用狂塘。
- (void)initShareSDK {
[ShareSDK registerApp:@"884a1b86xxxx"];
//對(duì)新浪微博SDK進(jìn)行初始化
[ShareSDK connectSinaWeiboWithAppKey:@"406116xxxx"
appSecret:@"b6a542582057e39a6fca582b14dxxxxxx"
redirectUri:@"http://www.xxxx.com"];
//注這里的redirectUri要與你在新浪微博開(kāi)放平臺(tái)上填寫的那個(gè)授權(quán)回調(diào)頁(yè)的URL保持一致,否則在使用微博登錄的時(shí)候會(huì)報(bào)一個(gè)redirectUri找不到的錯(cuò)誤鳄厌,這里是一個(gè)坑荞胡。
//突然發(fā)現(xiàn)這里redirectUri是什么鬼?難道ShareSDK的制作者敲錯(cuò)了了嚎?不應(yīng)該是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參數(shù),是你在QQ開(kāi)放平臺(tái)是拿到的AppKey
//對(duì)微信SDK進(jìn)行初始化
[ShareSDK connectWeChatWithAppId:@"wx02e84c8fa45xxxx"
appSecret:@"ef9006286ce2637caeb648cb58dxxxx"
wechatCls:[WXApi class]];
}
8.添加URL Schemes歪泳。
點(diǎn)擊:項(xiàng)目名 > TARGETS > info > URL Types 點(diǎn)擊添加URL Types萝勤。
如圖:
在URL Schemes后面的框里添上對(duì)應(yīng)信息。
新浪微博的URL Schemes是:wb 加上在微博開(kāi)放平臺(tái)申請(qǐng)的AppKey呐伞。
微信的URL Schemes是:微信開(kāi)放平臺(tái)申請(qǐng)的AppID纵刘。
QQ空間的URL Schemes是:QQ開(kāi)放平臺(tái)申請(qǐng)的 tencent 加上 AppID。(如果只做分享的話荸哟,可以不添加假哎,做登錄的話必須添加)
QQ的URL Schemes是:QQ 加上 AppID的16進(jìn)制(如果AppID轉(zhuǎn)換的16進(jìn)制數(shù)不夠8位則在前面補(bǔ)0瞬捕,如轉(zhuǎn)換的是:5FB8B52,則最終填入為:QQ05FB8B52 注意:轉(zhuǎn)換后的字母要大寫)
轉(zhuǎn)換16進(jìn)制的方法:echo 'ibase=10;obase=16;801312852'|bc
舵抹,其中801312852為QQ的AppID肪虎,見(jiàn)下圖:
添加完URL Schemes后,在AppDelegate.m
文件中添加以下對(duì)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];
}
到此第三方的準(zhǔn)備工作就算是做完了惧蛹。
9.寫分享的代碼扇救。
(1)在界面上添加按鈕,并綁定響應(yīng)事件香嗓。
(2)寫事件處理代碼迅腔。
事件處理代碼,如下:
- (void)thridPartyShareWithShareType:(ShareType)shareType {
//只需要在響應(yīng)分享按鈕的方法中添加以下代碼即可
NSString *img = [[NSBundle mainBundle] pathForResource:@"mm" ofType:@"png"];
//構(gòu)造分享內(nèi)容
id<ISSContent> publishContent = [ShareSDK content:@"ShareSDK無(wú)比強(qiáng)大哦"
defaultContent:@""
image:[ShareSDK imageWithPath:img]
title:@"演示Demo中的標(biāo)題"
url:@"http://www.mob.com"
description:@"測(cè)試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", @"發(fā)表成功"));
}
else if (state == SSPublishContentStateFail)
{
NSLog(NSLocalizedString(@"TEXT_SHARE_FAI", @"發(fā)布失敗!error code == %d, error code == %@"), [error errorCode], [error errorDescription]);
}
}];
}
方法中的shareType
參數(shù)傳什么值就分享到什么平臺(tái):
ShareTypeSinaWeibo //新浪微博
ShareTypeQQSpace //QQ空間 (注意:填寫這個(gè)類型就可以分享到好友和QQ空間沧烈,也可以用來(lái)做登錄)
ShareTypeWeixiSession //微信好友 (這個(gè)類型也可以用來(lái)做微信登錄)
ShareTypeWeixiTimeline //微信朋友圈
到這里分享就算是做好了。
</br>
10.寫登錄代碼像云。(這里在ShareSDK的文檔里锌雀,又有一個(gè)坑)
(1)在ShareSDK做第三方登錄的文檔里,這里要求去一個(gè)Parse的網(wǎng)站注冊(cè)下載一大堆東西迅诬。并添加一堆依賴庫(kù)腋逆,可這些并沒(méi)有什么卵用。理由如下:
它讓在應(yīng)用了集成Parse侈贷,就是做一個(gè)對(duì)第三方平臺(tái)返回的信息(id惩歉、nickname、profileImage)進(jìn)行存儲(chǔ)俏蛮,可這些撑蚌,我們都是存自己公司服務(wù)器的,做這些都是扯淡的嫁蛇,但文檔里并沒(méi)有說(shuō)明。我靠露该,讓我郁悶半天睬棚。
(2)在界面添加按鈕,并綁定響應(yīng)事件解幼。
(3)寫響應(yīng)代碼(以QQ登錄為例抑党,三個(gè)平臺(tái)的代碼是一樣的,不同點(diǎn)在Type這個(gè)參數(shù)上)撵摆。
- (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里面的值做處理底靠,存服務(wù)器或者什么的
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Hello"
message:@"歡迎注冊(cè)"
delegate:nil
cancelButtonTitle:@"知道了"
otherButtonTitles: nil];
[alertView show];
} else {
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Hello"
message:@"歡迎回來(lái)"
delegate:nil
cancelButtonTitle:@"知道了"
otherButtonTitles:nil];
[alertView show];
}
}];
}
到這里第三方登錄就算是做好了。</br>
最后特铝,退出登錄授權(quán)使用一下代碼暑中。
[ShareSDK cancelAuthWithType:ShareTypeQQSpace]; //這里以QQ為例了
總結(jié)壹瘟,整個(gè)過(guò)程來(lái)看是沒(méi)有什么技術(shù)含量的,但讓人感到困難的原因就是這些平臺(tái)提供的文檔問(wèn)題鳄逾,不清晰稻轨,不說(shuō)明是干什么的,浪費(fèi)很多時(shí)間去理解這些文檔雕凹。我強(qiáng)壓怒火的在心中喊一句:操殴俱。然后接著埋頭寫代碼了。
下篇見(jiàn)~