ios-第三方登錄和分享總結(jié)

對于第三方登錄和分享,當(dāng)我們做熟了就會發(fā)現(xiàn)三種登錄和分享的方式都是大同小異,流程基本上也一樣,只要我們掌握其中的一種,其他的只需要看看文檔就會很快做完,下面我們就先介紹微信.

一 微信

1.1微信登錄

具體iOS微信集成指南點(diǎn)擊查看iOS指南

1.1.1 申請賬號

向微信的開放平臺申請開發(fā)賬號點(diǎn)擊打開連接申請

1.1.2下載微信SDK

SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三個留潦。

如選用手動集成峦睡,請前往資源下載頁下載最新SDK包

sdk文件預(yù)覽.png

1.1.3環(huán)境搭建

1.新建工程,將sdk全部拖進(jìn)去.

工程導(dǎo)入

2.微信開放平臺新增了微信模塊用戶統(tǒng)計功能,便于開發(fā)者統(tǒng)計微信功能模塊的用戶使用和活躍情況嘉抒。開發(fā)者需要在工程中鏈接上:SystemConfiguration.framework, libz.dylib, libsqlite3.0.dylib, libc++.dylib, Security.framework, CoreTelephony.framework, CFNetwork.framework零聚。

3.在你的工程文件中選擇Build Setting,在"Other Linker Flags"中加入"-Objc -all_load"众眨,在Search Paths中添加 libWeChatSDK.a 握牧,WXApi.h,WXApiObject.h

QQ20180110-143356.png

4.在Xcode中娩梨,選擇你的工程設(shè)置項(xiàng)沿腰,選中“TARGETS”一欄,在“info”標(biāo)簽欄的“URL type“添加“URL scheme”為你所注冊的應(yīng)用程序id

QQ20180110-143650.png

5.在Xcode中狈定,選擇你的工程設(shè)置項(xiàng)颂龙,選中“TARGETS”一欄,在“info”標(biāo)簽欄的“LSApplicationQueriesSchemes“添加微信的白名單,主要是為了手機(jī)端進(jìn)行登錄可以直接進(jìn)入微信客戶端中

QQ20180110-143954.png

這塊我把所有需要添加的白名單都添加了,基本上是比較全的,項(xiàng)目中有需要用的的可以直接復(fù)制進(jìn)去

1.1.3代碼實(shí)現(xiàn)

這里的代碼可能跟微信官方下載下來的demo中的代碼位置有區(qū)別,是因?yàn)槲疫@邊做了一些小的封裝,但調(diào)用的方法沒有變(我這邊只把實(shí)現(xiàn)的流程展示出來,具體代碼可以參考我的demo或者官方demo)

1.要使你的程序啟動后微信終端能響應(yīng)你的程序纽什,必須在代碼中向微信終端注冊你的id,在AppDelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中注冊微信

需要導(dǎo)頭文件

#import"WXApi.h"#import"WXApiObject.h"

//向微信注冊-(BOOL)WXRegister{return[WXApi registerApp:KWXAPPID];}

2.重寫AppDelegate的handleOpenURL和openURL方法(后面寫的QQ,和微博一樣的處理):

- (BOOL)applicationOpenURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{

if([KTencentSchema isEqualToString:[url scheme]]) {

//QQreturn[TencentOAuth HandleOpenURL:url];? ? ? ? ? ?

?}elseif([KTencentURLSchema isEqualToString:[url scheme]]) {

//QQreturn[QQApiInterface handleOpenURL:url delegate:self.qqUtils]; ? ?

? ? ? ? }elseif([KWXURLSchema isEqualToString:[url scheme]]) {

//微信return[WXApi handleOpenURL:url delegate:self.wxUtils];? ? ?

?? ? ? }elseif([KWBURLSchema isEqualToString:[url scheme]]){

//微博return[WeiboSDK handleOpenURL:url delegate:self.wbUtils];? ?

?}returnNO;

}

