上线前的踩坑清单
4.1 这份清单从哪来,怎么用
我把前面几章踩过的坑,加上提审被退过两次的教训,汇总成了一份逐项打勾的清单。每一项后面都写了「怎么验证通过」,因为「已检查」这三个字没有意义,「用 iPhone SE 打开竖屏画面,确认顶部被刘海裁掉 2px 以内」才有意义。
清单分成五组,每组下面挂着若干条:
| 组别 | 覆盖内容 | 一条不过的后果 |
|---|---|---|
| 构建与包体 | 体积、AppID、构建模式、场景勾选、远程资源 | 包超限传不上去;传上去的包是坏的 |
| 性能与真机 | 帧率、drawcall、启动时间、异形屏、低端机 | 大量玩家在首屏流失,或中途闪退 |
| 音频、权限与网络 | 音频播放、授权拒绝兜底、断网提示 | 卡在 loading,或授权弹窗挡住整个游戏 |
| 合规与素材 | 备案、隐私指引、适龄提示、素材授权 | 审核被退,或上线后被下架 |
| 运营与回滚 | 活动开关、埋点、客服话术、回滚方案 | 出事时束手无策 |
用法是:每次准备发版,从上往下过一遍,每项要么打勾,要么写下「为什么这次可以跳过」。不允许留空。留空的意思是「没检查」,而没检查的项目里通常就藏着要退审的那一条。
我第一次提审被退,原因不是技术,是隐私弹窗没在启动前弹。第二次被退,是因为游戏里有段代码调用了 wx.getUserProfile,但隐私保护指引里没声明昵称头像。两次都是合规问题,不是代码问题。
4.2 构建、包体与性能
- [ ] 主包体积在限制内。 怎么验证:构建完看
build/wechatgame目录大小,加上remote目录(如果remote是要上传 CDN 的就不算进主包)。微信官方口径是主包不超过 4M,主包加所有分包的总和不超过 30M,单个普通分包不限大小,单个独立分包不超过 4M。具体数字以微信官方公告为准。 - [ ] AppID 不是面板默认值。 怎么验证:打开
build/wechatgame/project.config.json,确认appid不是wx6ac3f5090a6b99c5。 - [ ] 设备方向和实际设计一致。 怎么验证:看
game.json里的deviceOrientation,跟项目设置里的横竖屏对一遍。 - [ ] 构建是 release 模式。 怎么验证:构建面板上「调试模式」没勾、MD5 缓存按需勾。release 才会压缩 UUID、混淆脚本。
- [ ] 参与构建的场景里没有多余场景。 怎么验证:构建面板的「参与构建的场景」列表逐个看,测试关卡全部取消勾选。
- [ ] 远程资源地址填了,且 remote 目录传上去了。 怎么验证:真机清缓存后重进游戏,Network 面板里能看到 remote 目录下的请求且返回 200。
- [ ] 包体里没有多余文件。 怎么验证:解压
build/wechatgame,按目录大小排序找最大的几个文件,看是不是该删的调试素材。 - [ ] 最低配目标机型上,最复杂关卡全程不低于 45 帧。 怎么验证:拿那台机器实机跑,走一遍进关 → 送三个包裹 → 出关,重复三遍取第三遍数据。
- [ ] drawcall 在自己定的阈值内。 怎么验证:浏览器预览开
Show FPS,读左下角的 DrawCall 数,跟上一版优化的对比表比。 - [ ] 启动到首屏可交互在 4 秒内。 怎么验证:真机冷启动计时。微信官方性能文档里提到,代码包加载阶段如果能缩短到 4 秒内,可以减少大约 40% 玩家的流失。
- [ ] 峰值内存没逼近平台限制。 怎么验证:用性能面板工具抓一次峰值,或在小游戏数据助手里看内存异常退出数据。iOS 高性能模式下低端机限制是 1G、中高端机 1.5G。
- [ ] 引擎插件相关的选项已确认。 怎么验证:如果开了「分离引擎」,确认没同时开 Wasm 3D 物理系统,引擎插件目前仅支持 js 模式。
4.3 真机兼容、音频权限与网络
- [ ] 异形屏 / 刘海屏显示正常。 怎么验证:至少在 iPhone X 系列和一台带挖孔的安卓机上各看一次,确认 HUD 没被刘海遮住、没有元素出界。3.8 的
sys.getSafeAreaRect()可以拿到安全区域,按它算布局。 - [ ] 小屏设备(iPhone SE 尺寸)布局不挤。 怎么验证:把预览分辨率改成小屏跑一遍,看按钮有没有被挤出屏幕。
- [ ] 低端安卓机(内存 2~3G)能跑。 怎么验证:真机实跑最复杂的那一关,看内存峰值和是否异常退出。微信官方数据提到小游戏因内存问题退出的占比约 2%,重度游戏可能到 5%~8%。
- [ ] 多点触控正常。 怎么验证:真机上同时按两个方向键和拾取键。
- [ ] 不同浏览器 / 微信版本能跑。 怎么验证:Web 端至少在 Chrome 和 Safari 各测一遍;小游戏端在微信开发者工具里把调试基础库调到较老版本再测一次。
- [ ] 音频在真机上能播。 怎么验证:真机点一次音效、一次 BGM。注意 Web 平台受浏览器自动播放策略限制,需要用户手势才能播放,所以首屏不能自动播 BGM,必须等一次点击。
- [ ] 静音键能静音。 怎么验证:真机拨到静音,BGM 应该停。
- [ ] 所有授权接口都做了拒绝兜底。 怎么验证:开发者工具里把对应权限设为拒绝,看游戏是否还能正常玩。微信官方隐私文档明确建议兼容用户拒绝授权的情况,避免影响体验。
- [ ] 隐私弹窗在启动后立刻出现,且在调任何个人信息接口之前。 怎么验证:清缓存重进游戏,看到弹窗出现之前不能有任何
wx.getUserInfo之类的调用。 - [ ] 隐私弹窗有「不同意」的路径,且不会卡死游戏。 怎么验证:点不同意,游戏应该继续跑,只是相关功能降级。
- [ ] 断网时有明确提示,不是白屏或死等。 怎么验证:飞行模式下进游戏。
- [ ] 弱网有超时和重试。 怎么验证:用开发者工具的弱网模式跑一遍,看请求是否会一直挂着。
- [ ] 资源下载失败有兜底。 怎么验证:手动改一个 CDN 地址成不存在的,看提示是否友好、是否能重试。
- [ ] 本地存档读写正常。 怎么验证:杀进程重启,进度还在。
4.4 崩溃日志、审核合规与素材授权
- [ ] 线上崩溃能收集到。 怎么验证:用
wx.onError或LogManager.log把关键路径的异常上报到自己的日志服务,然后手动抛一个异常,确认后台能收到。 - [ ] 关键路径有埋点。 怎么验证:在数据助手里能看到「进关」「取件」「结算」这几个事件的量级,不是零。
- [ ] 构建日志和包体已归档。 怎么验证:每个发布版本把
build目录和构建日志一起存一份,标注版本号。崩溃时能立刻知道当时是哪个包。 - [ ] 反馈入口可用。 怎么验证:玩家点「反馈」能把当前版本号、设备信息、玩家 ID 一起带上。
- [ ] 小程序备案已完成。 怎么验证:MP 后台能查到备案号。微信官方明确写着「版本审核通过后,需在『小程序备案』完成后,方可发布」。
- [ ] 用户隐私保护指引已配置并与实际行为一致。 怎么验证:进 MP 后台
设置 -> 基本设置 -> 用户隐私保护指引,逐项核对声明的信息类型和游戏里实际用到的接口对得上。官方文档列了一份涉及个人信息的标准 API 清单,昵称头像、位置、相册、摄像头、麦克风、蓝牙、剪切板、传感器都在里面。 - [ ] 适龄提示已设置。 怎么验证:提审页面里「完成适龄提示设置」这一项不是空的。
- [ ] 没有使用受限能力。 怎么验证:逐条核对小游戏规范,确认没有诱导分享、强制关注、虚拟支付绕过等行为。
- [ ] 提审时选对了引擎类型并填了版本更新说明。 怎么验证:提审表单的每项都填了,版本说明写的是这次的真实改动。
- [ ] 类目与资质齐备。 怎么验证:如果有付费或社交玩法,确认对应的类目资质已提交。
- [ ] 所有美术素材的商用授权在有效期内。 怎么验证:打开素材授权台账(第五章那张表),逐条看授权类型能否覆盖「微信小游戏商业发行」,授权方是否是素材原作者而不是二次转载的站点。
- [ ] 字体可商用。 怎么验证:确认字体是开源可商用字体,或有明确商用授权。默认字体和系统字体在商用场景有坑。
- [ ] 音效和 BGM 授权范围覆盖小游戏。 怎么验证:确认授权包含「移动端 / 小游戏平台」这一项。
4.5 运营配置与回滚预案
- [ ] 活动开关能远程控制。 怎么验证:改一次远端配置,重启游戏生效。
- [ ] 数据上报字段齐了。 怎么验证:在数据助手里看自定义事件的维度是否完整,别只有事件名没有参数。
- [ ] 客服与公告话术准备好了。 怎么验证:写好版本更新说明、常见问题回复,放在发布包里。
- [ ] 回滚方案可执行。 怎么验证:如果 CDN 资源出问题,能不能在 10 分钟内把 manifest 指向旧版本;如果小游戏包出问题,能不能当天提一个新版本。注意加急审核有条件:更新版本、每季度 2 次、累计注册用户需超过 5000。
- [ ] 版本号、git tag、构建产物三者对得上。 怎么验证:拿构建包里的版本号去 git 里查 tag,一查一个准。
- [ ] 回滚演练做过一次。 怎么验证:在测试环境真的把 manifest 指回旧版本,确认客户端启动后确实回到了旧内容。
最后这一条是我加的。回滚方案写在文档里不等于回滚可用,真正演练过,才知道中间少了哪一步。
