一、 体验demo

1、 wecooper平台快速体验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环境下运行,同时必须保证环境安装了openss,具体用法见硬件注册流程。

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的productId,deviceId,keyVersion和signature,查看运行是否正常; 如若不正常一般是参数传入错误或者openssl版本不对,请更新版本再试

3、 DeviceID相关问题

一般是开发者根据imei或者是sn号生成的独一无二的设备标识即可,然后到平台侧进行注册。具体用法见注册deviceId接口。 注册deviceId接口报错

a) 确定注册deviceId是否为POST请求,且部分参数不是放在url里的,是放在body里的

b) 确定参数productId、model name、token等是否填写错误

c) 确定请求格式是否正确

d) 确定wecooper平台上是否已经绑定小程序

5、 硬件注册常见问题

a) 生成一定是要设备上操作sudobash./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和各自的签名,不然会出现挤占的异常。

三、 正式接入 - Client

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

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

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

c) 体验版、开发版小程序需要小程序开发者给到对应权限才可以打开,权限在小程序的管理页面

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

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

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

正式开发需要用到 guide

demo项目有两个flavor

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

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

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

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

检查appid和appsecret是否匹配,该流程复用的是线上获取accessToken和sdkTicket的流程,可搜索相关代码参考. ps:示例代码为了演示将该appsecret放于客户端,接入app应把该流程移到服务端,避免风险。

5、调用LaunchWxaApp超时,未响应

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

6、manageBackgroundMusic和notifyBackgroundMusic区别

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

7、小程序运行过程问题

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

b) 小程序运行过程中,调用wx.login无效 ——检查是否调用了AuthorizeNoLogin,允许运行中登录。

8、调用接口报invokeToken err错误

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

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

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

b) 确认启动前是否调用NoLogin,检查Authorize or AuthorizeNoLogin传入的参数是否正确。

10、scanCode接口使用逻辑

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

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

b) 接入方需要在此Activity接收扫码的参数,参数位于Intent的Extra中,参数如下 Extra Data: 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中。参数如下 Extra Data: 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、预载使用方法

预载一次即可,若重复调用会重新预载,结合自身业务调用即可,建议一般使用完一个小程序即可在空闲时机去做预载。

12、获取扫码用户身份信息

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

13、画中画参数

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

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

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

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

Q&A

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

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

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

检查appid和appsecret是否匹配,该流程复用的是线上获取accessToken和sdkTicket的流程,可搜索相关代码参考. ps:(重点)示例代码为了演示将该appsecret放于客户端,接入app应把该流程移到服务端,避免风险。

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

开发版小程序和体验版小程序,检查是否提前登录; 正式版小程序,检查是否移动应用AppId和小程序AppId是否有绑定关系. ps:绑定流程见内测文档.

  1. 调用LaunchWxaApp超时,未响应:

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

  1. manageBackgroundMusic和notifyBackgroundMusic区别:

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

  1. 小程序运行过程中,能否退出登录:

通过launcher调用deauthorize接口即可.

  1. 小程序运行过程中,调用wx.login无效:

检查是否调用了AuthorizeNoLogin,允许运行中登录.

  1. 调用接口报invokeToken err错误:

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

  1. 二维码登录页面,二维码显示不出来:

检查Authorize or AuthorizeNoLogin传入的参数是否正确.

  1. IPCInvoker not initialize:

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

  1. 预载时机:

预载一次即可,若重复调用会重新预载,结合自身业务调用即可,建议一般使用完一个小程序即可在空闲时机去做预载

  1. 小程序scanCode接口支持第三方提供扫码界面,处理扫码逻辑后返回给wmpf,具体步骤如下:

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

b. 接入方需要在此Activity接收扫码的参数,参数位于Intent的Extra中,参数如下 Extra Data: 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中。参数如下 Extra Data: 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数据

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

  1. 小程序二维码登录后,接入方App能否拿到扫码用户的身份信息:

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

设备激活&硬件注册流程 1.mmiot_scdsa_sign怎么使用? 本质上是一段sh脚本,可在linux或者是mac环境下运行,同时必须保证环境安装了openssl. 具体用法见硬件注册流程doc.

2.mmiot_scdsa_sign.sh: command not found 一般是权限问题, 亲测sudo bash ./mmiot_ecdsa_sign.sh 可行.

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

4.检查签名是否成功: a.可用verify_ecdsa_sign检查; b.可提换掉示例demo的productId,deviceId,keyVersion和signature,查看运行是否正常, 如若不正常a.一般是参数传入错误;b.openssl版本不对,请更新版本再试

5.deviceId怎么获得? 一般是接入方根据imei或者是sn号生成的独一无二的设备标识即可,然后到平台侧进行注册. ps:格式为1k一下字符串.

6.生成签名即为base64后的字符串,可直接替换掉示例demo的signature. ps:不需要换行符.

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

8.平板上小程序卡在loading页无法加载: 请将设备屏幕方向锁定在横屏或者竖屏,再启动小程序