04/29/2024 11:54:53

WeChat 渠道说明

使用 Xcode13.0 及以上版本编译 App 的开发者,需要参考 3.5关于微信 OpenSDK iOS15 系统的适配说明 进行适配,以确保微信 OpenSDK 的正常使用。

一、 Android工程配置

一、Android工程配置

1.1 权限配置

在 AndroidManifest.xml 根节点中新增权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 【可选】for mta statistics -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1.2 入口 Activity 配置

在 AndroidManifest.xml 中添加如下配置

Android Studio 环境下 {applicationId} 不需要手动替换成包名

Unity、UnrealEngine、Cocos2D 等环境下需要手动把 {applicationId} 替换成包名

<activity
    android:name="com.tencent.gcloud.msdk.WeChatAgentActivity"
    android:exported="true"
    android:launchMode="singleTask"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"/>

<activity-alias
    android:name="${applicationId}.wxapi.WXEntryActivity"
    android:enabled="true"
    android:exported="true"
    android:launchMode="singleTask"
    android:excludeFromRecents="true"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:targetActivity="com.tencent.gcloud.msdk.WeChatAgentActivity"/>

<activity
    android:name="com.tencent.gcloud.msdk.qrcode.WXQrCodeActivity"
    android:excludeFromRecents="true"
    android:exported="true"
    android:label="WXQrCodeActivity"
    android:launchMode="singleTask"
    android:taskAffinity="com.tencent.gcloud.msdk.qrcode.diff"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:theme="@android:style/Theme.Light.NoTitleBar"
    android:screenOrientation="portrait">
</activity>

1.3 App Id 配置

在工程的 assets/MSDKConfig.ini 文件中添加以下配置

WECHAT_APP_ID = {YOUR_WECHAT_APP_ID}

[info] 替换 {YOUR_WECHAT_APP_ID} 为业务申请的微信 APPID

二、iOS工程配置

二、iOS工程配置

2.1 MSDKConfig 配置文件

在工程中找到 MSDKAppSetting.bundle/MSDKConfig.ini 文件,增加如下配置

WECHAT_APP_ID = {YOUR_WECHAT_APP_ID}

[info] 替换 {YOUR_WECHAT_APP_ID} 为业务申请的微信 APPID

2.2 Xcode 工程配置文件 info.plist

找到或新建如下节点:

 <key>CFBundleURLTypes</key>
     <array>
     <dict>
         <key>CFBundleURLSchemes</key>
         <array>
             <string>{your wechat app id}</string>
         </array>
     </dict>
 </array>
 <key>LSApplicationQueriesSchemes</key>
 <array>
     <string>wechat</string>
     <string>weixin</string>
     <string>weixinULAPI</string>
     <string>weixinURLParamsAPI</string>
 </array>
 <key>NSAppTransportSecurity</key>
     <dict>
     <key>NSAllowsArbitraryLoads</key>
     <true/>
 </dict>

[info] 替换 {your wechat app id} 为业务申请的微信 APPID,另外上述 LSApplicationQueriesSchemes 建议配置在前 50 以内,详情可参考 iOS开发者文档说明

2.3 Unity XUPoter 的 xx.projmods 文件的配置

Unity 导出 XCode 工程时,需要配置 projmods 文件,使得导出的 XCode 工程能得到 2.2 的配置

{
    "group": "MSDKWeChat",
    "libs": [],
    "frameworks": [],
    "files": [],
    "folders": [],
    "excludes": [],
    "headerpaths":[],
    "build_settings": {},
    "system_capabilities": {},
    "Info.plist":{
        "LSApplicationQueriesSchemes":
        [
            "weixin",
            "wechat",
                        "weixinULAPI"
        ],
        "CFBundleURLTypes" :
        [
            {
                "CFBundleTypeRole":"Editor",
                "CFBundleURLSchemes":["{WX_APPID}"]
            }
        ]
    }, 
}

[info] 替换 {WX_APPID} 为业务申请的微信 APPID

