ios-第三方登录和分享总结(微信篇)
https://www.jianshu.com/p/4eb5421ec563
对于第三方登录和分享,当我们做熟了就会发现三种登录和分享的方式都是大同小异,流程基本上也一样,只要我们掌握其中的一种,其他的只需要看看文档就会很快做完,下面我们就先介绍微信.
一 微信
1.1微信登录
具体iOS微信集成指南点击查看iOS指南
1.1.1 申请账号
向微信的开放平台申请开发账号点击打开连接申请
1.1.2下载微信SDK
SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。
如选用手动集成,请前往资源下载页下载最新SDK包

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

4.在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id

5.在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“LSApplicationQueriesSchemes“添加微信的白名单,主要是为了手机端进行登录可以直接进入微信客户端中

这块我把所有需要添加的白名单都添加了,基本上是比较全的,项目中有需要用的的可以直接复制进去
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]]) {
//QQ
return [TencentOAuth HandleOpenURL:url];
}else if ([KTencentURLSchema isEqualToString:[url scheme]]) {
//QQ
return [QQApiInterface handleOpenURL:url delegate:self.qqUtils];
}else if ([KWXURLSchema isEqualToString:[url scheme]]) {
//微信
return [WXApi handleOpenURL:url delegate:self.wxUtils];
}else if ([KWBURLSchema isEqualToString:[url scheme]]){
//微博
return [WeiboSDK handleOpenURL:url delegate:self.wbUtils];
}
return NO;
}
- (BOOL)applicationHandleOpenURL:(NSURL *)url {
if ([KTencentSchema isEqualToString:[url scheme]]) {
//QQ
return [TencentOAuth HandleOpenURL:url];
}else if ([KTencentURLSchema isEqualToString:[url scheme]]) {
//QQ
return [QQApiInterface handleOpenURL:url delegate:self.qqUtils];
}else if ([KWXURLSchema isEqualToString:[url scheme]]) {
//微信
return [WXApi handleOpenURL:url delegate:self.wxUtils];
}else if ([KWBURLSchema isEqualToString:[url scheme]]){
//微博
return [WeiboSDK handleOpenURL:url delegate:self.wbUtils];
}
return NO;
}
3.你的程序要实现和微信终端交互的具体请求与回应,因此需要实现WXApiDelegate协议的两个方法:
#pragma mark- WXApiDelegate
/*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果
*
* 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。
* 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。
* @param req 具体请求内容,是自动释放的
*/
-(void) onReq:(BaseReq*)req{
if ([req isKindOfClass:[GetMessageFromWXReq class]]) {
//微信终端向第三方程序请求提供内容的消息结构体
if (self.wxDelegate
&& [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvGetMessageReq:)]) {
GetMessageFromWXReq *getMessageReq = (GetMessageFromWXReq *)req;
[self.wxDelegate WXApiUtilsDidRecvGetMessageReq:getMessageReq];
}
} else if ([req isKindOfClass:[ShowMessageFromWXReq class]]) {
//微信通知第三方程序,要求第三方程序显示的消息结构体
if (self.wxDelegate
&& [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvShowMessageReq:)]) {
ShowMessageFromWXReq *showMessageReq = (ShowMessageFromWXReq *)req;
[self.wxDelegate WXApiUtilsDidRecvShowMessageReq:showMessageReq];
}
} else if ([req isKindOfClass:[LaunchFromWXReq class]]) {
//微信终端打开第三方程序携带的消息结构体
if (self.wxDelegate
&& [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvLaunchFromWXReq:)]) {
LaunchFromWXReq *launchReq = (LaunchFromWXReq *)req;
[self.wxDelegate WXApiUtilsDidRecvLaunchFromWXReq:launchReq];
}
}
}
/*! @brief 发送一个sendReq后,收到微信的回应
*
* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
* @param resp具体的回应内容,是自动释放的
*/
-(void) onResp:(BaseResp*)resp{
if ([resp isKindOfClass: [PayResp class]]){
//支付结果
if (self.wxDelegate
&& [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvPayResponse:)]) {
PayResp *payResp = (PayResp *)resp;
[self.wxDelegate WXApiUtilsDidRecvPayResponse:payResp];
}
}else if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
//第三方程序向微信终端发送SendMessageToWXReq后,微信发送回来的处理结果,该结果用SendMessageToWXResp表示。
if (self.wxDelegate
&& [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvMessageResponse:)]) {
SendMessageToWXResp *messageResp = (SendMessageToWXResp *)resp;
[self.wxDelegate WXApiUtilsDidRecvMessageResponse:messageResp];
}
} else if ([resp isKindOfClass:[SendAuthResp class]]) {
//微信处理完第三方程序的认证和权限申请后向第三方程序回送的处理结果
if (self.wxDelegate
&& [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvAuthResponse:)]) {
SendAuthResp *authResp = (SendAuthResp *