- (BOOL)applicationHandleOpenURL:(NSURL*)url {

if([KTencentSchema isEqualToString:[url scheme]]) {

//QQreturn[TencentOAuth HandleOpenURL:url];? ? ? ? ? ?

?}elseif([KTencentURLSchema isEqualToString:[url scheme]]) {

//QQreturn[QQApiInterface handleOpenURL:url delegate:self.qqUtils];? ? ??

? ? ? }elseif([KWXURLSchema isEqualToString:[url scheme]]) {

//微信return[WXApi handleOpenURL:url delegate:self.wxUtils];? ? ??

? ? ? }elseif([KWBURLSchema isEqualToString:[url scheme]]){

//微博return[WeiboSDK handleOpenURL:url delegate:self.wbUtils];

? ? }returnNO;

}

3.你的程序要實(shí)現(xiàn)和微信終端交互的具體請求與回應(yīng)措嵌,因此需要實(shí)現(xiàn)WXApiDelegate協(xié)議的兩個方法:

#pragma mark- WXApiDelegate/*!@brief收到一個來自微信的請求,第三方應(yīng)用程序處理完后調(diào)用sendResp向微信發(fā)送結(jié)果 * * 收到一個來自微信的請求芦缰,異步處理完成后必須調(diào)用sendResp發(fā)送處理結(jié)果給微信企巢。 * 可能收到的請求有GetMessageFromWXReq、ShowMessageFromWXReq等让蕾。 *@paramreq 具體請求內(nèi)容浪规,是自動釋放的 */

-(void) onReq:(BaseReq*)req{

if([req isKindOfClass:[GetMessageFromWXReqclass]]){

//微信終端向第三方程序請求提供內(nèi)容的消息結(jié)構(gòu)體

if(self.wxDelegate? ? ? ? ? ? && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvGetMessageReq:)]) {? ? ? ? ?

?? GetMessageFromWXReq *getMessageReq = (GetMessageFromWXReq *)req;? ? ? ? ?

?? [self.wxDelegate WXApiUtilsDidRecvGetMessageReq:getMessageReq];? ? ??

? }??

? }elseif([req isKindOfClass:[ShowMessageFromWXReqclass]]){

//微信通知第三方程序或听,要求第三方程序顯示的消息結(jié)構(gòu)體

if(self.wxDelegate? ? ? ? ? ? && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvShowMessageReq:)]) {? ??

? ? ? ? ShowMessageFromWXReq *showMessageReq = (ShowMessageFromWXReq *)req;? ? ? ??

? ? [self.wxDelegate WXApiUtilsDidRecvShowMessageReq:showMessageReq];? ? ??

? }?

?? }elseif([req isKindOfClass:[LaunchFromWXReqclass]]){

//微信終端打開第三方程序攜帶的消息結(jié)構(gòu)體

if(self.wxDelegate? ? ? ? ? ? && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvLaunchFromWXReq:)]) {? ?

?? ? ? ? LaunchFromWXReq *launchReq = (LaunchFromWXReq *)req;? ? ? ?

?? ? [self.wxDelegate WXApiUtilsDidRecvLaunchFromWXReq:launchReq];? ? ?

?? }??

? }

}

/*!@brief發(fā)送一個sendReq后,收到微信的回應(yīng) * * 收到一個來自微信的處理結(jié)果笋婿。調(diào)用一次sendReq后會收到onResp誉裆。 * 可能收到的處理結(jié)果有SendMessageToWXResp、SendAuthResp等缸濒。 *@paramresp具體的回應(yīng)內(nèi)容足丢,是自動釋放的 */

