11/08/2024 16:35:54
WeChat 渠道说明
使用 Xcode13.0 及以上版本编译 App 的开发者,需要参考 3.5关于微信 OpenSDK iOS15 系统的适配说明 进行适配,以确保微信 OpenSDK 的正常使用。
一、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工程配置
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
2.4 MSDK V5.6 及以后的版本需要配置 Universal Link
详情请参考 Universal Link 说明
三、功能说明
3.1 登录功能
使用微信的授权登录,详情见 登录模块
在调用 MSDKLogin.Login 的时候传入权限。
微信 iOS/Android 已知的权限列表如下(官方文档没有明确的权限说明):
权限 | 说明 |
---|---|
snsapi_userinfo | 获取用户资料(MSDK默认权限) |
snsapi_friend | 获取好友列表 |
snsapi_message | 发送消息。V5.25 版本开始已废弃 |
使用微信二维码登录
判断微信 App 是否安装 ,未安装时使用二维码登录,调用 MSDKLogin.Login 在 extraJson 中增加 QRCode 配置,打开二维码登录界面。注意 extraJson 是 json 格式。
示例代码
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 系统上返回错误结果或者表现异常:
- [WXApi isWXAppInstalled]:安装微信的情况下,也返回NO;
- [WXApi isWXAppSupportApi]:支持的情况下,也返回NO;
- [WXApi isWXAppSupportStateAPI]:支持的情况下,也返回NO;
- [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 AppComponentFactoryjava.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()。
- 微信 Android SDK 迁移至 Maven Central 详细说明参见微信平台文档:https://open.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=116196836364Bchn&version=&lang=zh_CN&token=
All rights reserved.