本文介绍接入 Android 过程中常见的问题及相应的解决方案。
自定义 JSAPI 时,handleEvent 和 interceptEvent 有什么区别?
解答:如果监听容器自己处理的事件,需要将自定义 JSAPI 添加到 handleEvent
里,并返回 true
。返回 true
,表示事件将停止传递;返回 false
,表示事件将继续传递给其他插件。如果监听容器的其他事件,需要将自定义 JSAPI 添加到 interceptEvent
中。
自定义 JSAPI 时,已经添加了事件,为什么还要在 onPrepare 里添加一次?
解答:自定义 JSAPI 时,虽然已经在 config.setEvents("event");
中添加了事件,但是容器的插件是懒加载的,即在页面创建的时候加载。通过外部的 config.setEvents
来注入要监听的事件名称,当真正有 JS 调用的时候,才会去实例化对应的插件对象。真正实例化的插件的事件分发用的是插件内 onPrepare
的事件。所以,要确保 config.setEvents("event")
的事件和内部 onPrepare
的事件保持一致。
自定义 JSAPI 插件注册的 page、session 和 service 三者的区别是什么?
解答:page 对应一个 WebView。session 对应 mPaaS 应用的一个 App 对象。service 是全局的一个单例。
如果注册为 page 级别,每次创建 WebView 都会创建一个插件实例,对应的插件的 onRelease 在 WebView 销毁时回调。
如果注册为 session 级别,每次创建一个 App 对象都会创建一个插件。
如果注册为 service 级别,全局只创建一次插件,在第一次打开容器的时候创建。
验签是验证离线包的来源还是做完整性校验?
解答:在离线包发布平台,如果您配置了签名私钥,平台下发的 AMR 文件就会带上离线包的签名信息(通过私钥对离线包的 Hash 值加密后得到的密文)。验签的时候会使用在项目中预置的公钥进行签名的验证(解密上一步的密文得到 Hash 值,本地计算离线包的 Hash,判断两者是否相同)。该过程保证了离线包的内容完整,也保证了离线包的来源正确。
打开离线包 ProgressBar 无法隐藏的原因是什么?
解答:这种情况可能是由于资源离线失败,页面 fallback 到了线上模式,在 fallback 模式下面 H5 容器强制限制 ProgressBar,无法通过设置 SHOW_PROGRESS
启动参数来隐藏页面加载进度条(Progress Bar)。