# 常见问题

# 体验 demo

# 1. 微信终端合作平台 快速体验 demo 无法搜到小程序

a) 确定输入小程序 appid 前缀或者后缀是不是输入空格之类

b) 确定小程序是否已正式发布

# 2. 使用体验 demo 无法打开小程序

a) 启动有两个 apk 的,确定小程序框架这个 apk 没有启动,必须启动小程序框架这个 apk 再启动这个 wmpf 才有会启动的

b) 确定这两个 apk 的权限,再看下权限是否全部提供

c) 体验 demo 暂时只支持正式版小程序,体验版、开发版的小程序后续才会支持

# 硬件注册

# 1. mmiot_scdsa_sign 相关问题

mmiot_scdsa_sign 本质上是一段 sh 脚本,可在 Linux 或者是 Mac 环境下运行,同时必须保证环境安装了 openssl ,具体用法见硬件注册流程。

a)mmiot_scdsa_sign.sh: command not found 报错 一般是权限问题,用 sudo bash ./mmiot_ecdsa_sign.sh 测试

b).mmiot_scdsa_sign.sh gen_ecdsa_key 后面参数可任意指定文件

# 2. 如何检查签名是否成功

a) 可用 verify_ecdsa_sign 检查

b) 可替换掉示例 demo 的 productIddeviceIdkeyVersion 、和 signature ,查看运行是否正常; 如若不正常一般是参数传入错误或者 openssl 版本不对,请更新版本再试

# 3. 硬件注册常见问题

a) 生成一定是要设备上操作 sudo bash ./mmiot_ecdsa_sign.shgen_ecdsa_keyprikey_filepathpubkey_filepath 这个命令吗?

—— 服务端生成公私钥存着就可以,不是设备上生成的。

b) 签名是不是也是服务端生成?

—— 是的,生成放在设备里或者写个请求到服务端访问,注意这里是三方 app 保证设备签名的安全不被盗用。

c) 是不是只建一个机型就可以了,不用管有机器不一致?

—— WMPF 的通用规则是一个机型一个秘钥,主要需要开发者自己确定。

d) https://api.weixin.qq.com/wxa/business/runtime/adddevice?access_token=YOUR_ACCESS_TOKEN 这个接口是不是一台设备请求一次就可以了?

—— 是的,服务端调用一次就可以了,永久有效。

e) 调⽤ mmiot_ecdsa_sign ⼯具,输⼊私钥文件,⽣成每个设备的签名 signature 。这个签名是按机器,还是按机型?

—— 机器,每个机器都有各自的 deviceId 和各自的 signature ,不然会出现挤占的异常。

# 4. 烧录具体是指什么

平台侧不关心具体参数是如何获得的,理论上需要接入方保证签名安全,烧录的意思是要将签名放在安全存储区或者本地配置文件或者出厂配置文件,也可以是接入方服务器,这里不建议是存到 sd 卡,风险较大。

# 开发相关

# 1. 打开小程序失败 / 打开小程序不是最新版本

a) 确定参数是否正确,公钥必须在 微信终端合作平台 平台上传,公钥不可以为多个机型使用,公钥格式必须正确,KeyVersion 版本必须正确,且已绑定小程序

b) 通过 WMPF LaunchWxaAppRequest 的 appType ,确定开发版、正式版、体验版

c) 若打开的小程序版本为体验版、开发版小程序, 需要用户先扫码登录,并且用户拥有对应权限才可以打开,权限在小程序的管理页面设置。

d) 系统是否安装微信支付相关的应用?这个可能导致 ilink 冲突无法打开打开小程序

e) 大屏设备需要把屏幕方向锁定在横屏或者竖屏,再启动小程序

# 2. Android Studio 打包,guide 与 experience 的区别

WMPF Client Demo 项目有两个 flavor ,正式开发需要用到 guide 。

  • guide:用于 API 展示
  • experience:用于快速体验

# 3. 启动小程序时是否每次都需要调用 ActivateDevice, Authorize 接口

  • ActivateDevice 要用于对请求的三方 App 的鉴权,因此必须调用,建议是每次调用接口时若返回未激活错误码都重新走一遍激活接口,以及进程起来时激活。
  • Authorize 用于小程序登录,登录后小程序调用 wx.login 能拿到正确的 code ,从而获取到用户相关信息,接入方可根据场景决定是否需要调用此接口。

# 4. 替换移动应用 AppId 后, OpenSdkTestUtil 相关调用异常

检查 appid 和 appsecret 是否匹配,该流程复用的是线上获取 accessToken 和 sdkTicket 的流程,可搜索相关代码参考。

备注:示例代码为了演示将该 appsecret 放于客户端,接入 app 应把该流程移到服务端,避免风险。

# 5. 调用 LaunchWxaApp 超时,未响应

一般是 WMPF Service 未正确启动,导致无法响应,可监听 IPCInvokeCallbackEx 相关 error 。

