對于第三方登錄和分享,當(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的登錄和分享