iOS第三方登录及分享入门指南 —— 微信(二)

导语:

完成原生QQ的SDK集成后,接下来就是微信的了,这两家的SDK我怀疑是同个人写的,如此相像,虽不难,但还是有一些坑需要注意。

微信 SDK官方文档

实现微信登录

一、准备工作

  1. 微信·开放平台,注册成为开发者。
  2. 创建应用,申请你的AppIDAppSecret

二、集成SDK

下载好完整包,如图导入工程需要的文件。

微信SDK.png

三、配置工程

1. 添加SDK依赖的系统库文件

SystemConfiguration.framework
Security.framework
CFNetwork.framework
CoreTelephony.framework
libsqlite3.0.tbd
libstdc++.tbd
libz.tbd
libc++.tbd

2. 修改必要的工程配置属性

在工程配置中的Build Settings一栏中找到Linking配置区,给Other Linker Flags配置项添加属性值-Objc-all_load

配置工程.png
3. 修改Info.plist文件

在XCode中,选中TARGETS一栏,在Info标签栏中找到URL Types,添加一条新的URL scheme。(必须填写

Identifier: wexin
URL Schemes: wx + "appid"

想要实现应用间跳转,而不是打开一个登陆网页,在Info.plist中添加LSApplicationQueriesSchemes

<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
</array>

四、代码实现

1.AppDelegate

在AppDelegate中添加头文件,并重写AppDelegate的handleOpenURLopenURL方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [WXApi registerApp:@"appid"];
    return YES;
}
  • iOS9之前,分别重写handleOpenURL && openURL方法

      //handleOpenURL(ios10已弃用)
      NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:")
      - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
          return [WXApi handleOpenURL:url delegate:self];
    
      }
         
      //openURL(iOS10已弃用)
      NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:")
      - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
          return [WXApi handleOpenURL:url delegate:self];
      }
    
  • iOS9之后,handleOpenURL && openURL 合成为同一个方法

      //handleOpenURL && openURL
      - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
          return [WXApi handleOpenURL:url delegate:self];
      }
    
2.实现代理方法
- (void)onReq:(BaseReq *)req{
    NSLog(@"wx onReq");
}
  
- (void)onResp:(BaseResp *)resp{
    NSLog(@"wx onResp");
    //登录 分享 都走同一个回调
    if ([resp isKindOfClass:[SendAuthResp class]]) {
         SendAuthResp* authResp = (SendAuthResp *)resp;
        [self loginResponse:authResp];
    }
}
  
- (void)loginResponse:(SendAuthResp*)response{
     switch (response.errCode) {
         case WXSuccess:{
            [self getUserToken:response.code];
       }
            break;
         case WXErrCodeCommon:
            break;
         case WXErrCodeUserCancel:
            break;
         case WXErrCodeSentFail:
            break;
         case WXErrCodeAuthDeny:
            break;
         case WXErrCodeUnsupport:
            break;
    }
}
3.请求code,通过login点击事件
-(void)sendAuthRequest{ 
    //构造SendAuthReq结构体 
    SendAuthReq* req =[[[SendAuthReq alloc ] init ] autorelease ];
    req.scope = @"snsapi_userinfo" ;
    req.state = @"123" ;
    //第三方向微信终端发送一个SendAuthReq消息结构
    [WXApi sendReq:req]; 
}
4.通过code获取access_token
- (void)getUserToken:(NSString*)code{
     NSString* url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",WXAppID,WXSecret,code];
     //获取第一步的code后,请求以下链接获取access_token:
     
        { 
            "access_token":"ACCESS_TOKEN", 
            "expires_in":7200, 
            "refresh_token":"REFRESH_TOKEN",
            "openid":"OPENID", 
            "scope":"SCOPE",
            "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
        }
     
     //将获取到的userToken && openID 继续网络请求获取userInfo
     [self getUserInfo:response[@"access_token"] openID:response[@"openid"]];
 }
参数 说明
access_token 接口调用凭证(有效期30天)
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔
unionid 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段
5.刷新access_token有效期

获取第一步的code后,请求以下链接进行refresh_token:

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
6.根据获取到的userToken && openID 继续网络请求获取userInfo
- (void)getUserInfo:(NSString*)token openID:(NSString*)openID{
    NSString* url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",token,openID];
    
    //网络请求 返回response包含UserInfo
 }

实现微信分享

步骤同上一、二、三

微信 SDK官方文档

代码实现

1.AppDelegate

设置分享支持类型

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [WXApi registerApp:@"appid"];
    
    UInt64 typeFlag = MMAPP_SUPPORT_TEXT | MMAPP_SUPPORT_PICTURE |
                      MMAPP_SUPPORT_LOCATION | MMAPP_SUPPORT_VIDEO | 
                      MMAPP_SUPPORT_AUDIO | MMAPP_SUPPORT_WEBPAGE |
                      MMAPP_SUPPORT_DOC | MMAPP_SUPPORT_DOCX | 
                      MMAPP_SUPPORT_PPT | MMAPP_SUPPORT_PPTX | 
                      MMAPP_SUPPORT_XLS | MMAPP_SUPPORT_XLSX |
                      MMAPP_SUPPORT_PDF;
    
    [WXApi registerAppSupportContentFlag:typeFlag];
    
    return YES;
}
2.实现代理方法
- (void)onReq:(BaseReq *)req{
    NSLog(@"wx onReq");
}
  
- (void)onResp:(BaseResp *)resp{
    NSLog(@"wx onResp");
    //登录 分享 都走同一个回调
    if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
         SendMessageToWXResp* messageResp = (SendMessageToWXResp *)resp;
        [self shareResponse:messageResp];
    }
}
  
- (void)shareResponse:(SendAuthResp*)response{
     switch (response.errCode) {
         case WXSuccess:{
            //分享成功
       }
            break;
         case WXErrCodeCommon:
            break;
         case WXErrCodeUserCancel:
            break;
         case WXErrCodeSentFail:
            break;
         case WXErrCodeAuthDeny:
            break;
         case WXErrCodeUnsupport:
            break;
    }
}
3.分享示例

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];
      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 *musicObject = [WXMusicObject object];
      musicObject.musicUrl = @"音乐url";
      musicObject.musicLowBandDataUrl = @"音乐lowband数据url地址";
      musicObject.musicDataUrl = @"音乐数据url";
      musicObject.musicLowBandDataUrl = @"音乐lowband数据url地址";
      message.mediaObject = musicObject;
      
      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];
      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];
    

结束语

  • 如果同时集成QQ SDK和微信 SDK,需要注意两者的回调方法会冲突。解决办法可以分别创建对应的管理类来管理代理方法。

     -(void)onReq:(BaseReq *)req;
     -(void)onResp:(BaseResp *)resp;
    
  • 微信登录和分享的回调方法为同一个

  • 纯文字分享可以跳转,其他类型无法跳转时,请注意缩略图(thumbImage)大小是否超过32kb (重要

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

推荐阅读更多精彩内容