iOS-微信的登录与分享

微信登录与分享
微信开发平台-移动应用微信登录开发指南
1、首先导入微信的SDK


2、导入需要的framework


3、添加URL Type

4、在plist文件里添加iOS9 URL Schemes 白名单

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>wechat</string>
        <string>weixin</string>
        <string>sinaweibohd</string>
        <string>sinaweibo</string>
        <string>sinaweibosso</string>
        <string>weibosdk</string>
        <string>weibosdk2.5</string>
        <string>mqqapi</string>
        <string>mqq</string>
        <string>mqqOpensdkSSoLogin</string>
        <string>mqqconnect</string>
        <string>mqqopensdkdataline</string>
        <string>mqqopensdkgrouptribeshare</string>
        <string>mqqopensdkfriend</string>
        <string>mqqopensdkapi</string>
        <string>mqqopensdkapiV2</string>
        <string>mqqopensdkapiV3</string>
        <string>mqzoneopensdk</string>
        <string>wtloginmqq</string>
        <string>wtloginmqq2</string>
        <string>mqqwpa</string>
        <string>mqzone</string>
        <string>mqzonev2</string>
        <string>mqzoneshare</string>
        <string>wtloginqzone</string>
        <string>mqzonewx</string>
        <string>mqzoneopensdkapiV2</string>
        <string>mqzoneopensdkapi19</string>
        <string>mqzoneopensdkapi</string>
        <string>mqzoneopensdk</string>
        <string>alipay</string>
        <string>alipayshare</string>
    </array>

5、向微信终端程序注册第三方应用,并在第三方应用实现从微信返回
在AppDelegate.m中引入”WXApi.h"头文件,然后写入如下:

#import "WXApi.h"
#import "WXApiObject.h"
@interface AppDelegate ()<WXApiDelegate>  //添加代理

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [WXApi registerApp:@"WX_AppID" withDescription:@"weixin"];
    return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
    
    [WXApi handleOpenURL:url delegate:self];
    
    return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    [WXApi handleOpenURL:url delegate:self];  
    return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
     [WXApi handleOpenURL:url delegate:self];
    return YES;
}

6、微信分享—>在控制器里面添加分享代码

#import "WXApiObject.h"
#import “WXApi.h"

//分享文字给好友 
       SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
        req.text = @"测试把信息分享到微信好友";
        req.bText = YES;
        req.scene = WXSceneSession;//会话(WXSceneSession)或者朋友圈(WXSceneTimeline)
        
        [WXApi sendReq:req];
    
//分享图片给好友
        WXMediaMessage *message = [WXMediaMessage message];
        message.title = @"测试把图片分享到微信好友";
        [message setThumbImage:[UIImage imageNamed:@"IconWX.png"]];
        WXImageObject *imageObject = [[WXImageObject alloc] init];
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"IconWX" ofType:@"png"];
        imageObject.imageData = [NSData dataWithContentsOfFile:filePath];
        message.mediaObject = imageObject;
        SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
        req.bText = NO;
        req.message = message;
        req.scene = WXSceneSession;        
        [WXApi sendReq:req];

   //分享网页给好友
        WXMediaMessage *message = [WXMediaMessage message];
        message.title = @"测试把web分享到微信好友";
        [message setThumbImage:[UIImage imageNamed:@"IconWX.png"]];
        
        WXWebpageObject *webObject = [WXWebpageObject object];
        webObject.webpageUrl = @"http://www.baidu.com";
        message.mediaObject = webObject;
        
        SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
        req.bText = NO;
        req.message = message;
        req.scene = WXSceneSession;
        
        [WXApi sendReq:req];
   
 //分享文字到朋友圈
        SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
        req.text = @"测试把信息分享到微信朋友圈";
        req.bText = YES;
        req.scene = WXSceneTimeline;//会话(WXSceneSession)或者朋友圈(WXSceneTimeline)
        [WXApi sendReq:req];

 //分享图片到朋友圈 
        WXMediaMessage *message = [WXMediaMessage message];
        message.title = @"测试把图片分享到微信朋友圈";
        [message setThumbImage:[UIImage imageNamed:@"IconWX.png"]];
        WXImageObject *imageObject = [[WXImageObject alloc] init];
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"IconWX" ofType:@"png"];
        imageObject.imageData = [NSData dataWithContentsOfFile:filePath];
        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 = @"测试把web分享到微信朋友圈";
        message.description = @"";
        [message setThumbImage:[UIImage imageNamed:@"IconWX.png"]];
        
        WXWebpageObject *webObject = [WXWebpageObject object];
        webObject.webpageUrl = @"http://www.baidu.com";
        message.mediaObject = webObject;
        
        SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
        req.bText = NO;
        req.message = message;
        req.scene = WXSceneTimeline;
        
        [WXApi sendReq:req];

6.1、分享App消息到微信,微信点击之后能够跳转到App

static NSString *kAPPContentTitle = @"App消息";
static NSString *kAPPContentDescription = @"这种消息只有App自己才能理解,由App指定打开方式";
static NSString *kAppContentExInfo = @"<xml>extend info</xml>";
static NSString *kAppContnetExURL = @"http://weixin.qq.com";
static NSString *kAppMessageExt = @"这是第三方带的测试字段";
static NSString *kAppMessageAction = @"<action>dotaliTest</action>";