详情请参考 Universal Link 说明

三、功能说明

三、功能说明

3.1 登录功能

使用微信的授权登录,详情见 登录模块

在调用 MSDKLogin.Login 的时候传入权限。 微信 iOS/Android 已知的权限列表如下(官方文档没有明确的权限说明):

权限 说明
snsapi_userinfo 获取用户资料(MSDK默认权限)
snsapi_friend 获取好友列表
snsapi_message 发送消息。V5.25 版本开始已废弃

使用微信二维码登录
判断微信 App 是否安装 ,未安装时使用二维码登录,调用 MSDKLogin.Login 在 extraJson 中增加 QRCode 配置,打开二维码登录界面。注意 extraJson 是 json 格式。

示例代码

C#
C++
MSDKLogin.Login (channel, "", "", "{\"QRCode\":true}");
GCloud::MSDK::MSDKLogin::Login(channel, "", "", "{\"QRCode\":true}");

3.2 好友功能

发送信息给微信好友,分享图片、视频等到朋友圈,分享图片到微信游戏圈,详情见 好友模块

[info] 分享视频到朋友圈需要微信版本为 6.5.8 以上;微信版本 6.7.2 开始取消了分享取消或者失败的回调,无论分享成功、失败或者取消都会返回成功,为了防止游戏过多的诱导分享,具体表现取决于微信侧的策略;

1)发送功能支持类型

序号 功能 必填字段
0 发送文本-弹框 type(类型)、desc(描述)
1 发送链接-弹框 type(类型)、link(链接)
2 发送图片-弹框 type(类型)、imagePath(图片地址)
3 发送音乐-弹框 type(类型)、link(链接)
4 应用邀请-弹框 type(类型)
5 发送小程序-弹框 type(类型)、link(链接)、extraJson(扩展字段中,需带上key为 weapp_id 的信息)
6 拉起小程序-弹框 type(类型)、link(链接)、extraJson(扩展字段中,需带上key为 weapp_id 的信息)
7 业务功能拉起-弹框 type(类型)、extraJson(扩展字段中,需带上key为 business_type 的信息)
8 发送到微信视频号-弹框 type(类型)、mediaPath(多媒体地址)
9 发送到微信状态 type(类型)、title(标题)、imagePath(图片地址)、link(链接)、extraJson(扩展字段中,需带上key为 stateId 的信息)

2)分享功能支持类型

序号 功能 必填字段
0 分享文本-弹框 type(类型)、desc(描述)
1 分享链接-弹框 type(类型)、link(链接)
2 分享图片-弹框 type(类型)、imagePath(图片地址)
3 分享音乐-弹框 type(类型)、link(链接)、imagePath(图片地址)
4 分享视频-弹框 type(类型)、mediaPath(多媒体地址)
5 分享图片到微信游戏圈 type(类型)、imagePath(图片地址)

[info] 其他发送/分享类型均不支持;

其他不常用的字段,统一写进字段 extraJson 中,示例如下

MSDKFriendReqInfo reqInfo = new MSDKFriendReqInfo();
reqInfo.extraJson = "{\"gameextra\":\"shareWXGameLinePic\", \"media_tag_name\":\"MSG_INVITE\",\"message_action\":\"WECHAT_SNS_JUMP_URL\",\"message_ext\":\"12345\", \"weapp_id\":\"wx4a0a73ec028e47d7\"}";

其中 gameextra字段是在打开微信游戏圈的连接时附加到URL中的字段,例如上述extraJson会附加&gameextra=shareWXGameLinePic到url当中

3.3 群组功能

微信群组功能包括:创建群、加入现有群、获取群状态、获取群关系、解绑群、发送群消息

详情见 群组模块

[info] 微信端的工会信息可自行创建填写,unionID需牢记,为后续模块的功能的唯一标识ID。
特别注意:微信24小时之内只能创建一个微信群

3.4 微信拉起游戏

从微信拉起游戏,当前包括以下两种情况的拉起

  • 用户点击邀请消息拉起

  • 游戏中心拉起

