iOS 微信登录和分享集成

1、下载iOS微信SDK 下载地址
2、将SDK放到工程目录中并手动补充一下依赖库

iOS 微信登录和分享集成_第1张图片
依赖库和 SDK.jpeg

3、添加URL Types 和 白名单和开启 http 访问
iOS 微信登录和分享集成_第2张图片
白名单和开启 http 访问.jpeg

iOS 微信登录和分享集成_第3张图片
URL Types.jpeg

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

你可能感兴趣的:(iOS 微信登录和分享集成)