//分享本App识别的信息(会从微信调整到本App)
        Byte* pBuffer = (Byte *)malloc(1024*100);
        memset(pBuffer, 0, 1024*100);
        NSData* data = [NSData dataWithBytes:pBuffer length:1024*100];
        free(pBuffer);
        
        UIImage *thumbImage = [UIImage imageNamed:@"res2.jpg"];
        
        WXAppExtendObject *ext = [WXAppExtendObject object];
        ext.extInfo = kAppContentExInfo;
        ext.url = kAppContnetExURL;
        ext.fileData = data;
        
        WXMediaMessage *message = [WXMediaMessage message];
        message.title = kAPPContentTitle;
        message.description = kAPPContentDescription;
        message.mediaObject = ext;
        message.messageExt = kAppMessageExt;
        message.messageAction = kAppMessageAction;
        message.mediaTagName = nil;
        [message setThumbImage:thumbImage];
        
        SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
        req.bText = NO;
        req.scene = WXSceneSession;
        req.message = message;
        
        [WXApi sendReq:req];

7、微信登陆 —>在AppDelegate里面添加登陆成功的通知

#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[SendAuthResp class]])
    {
        SendAuthResp *rep = (SendAuthResp *)resp;
        if (rep.errCode == 0) {
            
            [[NSNotificationCenter defaultCenter] postNotificationName:WXLoginSuccess object:@{@"code":rep.code}];
        }
        
    }

8、微信登陆 —>在控制器里面添加登陆代码

static NSString *kAuthScope = @"snsapi_userinfo";
static NSString *kAuthOpenID = @"这个我现在没使用";
static NSString *kAuthState = @"123";
//微信登陆
- (void)onClickBtn
{
    SendAuthReq *req = [[SendAuthReq alloc] init];
    req.scope = kAuthScope;
    req.state = kAuthState;
    req.openID = kAuthOpenID;
    [WXApi sendReq:req];
}

9、微信登陆—>在控制器里面实现登陆成功之后的回调

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(WXLogin:) name:WXLoginSuccess object:nil];

//登陆成功之后获取token
- (void)WXLogin:(NSNotification *)notifi
{
    AFHTTPRequestOperationManager *manage = [AFHTTPRequestOperationManager manager];
    manage.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manage GET:@"https://api.weixin.qq.com/sns/oauth2/access_token" parameters:@{@"appid":WX_AppID, @"secret":WX_AppSecret, @"code":notifi.object[@"code"], @"grant_type":@"authorization_code"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        /*"access_token" = "OezXcEiiBSKSxW0eoylIeBPKSgTfwua1QABCnleka9CqGYr9J4wP2NHLDEFTP0vqsiS4DFDyXNQmYSaM6dW1s8MrQi6NSC9dV6ZqqjazKWQv3kfeozrm-fbZTXU80vLaWYflw07nkDhmX3KJHsEVxQ";
         "expires_in" = 7200;
         openid = xxxxxxxxxxxxxxxxxxxxxxxxxx;
         "refresh_token" = "OezXcEiiBSKSxW0eoylIeBPKSgTfwua1QABCnleka9CqGYr9J4wP2NHLDEFTP0vq6O1ZVOcyb8uL5dLrcuRaydRmY9BcYgJeOLqRjlLyp5HpBlYc2Ikja-RFm6ghGQ32r_iZfQfAQhtEqwk9ibf8vA";
         scope = "snsapi_userinfo";
         unionid = o4bo2vzI0vCvGTa11GBMkx0SbcwQ;*/
        [[NSUserDefaults standardUserDefaults] setObject:dict forKey:WXSaveToken];
        [self saveTokenAndRequireWXInfo];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"access_token error-->%@", error.localizedDescription);
    }];
}

10、微信登陆—>在控制器里面通过token请求得到微信部分个人信息

- (void)saveTokenAndRequireWXInfo
{
    NSDictionary *dict = [[NSUserDefaults standardUserDefaults] objectForKey:WXSaveToken];
   AFHTTPRequestOperationManager *manage = [AFHTTPRequestOperationManager manager];
    manage.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manage GET:@"https://api.weixin.qq.com/sns/userinfo" parameters:@{@"openid":dict[@"openid"], @"access_token":dict[@"access_token"]} success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
//        NSLog(@"%@",dict);
//        {
//            city = "xxx";
//            country = xxx;
//            headimgurl = “http://wx.qlogo.cn/mmopen/xxxxxxx/0”;
//            language = "zh_CN";
//            nickname = xxx;
//            openid = xxxxxxxxxxxxxxxxxxx; //授权用户唯一标识
//            privilege =     (
//            );
//            province = "xxx";
//            sex = 0;
//            unionid = xxxxxxxxxxxxxxxxxx;
//        }
        [[NSUserDefaults standardUserDefaults] setObject:dict forKey:WXResponse_UserInfo];       
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"userinfo error-->%@", error.localizedDescription);
    }];     }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,511评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,140评论 25 707
  • 前言 友盟能实现分享功能,友盟+申请第三方账号的目的: 进行分享、授权操作需要在第三方平台创建应用并提交审核,友盟...
    CoderZb阅读 9,693评论 8 60
  • 七月的夏日十分炎热,天闷闷的,让人心情烦躁。去吃在早餐,前台站满了等待取餐的食客。 由于人很多,想着算了换一家吃饭...
    五项全檬阅读 395评论 0 0
  • 小刘在一家宽带公司做安装工,从他家到公司要经过一段偏僻的公路。 一天,起晚了,洗簌完毕,早餐都没吃,就赶紧上路。很...
    篱笆影阅读 451评论 2 1