cover_image

深度学习微信小游戏API

randyho 三七互娱技术团队
2025年01月08日 10:00
01

背景

图片
图片

随着接入我们SDK的微信小游戏种类越来越多,遇到的问题也层出不穷,故写下此文,作为以往经验总结。

附上微信小游戏开发在线文档传送门:https://developers.weixin.qq.com/minigame/dev/api/base/system/wx.getSystemInfoSync.html

02

SDK涉及的微信API

图片
图片
图片

接下来我们围绕这些微信API做一次梳理

网络请求

图片
图片

JS版本,微信提供了wx.request方法用于网络请求,此请求方法用以下注意点:

1、域名只支持 https 协议,域名必须经过 ICP 备案,服务器域名请在 「小程序后台-开发-开发设置-服务器域名」 中进行配置。

2、域名不能使用 IP 地址(小程序的局域网 IP 除外)或 localhost

3、对于 https 域名,可以配置端口,如 https://myserver.com:8080,但是配置后只能向 https://myserver.com:8080 发起请求。如果向 https://myserver.com、https://myserver.com:9091 等 URL 请求则会失败。如果不配置端口。如 https://myserver.com,那么请求的 URL 中也不能包含端口,甚至是默认的 443 端口也不可以。如果向 https://myserver.com:443 请求则会失败

4、对于 POST 方法且 header['content-type'] 为 application/x-www-form-urlencoded 的数据,会将数据转换成 query string (encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...)

5、不支持配置父域名,使用子域名使用限制

6、使用限制

  • 默认超时时间是 60s;

  • wx.requestwx.uploadFilewx.downloadFile 的最大并发限制是 10 个,超出部分会在队列中,依次进行执行。

图片
  • 小程序进入后台运行后,如果 5s 内网络请求没有结束,会回调错误信息 fail interrupted;在回到前台之前,网络请求接口调用都会无法调用。

SDK遇到的坑:

最近遇到的一个坑点就是:wx.request的最大并发限制是10个。

由于研发在加载游戏资源时,一瞬间发出近20个网络请求,而且每次请求的耗时都很长,当用户退出小游戏时,我们SDK质量上报“SDK登录成功”的请求还在请求队列中,还没上报。造成数据漏斗显示转化率异常,正常(图2)是95%,这次转化(图1)只有63.94%

图片
图片

用下图时间轴来表示这次“SDK登录成功”请求丢失的流程

图片

优化方案:

1、建议研发合并资源请求,减少请求资源加载并发量,同时提升接口响应速度,减少用户登录时间。

2、调整“SDK登录成功”的请求执行时机,避免资源请求并发过多,造成“SDK登录成功”的质量上报请求丢失。

unity微信小游戏,如果用C#开发,则不能使用wx.request方法(JS专用),需要自行实现https网络请求方法,下图是unity微信小游戏的network截图,即使不使用wx.request方法,微信开发者工具对https的请求并发量会进行控制,超出的请求量,会在请求队列中逐步处理。

图片

获取启动参数

图片
图片

wx.getLaunchOptionsSync()获取小游戏冷启动时的参数。

SDK只关注在冷启动时获取query属性,里面有投放同事生成的投放广告链接参数,我们SDK获取query属性里面的值后,都会透传至“数据部同事”进行数据归因,因此,SDK透传数据时候,需要保障。

1、数据不会因长度问题被截断(使用post请求)

2、上报的数据不存在编码问题,后端接口能正常解析。

SDK遇到的坑:

由于投放同事使用的投放平台各不相同,因此我们query对象的值,无法枚举,这次遇到比较棘手的问题是,从推广链接进游,数据部收到的referer字段与质量上报的referer不一致。本次推广的小游戏是用unity引擎C#语法开发的,经过近2个多小时的排查,最终把目光锁定在JS小游戏和unity小游戏的网络请求对比上。

图片

可以看到,能够被后端接口正常解析的报文,是用"mid5"包裹字段传输的,而异常报文,则使用"\x22"包裹字段传输,导致后端无法正常解析字符串。

核心原因

JS-api对于 POST 方法且 header['content-type'] 为 application/x-www-form-urlencoded 的数据,会将数据转换成 query string (encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...)

unity C# 由于自行实现网络请求,则不会对每个请求字段都进行url编码

解决方案

改造unity的网络post请求方法, header['content-type'] 为 application/x-www-form-urlencoded 的数据,进行url编码