-(void) onResp:(BaseResp*)resp{if([resp isKindOfClass: [PayRespclass]]){

//支付結(jié)果if(self.wxDelegate? ? ? ? ? ? && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvPayResponse:)]) {? ? ??

? ? ? PayResp *payResp = (PayResp *)resp;? ? ? ? ?

?? [self.wxDelegate WXApiUtilsDidRecvPayResponse:payResp];? ? ??

? }?

?? }elseif([resp isKindOfClass:[SendMessageToWXRespclass]]){

//第三方程序向微信終端發(fā)送SendMessageToWXReq后,微信發(fā)送回來的處理結(jié)果庇配,該結(jié)果用SendMessageToWXResp表示斩跌。

if(self.wxDelegate? ? ? ? ? ? && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvMessageResponse:)]) {? ??

? ? ? ? SendMessageToWXResp *messageResp = (SendMessageToWXResp *)resp;? ? ??

? ? ? [self.wxDelegate WXApiUtilsDidRecvMessageResponse:messageResp];? ? ??

? }? ?

?}elseif([resp isKindOfClass:[SendAuthRespclass]]){

//微信處理完第三方程序的認(rèn)證和權(quán)限申請后向第三方程序回送的處理結(jié)果

if(self.wxDelegate? ? ? ? ? ? && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvAuthResponse:)]) {? ? ?

?? ? ? SendAuthResp *authResp = (SendAuthResp *)resp;? ? ? ?

?? ? [self.wxDelegate WXApiUtilsDidRecvAuthResponse:authResp];? ? ??

? }? ?

?}elseif([resp isKindOfClass:[AddCardToWXCardPackageRespclass]]){

//微信返回第三方添加卡券結(jié)果if(self.wxDelegate? ? ? ? ? ? && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvAddCardResponse:)]) {?

?? ? ? ? ? AddCardToWXCardPackageResp *addCardResp = (AddCardToWXCardPackageResp *)resp;? ? ?

?? ? ? [self.wxDelegate WXApiUtilsDidRecvAddCardResponse:addCardResp];? ? ?

?? }??

? }

}


4.具體登錄調(diào)用

在登錄之前我們可以判斷用戶是否安裝微信客戶端

//是否安裝微信- (BOOL)isWXAppInstalled{return[WXApi isWXAppInstalled];}

然后再調(diào)用登錄方法

//登錄方法- (void)WXOauthLogin{? ? SendAuthReq* req = [[SendAuthReq alloc] init];? ? req.scope = @"snsapi_userinfo,snsapi_base";? ? req.state = @"0744";? ? [WXApi sendReq:req];? ? }

登錄成功會在-(void) onResp:(BaseResp*)resp方法中回調(diào)成功結(jié)果,可以獲取登錄用戶的信息

/**

* 登錄成功獲取用戶個人信息回調(diào)

*/

- (void)QQApiUtilsGetUserInfoResponse:(APIResponse*) response tencentOAuth:(TencentOAuth *)tencentOAut{

//獲取到QQ的用戶信息

NSLog(@"===%@",response.jsonResponse);

NSIntegergender =0;

if([response.jsonResponse[@"gender"] isEqualToString:@"男"]){? ??

? ? gender =1;? ? }NSMutableDictionary* params = [NSMutableDictionarydictionary];??

? [params setValue:tencentOAut.openId forKey:@"openid"];

//openid【必須】

[params setValue:[response.jsonResponse objectForKey:@"nickname"] forKey:@"nickName"];

//QQ昵稱【必須】

[params setValue:[response.jsonResponse objectForKey:@"figureurl_qq_2"] forKey:@"avatar"];

//頭像【必須】

[params setValue:gender ==1?@"男":@"女"forKey:@"sex"];

//性別【必須】

//登錄成功回調(diào)#warning 需要開發(fā)調(diào)用自己的登錄接口

[selfloginSuccess:params];}

獲取到用戶信息之后,我們可以根據(jù)自己公司的業(yè)務(wù)做后續(xù)處理

1.2微信分享(好友分享,朋友圈分享)

分享操作指南官方也有對應(yīng)的知道文檔微信分享操作指南

