1、下载iOS微信SDK 下载地址
2、将SDK放到工程目录中并手动补充一下依赖库
3、添加URL Types 和 白名单和开启 http 访问
4、在AppDelegate.m中引入"WXApi.h"头文件,然后写入如下:
#import "AppDelegate.h"
#import "WXApi.h"
//微信相关信息
#define AppDescription @"ARHere"
#define WX_App_ID @"wx0**************7"
#define WX_AppSecret @"7**************1d"
#define WX_ACCESS_TOKEN @"access_token"
#define WX_OPEN_ID @"openid"
#define WX_REFRESH_TOKEN @"refresh_token"
#define WX_BASE_URL @"https://api.weixin.qq.com/sns"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//向微信注册
[WXApi registerApp:WX_App_ID withDescription:AppDescription];
return YES;
}
///从微信端打开第三方APP会调用此方法,此方法再调用代理的onResp方法
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{
return [WXApi handleOpenURL:url delegate:self];
}
/**! 微信回调,不管是登录还是分享成功与否,都是走这个方法
*/
-(void) onResp:(BaseResp*)resp{
NSLog(@"resp %d",resp.errCode);
if ([resp isKindOfClass:[SendAuthResp class]]) { //授权登录的类。
if (resp.errCode == 0) { //成功。
NSLog(@"授权登录成功!");
SendAuthResp *aresp = (SendAuthResp *)resp;
[self getAccessTokenWithCode:aresp.code];
}
}
if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
//使用UIAlertView 显示回调信息
NSString *str = [NSString stringWithFormat:@"%d",resp.errCode];
if ([str isEqualToString:@"0"]) {
NSLog(@"分享成功!");
}
}
}
//使用code获取access token
- (void)getAccessTokenWithCode:(NSString *)code
{
NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",WX_App_ID,WX_AppSecret,code];
NSURL *url = [NSURL URLWithString:urlString];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data){
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if ([dict objectForKey:@"errcode"]) {
//获取token错误
}else {
//存储AccessToken OpenId RefreshToken以便下次直接登陆, AccessToken有效期两小时,RefreshToken有效期三十天
NSString *accessToken = [dict objectForKey:WX_ACCESS_TOKEN];
NSString *openID = [dict objectForKey:WX_OPEN_ID];
NSString *refreshToken = [dict objectForKey:WX_REFRESH_TOKEN];
if (accessToken && ![accessToken isEqualToString:@""] && openID && ![openID isEqualToString:@""]) {
[[NSUserDefaults standardUserDefaults] setObject:accessToken forKey:WX_ACCESS_TOKEN];
[[NSUserDefaults standardUserDefaults] setObject:openID forKey:WX_OPEN_ID];
[[NSUserDefaults standardUserDefaults] setObject:refreshToken forKey:WX_REFRESH_TOKEN];
[[NSUserDefaults standardUserDefaults] synchronize]; // 命令直接同步到文件里,来避免数据的丢失
}
//通过代理吧对应的登录消息传送到登录控制器页面
// 通过代理方法 [self.delegate getWechatUserInfo]; // 使用AccessToken获取用户信息
}
}
});
});
}
5、在 登录VC 的控制器中写上登录和分享等
- (IBAction)login:(id)sender {
NSString *accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:WX_ACCESS_TOKEN];
NSString *openID = [[NSUserDefaults standardUserDefaults] objectForKey:WX_OPEN_ID];
// 如果已经请求过微信授权登录,那么考虑用已经得到的access_token
if (accessToken && openID) {
NSString *refreshToken = [[NSUserDefaults standardUserDefaults] objectForKey:WX_REFRESH_TOKEN];
NSString *refreshUrlStr = [NSString stringWithFormat:@"%@/oauth2/refresh_token?appid=%@&grant_type=refresh_token&refresh_token=%@", WX_BASE_URL, WX_App_ID, refreshToken];
NSURL *url = [NSURL URLWithString:refreshUrlStr];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data){
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"请求reAccess的response = %@", dict);
NSString *reAccessToken = [dict objectForKey:WX_ACCESS_TOKEN];
// 如果reAccessToken为空,说明reAccessToken也过期了,反之则没有过期
if (reAccessToken) {
// 更新access_token、refresh_token、open_id
[[NSUserDefaults standardUserDefaults] setObject:reAccessToken forKey:WX_ACCESS_TOKEN];
[[NSUserDefaults standardUserDefaults] setObject:[dict objectForKey:WX_OPEN_ID] forKey:WX_OPEN_ID];
[[NSUserDefaults standardUserDefaults] setObject:[dict objectForKey:WX_REFRESH_TOKEN] forKey:WX_REFRESH_TOKEN];
[[NSUserDefaults standardUserDefaults] synchronize];
[self getWechatUserInfo]; // 获取用户个人信息(UnionID机制)
}else {
[self wechatLogin];
}
}
});
});
}else {
[self wechatLogin];
}
}
///使用AccessToken获取用户信息
- (void)getWechatUserInfo
{
NSString *accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:WX_ACCESS_TOKEN];
NSString *openID = [[NSUserDefaults standardUserDefaults] objectForKey:WX_OPEN_ID];
NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openID];
NSURL *url = [NSURL URLWithString:urlString];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if ([dict objectForKey:@"errcode"]) {
//AccessToken失效
}else {
//获取需要的数据
NSLog(@"微信个人信息= %@",dict);
}
}
});
});
}
- (void)wechatLogin {
if ([WXApi isWXAppInstalled]) {
SendAuthReq* req =[[SendAuthReq alloc ] init];
req.scope = @"snsapi_userinfo";
req.state = AppDescription;
[WXApi sendReq:req];
}
}
6、在 分享的控制器中写分享代码
发送到聊天界面——WXSceneSession
发送到朋友圈——WXSceneTimeline
添加到微信收藏——WXSceneFavorite
文字类型分享示例
// 第三方程序发送消息至微信终端程序的消息结构体
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.text = @"分享的内容";
// 发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息
req.bText = YES;
req.scene = WXSceneTimeline;
[WXApi sendReq:req];
图片类型分享示例
// 用于微信终端和第三方程序之间传递消息的多媒体消息内容
WXMediaMessage *message = [WXMediaMessage message];
// 设置消息缩略图的方法
[message setThumbImage:[UIImage imageNamed:@"图片.png"]];
// 多媒体消息中包含的图片数据对象
WXImageObject *imageObject = [WXImageObject object];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"res1" ofType:@"jpg"];
// 图片真实数据内容
imageObject.imageData = [NSData dataWithContentsOfFile:filePath];
// 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。
message.mediaObject = imageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;// 分享到朋友圈
[WXApi sendReq:req];
音乐类型分享示例
WXMediaMessage *message = [WXMediaMessage message];
// 标题
message.title = @"音乐标题";
// 描述内容
message.description = @"音乐描述";
[message setThumbImage:[UIImage imageNamed:@"缩略图.jpg"]];
// 多媒体消息中包含的音乐数据对象
WXMusicObject *ext = [WXMusicObject object];
// 音乐网页的url地址
ext.musicUrl = @"音乐url";
// 音乐lowband数据url地址
ext.musicLowBandDataUrl = ext.musicUrl;
// 音乐数据url地址
ext.musicDataUrl = @"音乐数据url";
// 音乐lowband数据url地址
ext.musicLowBandDataUrl = ext.musicDataUrl;
message.mediaObject = ext;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;
[WXApi sendReq:req];
网页类型分享示例
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"标题";
message.description = @"描述";
[message setThumbImage:[UIImage imageNamed:@"res2.png"]];
// 多媒体消息中包含的网页数据对象
WXWebpageObject *webpageObject = [WXWebpageObject object];
// 网页的url地址
webpageObject.webpageUrl = @"https://opne.weixin.qq.com";
message.mediaObject = webpageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;
[WXApi sendReq:req];
视频类型分享示例
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"标题";
message.description = @"描述";
[message setThumbImage:[UIImage imageNamed:@"缩略图.jpg"]];
// 多媒体消息中包含的视频数据对象
WXVideoObject *videoObject = [WXVideoObject object];
// 视频网页的url地址
videoObject.videoUrl = @"视频url";
// 视频lowband网页的url地址
videoObject.videoLowBandUrl = videoObject.videoUrl;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;
[WXApi sendReq:req];