图片

获取系统参数

图片
图片
图片

由于微信侧已经停止维护wx.getSystemInfoSync方法,拆分成多个API进行系统参数获取,因此,我们SDK文件,未来也需要做wx.getSystemInfoSync方法的兼容处理,以下是改造升级的示例代码

图片

SDK遇到的坑:

1、wx.getSystemInfoSync方法本身有返回空对象的偶发问题,如果进一步访问空对象属性里的属性,例如访问空对象.a.b属性,就会出现js代码报错,因此,我们SDK内部会使用 try-catch进行兼容处理

图片

2、未来wx.getSystemInfoSync方法改造,也会出现其他方法不存在的情况,我们前端代码需要做好兼容处理。

显示当前页面转发按钮

图片
图片

wx.showShareMenu设置右上角点开的详情界面中的分享按钮是否可用

SDK遇到的坑:

1、微信官方提供的unity C# 转js小游戏的unity插件,里面展示分享按钮的逻辑,与我们SDK冲突,导致SDK未拿到分享图信息,已经提前激活用户的分享按钮,对话框造成分享图加载黑屏。

图片

解决方法:unity的SDK在完成分享信息注册前,禁止用户分享,图二为SDK加载中,用户无法分享,图三为SDK注册分享消息后,用户可使用分享功能,总体等待时间,1秒内。

图片
图片
图片

监听右上分享事件

图片
图片

wx.onShareAppMessage 监听用户点击右上角菜单的「转发」按钮时触发的事件

图片

当用户手动点击右上角「转发」按钮时,SDK再发出网络请求,拉取当前小游戏的分享信息,以promise的形式返回给微信小游戏,达到分享图文由运营在后台编辑,SDK无需实时更新的效果。

同时,为了防止出现请求分享图文接口超出3秒的场景,SDK会内置一个兜底的分享图文,保证分享图文不会出现,当前游戏截图的画面。

图片

SDK遇到的坑:

1、请求当前小游戏的分享信息后,SDK内部会根据分享图片链接,发送一个head请求,校验图片正常响应(响应状态码为200代表正常),由于没有将图片地址的域名添加到mp后台的服务器域名白名单内,导致请求被拦截,用户只能看到兜底图文。

主动拉起分享

图片
图片

wx.shareAppMessage  主动拉起转发,进入选择通讯录界面

图片

针对游戏研发侧,有精细化分享的场景,SDK也提供了share方法,让研发传入自定义的分享参数,满足游戏内,点击不同分享按钮,生成不同的分享图文。

SDK遇到的坑:

1、对于研发传入的自定义分享参数,为了防止用户点击分享卡片进游后,由于编码问题,导致分享数据丢失,SDK内部在生成query参数时,会对所有字段值进行url编码处理。

图片
图片

确认弹窗

图片
图片

wx.showModal 显示模态对话框

SDK内部使用“模态对话框”的场景,大部分是接口返回异常状态码,用作“温馨提示”。

图片

在SDK以外的场景,特别是提示玩家,进行版本强更时wx.showModal就很重要了,特别是showCancel参数,最好设置为false,保证不显示取消按钮,,让玩家更新为最新的游戏版本

以下是之前调研部分微信小游戏的强更提醒弹窗(以下截图,仅代表当时版本,真实效果,以当前游戏最新版本效果为准)

图片
图片

提示弹窗

图片
图片

wx.showToast  显示消息提示框

图片

SDK当前使用wx.showToast的场景,在用户支付异常时,用作弹窗处理

图片

总结

图片

1、微信小游戏SDK前端遇到的大部分异常场景,主要是网络请求(请求阻塞,请求丢失)和url编码问题

2、JS开发的小游戏(laya,cocos)和C#开发的unity小游戏,底层使用的api也会有差异,因此,我们的SDK当前是维护 JS-SDK和C#-SDK 两套。

遇到异常问题,除了聚焦解决问题外,还需要培养定时群里同步解决问题进度的习惯,小游戏SDK是整个游戏上线的其中一个环节,后续还有游戏推广,游戏投放数据归因等环节,因此,如果小游戏SDK问题无法及时解决,必须立即同步给大家,商量是否调整上线时间,保障各个部门按计划,顺利地做好每个小游戏的发行工作。


END



三七互娱技术团队

扫码关注 了解更多

图片


继续滑动看下一个
三七互娱技术团队
向上滑动看下一个