# 6. manageBackgroundMusic 和 notifyBackgroundMusic 区别

  • manageBackgroundMusic 用于跳进小程序背景音频管理页面,并且能获得当前播放音频的相关信息。
  • notifyBackgroundMusic 用于监听小程序背景音频状态变化,如音频播放暂停,恢复等,重复监听会覆盖上次调用。

# 7. 小程序运行过程问题

a) 小程序运行过程中,能否退出登录 —— 请通过 launcher 调用 deauthorize 接口即可。

# 8. 调用接口报 invokeToken err 错误

首先需要调用 activateDevice 接口,其次利用 InvokeTokenHelper.initInvokeToken 保存在本地,每次请求需要带上。

# 9. 二维码登录页面,二维码显示不出来

a) 确认之前是否已经弹过二维码了。为了防止小程序一直弹二维码,小程序生命周期内只能触发一次。

# 10. scanCode 接口定制扫码界面

小程序 scanCode 接口支持第三方提供扫码界面,处理扫码逻辑后返回给 wmpf :

a) 接入方需提供一个 Action 为 com.tencent.wmpf.action.WMPF_SCAN_CODE 的可被外界访问到的 Activity ,这个 Ativity 会在 wmpf 中调用 scanCode 接口后被调起。

b) 接入方需要在此 Activity 接收扫码的参数,参数位于 Intent 的 Extra 中,参数如下:

属性 类型 说明
key_time_stamp long 调用时间戳
key_token string 调用验证,格式为 MD5(appid + "_" + time_stamp)
key_only_from_camera boolean 是否只能从相机扫码,不允许从相册选择图片,默认 false
key_scan_type StringArray 扫码类型,默认 ['barCode', 'qrCode'] ,可选值 barCode,qrCode,datamatrix,pdf417

c) 当扫码完成,并且处理完扫码结果后,需要将结果以 setResult(code, resultIntent) 的形式回传给 wmpf 框架,注意这里需要处理两个情景,扫码流程成功 setResult(RESULT_OK, resultIntent) 和扫码流程中断 setResult(RESULT_CANCELED, resultIntent) 。resultIntent 中需要带上扫码结果数据,存放在 Extra 中。参数如下:

属性 类型 说明
key_scan_result_code_type string 扫码类型,可选值 QR_CODE,AZTEC,CODABAR,CODE_39,CODE_93,CODE_128,DATA_MATRIX,EAN_8,EAN_13,ITF,MAXICODE,PDF_417,RSS_14,RSS_EXPANDED,UPC_A,UPC_E,UPC_EAN_EXTENSION
key_scan_result string 扫码结果
key_scan_result_raw byteArray 扫码结果的原始 byteArray 数据

d) 特殊场景说明:如果接入方的扫码界面被调起,但是由于一些原因无法完成扫码需求,需要回到 wmpf 自带的扫码界面进行接下来的流程,可以将 resultCode 置为 -2 ,即 setResult(-2) ,这样将会在退出接入方被调起的扫码界面后回到 wmpf 自带的扫码界面 。

# 11. IPCInvoker not initialize

检查接入 App Application 是否有继承 WMPFApplication 。

# 12. 获取扫码用户身份信息

Authorize 接口会返回 oauthCode ,即可走原流程获取相关信息,具体代码见示例 Demo MainActivity 中的实现。

# 13. 画中画参数

此参数修改为 true ,但是需要系统侧定制好小程序的 activity window 尺寸,这边只是通知了系统小程序预期的比例

画中画模式启动后,从画中画模式窗口进入全屏模式,小程序元素位置和大小都改变,这个小程序的界面适配是由小程序开发者来控制适配还是小程序框架来处理?

a) 小程序开发者处理 resize 事件

b) 小程序框架在 JS 层没有提供画中画的接口。这里的画中画只是客户端告诉系统进入一个非全屏的窗口,为的是可以让小程序和其他的硬件 App 在屏幕内共存,硬件设备应该定制系统让小程序的窗口不要再次进入全屏模式。

# 14. 平板上小程序卡在 loading 页无法加载

请将设备屏幕方向锁定在横屏或者竖屏,再启动小程序。

# 15. 预热不生效

可能存在以下原因:

  • 设备未成功激活
  • 预热传入的 appid、path、appType 等参数跟真正打开小程序传入的不一致
  • 小程序需要登录态,如打开的是开发 / 体验版,但设备无登录态或者登录用户无对应权限

# 16. 替换移动应用 AppId 后,启用小程序异常

  • 开发版小程序和体验版小程序,检查是否提前登录;
  • 正式版小程序,检查是否移动应用AppId和小程序AppId是否有绑定关系

# 17. 小程序调用 WMPF 调用通道相关接口后,Wmpf-Cli端未收到请求

检查是否在AndroidManifest中配置了相关provider。

# 18. Wmpf流量消耗参考:

  • 激活登录流程:80k
  • 启动小程序:首次(包含下载代码包) 平均值4m; 非首次 20k
  • 静置24h:4m
  • 高频使用1h:包含框架和小程序消耗,建议参考自身业务运行小程序评估,不同小程序差异较大,如小程序示例1m(基本是框架消耗),电商类小程序4-6m,直播类小程序70-80m等