ios-第三方登錄和分享總結

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

一 微信

1.1微信登錄

具體iOS微信集成指南點擊查看iOS指南

1.1.1 申請賬號

向微信的開放平臺申請開發賬號點擊打開連接申請

1.1.2下載微信SDK

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

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

sdk文件預覽.png

1.1.3環境搭建

1.新建工程,將sdk全部拖進去.

工程導入

2.微信開放平臺新增了微信模塊用戶統計功能,便于開發者統計微信功能模塊的用戶使用和活躍情況。開發者需要在工程中鏈接上: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中,選擇你的工程設置項,選中“TARGETS”一欄,在“info”標簽欄的“URL type“添加“URL scheme”為你所注冊的應用程序id

QQ20180110-143650.png

5.在Xcode中,選擇你的工程設置項,選中“TARGETS”一欄,在“info”標簽欄的“LSApplicationQueriesSchemes“添加微信的白名單,主要是為了手機端進行登錄可以直接進入微信客戶端中

QQ20180110-143954.png

這塊我把所有需要添加的白名單都添加了,基本上是比較全的,項目中有需要用的的可以直接復制進去

1.1.3代碼實現

這里的代碼可能跟微信官方下載下來的demo中的代碼位置有區別,是因為我這邊做了一些小的封裝,但調用的方法沒有變(我這邊只把實現的流程展示出來,具體代碼可以參考我的demo或者官方demo)

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

需要導頭文件

#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.你的程序要實現和微信終端交互的具體請求與回應,因此需要實現WXApiDelegate協議的兩個方法:

#pragma mark- WXApiDelegate/*!@brief收到一個來自微信的請求,第三方應用程序處理完后調用sendResp向微信發送結果 * * 收到一個來自微信的請求,異步處理完成后必須調用sendResp發送處理結果給微信。 * 可能收到的請求有GetMessageFromWXReq、ShowMessageFromWXReq等。 *@paramreq 具體請求內容,是自動釋放的 */

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

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

//微信終端向第三方程序請求提供內容的消息結構體

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

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

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

? }??

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

//微信通知第三方程序,要求第三方程序顯示的消息結構體

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

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

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

? }?

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

//微信終端打開第三方程序攜帶的消息結構體

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

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

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

?? }??

? }

}

/*!@brief發送一個sendReq后,收到微信的回應 * * 收到一個來自微信的處理結果。調用一次sendReq后會收到onResp。 * 可能收到的處理結果有SendMessageToWXResp、SendAuthResp等。 *@paramresp具體的回應內容,是自動釋放的 */

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

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

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

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

? }?

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

//第三方程序向微信終端發送SendMessageToWXReq后,微信發送回來的處理結果,該結果用SendMessageToWXResp表示。

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

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

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

? }? ?

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

//微信處理完第三方程序的認證和權限申請后向第三方程序回送的處理結果

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

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

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

? }? ?

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

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

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

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

?? }??

? }

}


4.具體登錄調用

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

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

然后再調用登錄方法

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

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

/**

* 登錄成功獲取用戶個人信息回調

*/

- (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"];

//性別【必須】

//登錄成功回調#warning 需要開發調用自己的登錄接口

[selfloginSuccess:params];}

獲取到用戶信息之后,我們可以根據自己公司的業務做后續處理

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

分享操作指南官方也有對應的知道文檔微信分享操作指南

微信分享目前支持文字、圖片、音樂、視頻、網頁共五種類型,這塊我主要寫了四種類型,基本上都一樣只是中間調用的類不一樣

分享的場景有兩種

發送到聊天界面——WXSceneSession

發送到朋友圈——WXSceneTimeline

1.2.1分享的幾種方式

1.網頁

//網頁類型分享

- (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];

//標題

message.title = title;

//描述

message.description = description;

//縮略圖

[message setThumbImage:compressedImage];? ? ?

?? WXMusicObject * musicObject = [WXMusicObject object];

//音樂的url

musicObject.musicUrl = musicUrl;

//低分辨率音頻

musicObject.musicLowBandUrl = musicUrl;

//音樂數據的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];

//標題

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分享成功的回調

分享成功的回調也是在

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

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

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

//第三方程序向微信終端發送SendMessageToWXReq后,微信發送回來的處理結果,該結果用SendMessageToWXResp表示。

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

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

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

?? ? ? }??

? }?

}



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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容