这两种拉起,MSDK 均会响应且透传来自微信的参数到 extraJson 的 params 字段中,游戏可从中获取字段。

传递数据格式如下:

{
  "extraJson": {
    "params": {
      "_wxappextendobject_extInfo": "MSDK",
      "_wxapi_basereq_transaction": "da5119749b8f66db36cb9ca6002e7ef0",
      "_wxobject_sdkVer": 620954368,
      "_wxobject_description": "",
      "_mmessage_appPackage": "com.tencent.mm",
      "THIRD_REQ_RESULT": 0,
      "openid": "oHlap1URnIobL4489JUYTXH9_PJ4",
      "_wxobject_message_ext": "WX_GameCenter",
      "_wxapi_command_type": 4,
      "_wxobject_title": "sendMessage10003",
      "_wxapi_basereq_openid": "oHlap1URnIobL4489JUYTXH9_PJ4",
      "_mmessage_checksum": "B@282cb08",
      "wx_token_key": "com.tencent.mm.openapi.token",
      "_mmessage_sdkVersion": 620954368,
      "_wxapi_showmessage_req_country": "CN",
      "_wxobject_identifier_": "com.tencent.mm.sdk.openapi.WXAppExtendObject",
      "platform": "WeChat",
      "_wxapi_showmessage_req_lang": "zh_CN",
      "platformId": "wechat"
    },
    "game_data": "MSDK"
  },
  "methodNameID": 119,
  "retCode": 0,
  "retMsg": "Success",
  "ret": -1,
  "msg": ""
}

说明:extraJson 中 params 的对应字段,名字和内容均由微信传递。extraJson 中的 game_data 字段是游戏发送好友邀请时填充内容的原样带回,若是游戏中心拉起,则对应解析该字段。若收到的 game_data 内容有转码,可以选择解析 _wxappextendobject_extInfo 字段(如有该字段),或者自行规避微信转码的字符: '<', '>', '"', '\'', '&', '\r', '\n', ' ', '\t' 。

game_data 字段透传

var reqInfo = new MSDKFriendReqInfo ();
reqInfo.Link = "http://www.qq.com";
reqInfo.ExtraJson = "{\"game_data\":\"iOS Game Data 测试游戏数据\"}";

游戏业务通过发送邀请消息接口拉起WeChat-app发送消息给WeChat好友,用户的WeChat好友点击消息时跳回游戏

发送消息时MSDKFriendReqInfo中的ExtraJson中添加的game_data的字段,在点击消息拉起游戏时会透传给游戏业务,回传数据在MSDKBaseRet的ExtraJson中的game_data中。若收到的 game_data 内容有转码,可以选择解析 _wxappextendobject_extInfo 字段(如有该字段),或者自行规避微信转码的字符: '<', '>', '"', '\'', '&', '\r', '\n', ' ', '\t' 。

{
  "methodNameID": 0,
  "channelID": 1,
  "channel": "WeChat",
  "pluginData": "",
  "channelOpenID": "oHlap1Q1mqIQLpAqsuwty635gH0U",
  "seqID": "11-2B4C94EE-0CC8-4433-A313-1678F57272FA-1585295116-47",
  "extraJson": {
    "params": {
      "language": "zh_CN",
      "openId": "oHlap1Q1mqIQLpAqsuwty635gH0U",
      "mediaTagName": "",
      "country": "CN",
      "messageExt": "iOS Game Data 测试游戏数据"
    },
    "game_data": "iOS Game Data 测试游戏数据"
  }
}

说明:Android 通过发送微信邀请消息透传 game_data 时,接收方收到的 game_data 需要接入方自行 Decode。

3.5 关于微信 OpenSDK iOS15 系统的适配说明