微信分享目前支持文字、圖片讨永、音樂滔驶、視頻、網(wǎng)頁共五種類型,這塊我主要寫了四種類型,基本上都一樣只是中間調(diào)用的類不一樣

分享的場景有兩種

發(fā)送到聊天界面——WXSceneSession

發(fā)送到朋友圈——WXSceneTimeline

1.2.1分享的幾種方式

1.網(wǎng)頁

//網(wǎng)頁類型分享

- (BOOL)sharedLinkToWeChat:(NSString*)title? ? ? ? ? ? ? ? ? description:(NSString*)description? ? ? ? ? ? ? ? ? ? detailUrl:(NSString*)detailUrl? ? ? ? ? ? ? ? ? ? ? ? image:(UIImage*)image? ? ? ? ? ? ? ? ? ? shareType:(WXShareSceneType)sharedType{

UIImage*compressedImage = [image imageWithFileSize:32*1024scaledToSize:CGSizeMake(300,300)];? ?

?WXMediaMessage *message = [WXMediaMessage message];? ??

? ? message.title = title;? ? ? ? message.description = description;? ?

?? ? [message setThumbImage:compressedImage];? ?

?? ? WXWebpageObject *webpageObject = [WXWebpageObject object];? ?

?? ? webpageObject.webpageUrl = detailUrl;? ? ? ??

message.mediaObject = webpageObject;? ? ??

? SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];? ?

?? ? req.bText=NO;? ? ? ??

req.message = message;? ??

? ? req.scene = (sharedType == WXShareSceneTypeTimeline? WXSceneTimeline:WXSceneSession);

BOOLsuccess = [WXApi sendReq:req];returnsuccess;}

2.圖片

//分享圖片

-(BOOL)shareImageToWeChat:(UIImage*)image? ? ? ? ? ? ? ? shareType:(WXShareSceneType)sharedType{

UIImage*compressedImage = [image imageWithFileSize:32*1024scaledToSize:CGSizeMake(300,300)];??

? WXMediaMessage *message = [WXMediaMessage message];?

?? [message setThumbImage:compressedImage];? ??

? ? WXImageObject *ext = [WXImageObject object];?

?? ext.imageData =UIImagePNGRepresentation(image);??

? message.mediaObject = ext;? ? ?

?? SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];? ??

req.bText =NO;? ??

req.message = message;?

?? req.scene = (sharedType == WXShareSceneTypeTimeline? WXSceneTimeline:WXSceneSession);

BOOLsuccess = [WXApi sendReq:req];returnsuccess;}

3.音樂類型

//音樂類型分享

- (BOOL)sharedMusicToWeChat:(NSString*)title? ? ? ? ? ? ? description:(NSString*)description? ? ? ? ? ? ? ? ? musicUrl:(NSString*)musicUrl? ? ? ? ? ? ? musicDataUrl:(NSString*)musicDataUrl? ? ? ? ? ? ? ? ? ? image:(UIImage*)image? ? ? ? ? ? ? ? shareType:(WXShareSceneType)sharedType{

UIImage*compressedImage = [image imageWithFileSize:32*1024scaledToSize:CGSizeMake(300,300)];? ? ?

?? WXMediaMessage *message = [WXMediaMessage message];

//標(biāo)題

message.title = title;

//描述

message.description = description;

//縮略圖

[message setThumbImage:compressedImage];? ? ?

?? WXMusicObject * musicObject = [WXMusicObject object];

//音樂的url

musicObject.musicUrl = musicUrl;

//低分辨率音頻

musicObject.musicLowBandUrl = musicUrl;

//音樂數(shù)據(jù)的url

musicObject.musicDataUrl = musicDataUrl;? ??

musicObject.musicLowBandDataUrl = musicDataUrl;? ??

message.mediaObject = musicObject;? ? ?

?? SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];? ?

?? ? req.bText=NO;? ? ?

?? req.message = message;? ?

