本文介紹接入 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)。