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

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

當(dāng)時(shí)考慮過把每個(gè)平臺(tái)的SDK下載下來,一個(gè)一個(gè)弄,一番取舍后決定還是用ShareSDK。這里只做了微博、微信和QQ。過程如下:

1.去ShareSDK官網(wǎng)注冊(cè)一個(gè)賬號(hào)方便以后對(duì)ShareSDK的配置。

2.按照集成文檔的步驟開始做,不得不說這個(gè)集成文檔里面有坑,有坑的地方我會(huì)指出。

文檔中心

3.添加一個(gè)應(yīng)用。有很多種方式可以添加一個(gè)應(yīng)用,多點(diǎn)點(diǎn)。這里我創(chuàng)建了一個(gè)test應(yīng)用。

添加應(yīng)用

創(chuàng)建后進(jìn)去的頁面如下:

應(yīng)用概況

這里的App Key和App Secret(不顯示的話,點(diǎn)擊顯示)很重要,可以用來初始化ShareSDK,

4.下載SDK。

下載SDK

這里是第一個(gè)坑,雖然你可以自定義下載SDK,如果你做QQ分享和登錄,一定不要忘記下載QQ空間的SDK。因?yàn)镼Q本身不支持第三方登錄,但支持第三方分享包括QQ空間分享,QQ空間支持第三方登錄,所以如果你做QQ分享和登錄,一定要記得下載QQ空間的SDK。如果只做分享,那只下載QQ的就行。這里我被坑過,ShareSDK提供的文檔里面沒有說明。

自定義下載SDK

下載后的SDK文件目錄:

下載后的SDK文件目錄

5.把下載的ShareSDK添加到項(xiàng)目中。

項(xiàng)目中的ShareSDK

到現(xiàn)在為止運(yùn)行項(xiàng)目是會(huì)報(bào)錯(cuò)的,原因是沒有添加相關(guān)的依賴庫。

6.添加相關(guān)的依賴庫。

以下摘自ShareSDK提供的文檔。

必須添加的依賴庫如下:

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

以下依賴庫根據(jù)社交平臺(tái)添加
新浪微博SDK依賴庫 (從v2.10.5開始)

 ImageIO.framework

QQ好友和QQ空間SSO必要(新注冊(cè)騰訊開放平臺(tái)帳號(hào)只支持SSO授權(quán),只是老開發(fā)者才可以使用網(wǎng)頁授權(quán))

libstdc++.dylib
libsqlite3.dylib

添加相應(yīng)依賴庫后的項(xiàng)目結(jié)構(gòu)是這個(gè)樣子的:

添加相應(yīng)依賴庫后項(xiàng)目結(jié)構(gòu)
到這里運(yùn)行項(xiàng)目是不會(huì)報(bào)錯(cuò)的,如果報(bào)錯(cuò),檢查添加的依賴庫是缺了、漏了、還是錯(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)開發(fā)者平臺(tái)注冊(cè)開發(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

注意:這三家的開放平臺(tái),目前為止,頁面做的都跟山寨網(wǎng)站似的(微信的好一點(diǎn)),奇卡無比。當(dāng)然這不是吐槽的重點(diǎn),重點(diǎn)是注冊(cè)流程繁瑣,還要認(rèn)證開發(fā)者身份,需要等一個(gè)工作日。其中如果做微信登錄的話,每年要交300元的什么費(fèi)。這里沒有什么難度就是個(gè)體力活,就不詳說了,有什么疑問,請(qǐng)留言,你的留言也是對(duì)我的信任和支持。

注冊(cè)完,申請(qǐng)完就可以拿到AppID、AppSecret、AppKey等東西。

微博的
QQ的
微信的

注:QQ的AppKey在ShareSDK中叫AppSecret。名字不統(tǒng)一,這個(gè)比較扯淡。

拿到這些AppID、AppSecret、AppKey等東西后就可以開始對(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要與你在新浪微博開放平臺(tái)上填寫的那個(gè)授權(quán)回調(diào)頁的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開放平臺(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

在URL Schemes后面的框里添上對(duì)應(yīng)信息。

新浪微博的URL Schemes是:wb 加上在微博開放平臺(tái)申請(qǐng)的AppKey。
微信的URL Schemes是:微信開放平臺(tái)申請(qǐng)的AppID。
QQ空間的URL Schemes是:QQ開放平臺(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,見下圖:

QQ URLSchemes

添加完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無比強(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空間,也可以用來做登錄)
ShareTypeWeixiSession         //微信好友 (這個(gè)類型也可以用來做微信登錄)
ShareTypeWeixiTimeline        //微信朋友圈
到這里分享就算是做好了。

</br>
10.寫登錄代碼。(這里在ShareSDK的文檔里,又有一個(gè)坑
(1)在ShareSDK做第三方登錄的文檔里,這里要求去一個(gè)Parse的網(wǎng)站注冊(cè)下載一大堆東西。并添加一堆依賴庫,可這些并沒有什么卵用。理由如下:

它讓在應(yīng)用了集成Parse,就是做一個(gè)對(duì)第三方平臺(tái)返回的信息(id、nickname、profileImage)進(jìn)行存儲(chǔ),可這些,我們都是存自己公司服務(wù)器的,做這些都是扯淡的,但文檔里并沒有說明。我靠,讓我郁悶半天。

(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:@"歡迎回來"
                                  delegate:nil
                                  cancelButtonTitle:@"知道了"
                                  otherButtonTitles:nil];
            [alertView show];
        }
    }];
}

到這里第三方登錄就算是做好了。</br>
最后,退出登錄授權(quán)使用一下代碼。

[ShareSDK cancelAuthWithType:ShareTypeQQSpace]; //這里以QQ為例了
總結(jié),整個(gè)過程來看是沒有什么技術(shù)含量的,但讓人感到困難的原因就是這些平臺(tái)提供的文檔問題,不清晰,不說明是干什么的,浪費(fèi)很多時(shí)間去理解這些文檔。我強(qiáng)壓怒火的在心中喊一句:操。然后接著埋頭寫代碼了。



下篇見~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,566評(píng)論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,303評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,683評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,899評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,135評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評(píng)論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,528評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,844評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容