?? ? req.scene = (sharedType == WXShareSceneTypeTimeline? WXSceneTimeline:WXSceneSession);

BOOLsuccess = [WXApi sendReq:req];returnsuccess;

}

4.視頻

//視頻類型分享

- (BOOL)sharedVideoToWeChat:(NSString*)title? ? ? ? ? ? ? ? description:(NSString*)description? ? ? ? ? ? ? ? ? videoUrl:(NSString*)videoUrl? ? ? ? ? ? ? ? ? ? ? image:(UIImage*)image? ? ? ? ? ? ? ? ? shareType:(WXShareSceneType)sharedType{

UIImage*compressedImage = [image imageWithFileSize:32*1024scaledToSize:CGSizeMake(300,300)];?

?? ? ? WXMediaMessage *message = [WXMediaMessage message];

//標(biāo)題

message.title = title;//描述message.description = description;

//縮略圖

[message setThumbImage:compressedImage];? ??

? ? WXVideoObject * videoObject = [WXVideoObject object];

//視頻的url

videoObject.videoUrl = videoUrl;??

? videoObject.videoLowBandUrl = videoUrl;? ?

?message.mediaObject = videoObject;? ? ?

?? SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];? ?

?? ? req.bText=NO;? ?

?? ? req.message = message;? ??

? ? req.scene = (sharedType == WXShareSceneTypeTimeline? WXSceneTimeline:WXSceneSession);

BOOL ?success = [WXApi sendReq:req];returnsuccess;}

1.2.2分享成功的回調(diào)

分享成功的回調(diào)也是在

-(void) onResp:(BaseResp*)resp方法中處理

-(void) onResp:(BaseResp*)resp{

if([resp isKindOfClass:[SendMessageToWXRespclass]]) {

//第三方程序向微信終端發(fā)送SendMessageToWXReq后卿闹,微信發(fā)送回來的處理結(jié)果揭糕,該結(jié)果用SendMessageToWXResp表示。

if(self.wxDelegate? ? ? ? ? ? && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvMessageResponse:)]) {? ? ?

?? ? ? SendMessageToWXResp *messageResp = (SendMessageToWXResp *)resp;? ? ? ??

? ? [self.wxDelegate WXApiUtilsDidRecvMessageResponse:messageResp];?

?? ? ? }??

? }?

}



以上就是微信登錄和分享的整個流程,具體代碼demo,也請大家繼續(xù)關(guān)注,后續(xù)會分享QQ的登錄和分享

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锻霎,一起剝皮案震驚了整個濱河市著角,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旋恼,老刑警劉巖吏口,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冰更,居然都是意外死亡产徊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蜀细,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舟铜,“玉大人,你說我怎么就攤上這事奠衔∽慌伲” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵归斤,是天一觀的道長痊夭。 經(jīng)常有香客問我,道長脏里,這世上最難降的妖魔是什么她我? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上番舆,老公的妹妹穿的比我還像新娘根吁。我一直安慰自己,他們只是感情好合蔽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著介返,像睡著了一般拴事。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圣蝎,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天刃宵,我揣著相機(jī)與錄音,去河邊找鬼徘公。 笑死牲证,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的关面。 我是一名探鬼主播坦袍,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼等太!你這毒婦竟也來了捂齐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤缩抡,失蹤者是張志新(化名)和其女友劉穎奠宜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞻想,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡压真,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蘑险。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滴肿。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漠其,靈堂內(nèi)的尸體忽然破棺而出嘴高,到底是詐尸還是另有隱情,我是刑警寧澤和屎,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布拴驮,位于F島的核電站,受9級特大地震影響柴信,放射性物質(zhì)發(fā)生泄漏套啤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望潜沦。 院中可真熱鬧萄涯,春花似錦、人聲如沸唆鸡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽争占。三九已至燃逻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臂痕,已是汗流浹背伯襟。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留握童,地道東北人姆怪。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像澡绩,于是被迫代替她去往敵國和親稽揭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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