Xcode13.0 及以上版本编译出的 App 在 iOS15.0 及以上系统上被限制了 URL Scheme query 的数量为 50。对于 plist 中 LSApplicationQueriesSchemes 配置的 scheme 数量超过 50 的 App,可能会导致如下问题。使用 13.0 及以上版本 Xcode 编译 App 的开发者需要适配以确保微信 OpenSDK 的正常使用。

  • 微信 OpenSDK 某些接口返回错误结果;
  • 无法使用 Universal Link 拉起微信,引发分享消息到微信后,应用名被添加“未验证应用”的问题。

1)背景

从 iOS9 开始,iOS 支持在工程 plist 中配置 LSApplicationQueriesSchemes。

将其他 App 的 scheme 配置到 LSApplicationQueriesScheme 中后,可以通过以下代码判断是否可以通过 scheme 跳转对应的 App。

BOOL ret = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]];

接入微信 OpenSDK 时,微信官方-接入文档 有要求在 LSApplicationQueriesScheme 添加 weixin 和 weixinULAPI (如上图所示)。

2)iOS15 系统相关变更

微信和苹果确认,在 iOS15 系统上使用 Xcode13 编译出的 App,LSApplicationQueriesSchemes 的数量会限制为 50 个。第 50 个之后的 scheme 配置会不生效,以下代码会返回 NO。

BOOL ret = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@" 
otherAppScheme://"]];

3)微信 OpenSDK 适配建议

如果 LSApplicationQueriesSchemes 配置的 scheme 数量小于 50,或者“weixin”和“weixinULAPI”这两个 scheme 在前 50,无需适配。使用 Xcode12 及以下版本 Xcode 编译的 App 目前暂不需要适配。

接入方需要确保“weixin”和“weixinULAPI”配置在 LSApplicationQueriesSchemes 的前 50。否则以下接口可能会在 iOS15 系统上返回错误结果或者表现异常:

  1. [WXApi isWXAppInstalled]:安装微信的情况下,也返回NO;
  2. [WXApi isWXAppSupportApi]:支持的情况下,也返回NO;
  3. [WXApi isWXAppSupportStateAPI]:支持的情况下,也返回NO;
  4. [WXApi sendAuthReq:viewController:delegatecompletion]:会判断微信未安装,拉起网页授权。

所有的接口均无法使用 Universal Link 拉起微信,降级使用 scheme 拉起微信,导致未验证应用问题。

四、常见问题

四、常见问题

4.1 可以拉起微信,授权返回却没有回调

  • 检查是否初始化了 MSDK.Init
  • 检查是否设置了回调
  • Android 检查是否修改 AndroidManifest.xml 中的配置,把 android:name="${applicationId}.wxapi.WXEntryActivity" 中的{applicationId} 改为自己的包名
  • iOS 检查是否在 info.plist 中增加配置

4.2 视频无法分享

  • 视频格式有限制

4.3 Android 微信图片分享到会话/朋友圈失败

  • 报错堆栈示例
    2020-03-10 11:05:28.079 20294-20294/? E/Instrumentation: Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory

    java.lang.Throwable
         at android.app.Instrumentation.getFactory(Instrumentation.java:1233)
         at android.app.Instrumentation.newActivity(Instrumentation.java:1224)
         at com.tencent.mm.splash.k.newActivity(SourceFile:61)
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3340)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3614)
         at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
         at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
         at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199)
         at android.os.Handler.dispatchMessage(Handler.java:112)
         at android.os.Looper.loop(Looper.java:216)
         at android.app.ActivityThread.main(ActivityThread.java:7625)
         at java.lang.reflect.Method.invoke(Native Method)
         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
    
  • 排查微信插件目录下的 proguard-project.txt 文件中是否添加微信代码混淆,如果没有请添加以下代码混淆规则:

  -keep class com.tencent.mm.opensdk.** {*;}
  -keep class com.tencent.wxop.** {*;}
  -keep class com.tencent.mm.sdk.** {*;}

4.4 gradle 打包报错: Could not find com.tencent.mm.opensdk:wechat-sdk-android-without-mta:x.x.xx.

需要添加仓库:mavenCentral()。



Copyright © 2024 MSDK.
All rights reserved.

results matching ""

    No results matching ""