在客戶端預(yù)置 Android 小程序
傳統(tǒng)的小程序技術(shù)容易受到網(wǎng)絡(luò)環(huán)境影響,當(dāng)網(wǎng)絡(luò)質(zhì)量不佳時可能拉取不到小程序包。通過預(yù)置小程序即可規(guī)避該問題。本文介紹了預(yù)置小程序的原理和預(yù)置小程序的實現(xiàn)過程。
什么是預(yù)置小程序
預(yù)置小程序是指將小程序的渲染、邏輯、配置等靜態(tài)資源打包在一個壓縮包內(nèi),客戶端預(yù)先下載小程序包到本地,并直接從本地加載資源的過程。預(yù)置小程序可以最大程度地擺脫網(wǎng)絡(luò)環(huán)境對 mPaaS 小程序頁面的影響。使用預(yù)置包可帶來以下優(yōu)勢:
提升用戶體驗 通過預(yù)置包的方式把頁面內(nèi)靜態(tài)資源嵌入到應(yīng)用中并隨應(yīng)用一起發(fā)布,可使用戶第一次打開應(yīng)用時無需依賴網(wǎng)絡(luò)環(huán)境去下載資源,可直接開始使用。
實現(xiàn)動態(tài)更新 在推出新版本或緊急發(fā)布時,可以在小程序 IDE 中進行迭代開發(fā),通過 mPaaS 控制臺發(fā)布,客戶端中集成的小程序 SDK 會自動將小程序更新到最新的版本。這種發(fā)布無需通過應(yīng)用商店審核,可以讓用戶及早接收到更新。
結(jié)構(gòu)及使用
本文從以下方面介紹了預(yù)置小程序:
小程序預(yù)置包的結(jié)構(gòu)
小程序預(yù)置包的使用過程
小程序預(yù)置包的結(jié)構(gòu)
小程序預(yù)置包是一個 .amr
格式的壓縮文件,將后綴 .amr
改為 .zip
并解壓縮后,可以看到其中包含的 HTML 資源和 JavaScript 代碼等。待小程序容器加載后,這些資源和代碼能在 UC 內(nèi)核渲染。
以 Android 系統(tǒng)為例,下面顯示了一般資源包的目錄結(jié)構(gòu):
一級目錄:一般為資源包的 ID,如
2020121620201216_1.0.1.0.zip
。二級目錄及往后即為業(yè)務(wù)自定義的資源文件。并設(shè)定當(dāng)前預(yù)置包默認(rèn)打開的主入口文件,如
/index.html
。
小程序預(yù)置包的使用過程
使用小程序預(yù)置包的過程可以分為以下三個步驟:
請求包信息。 即從服務(wù)端請求小程序包,并將小程序包信息存儲到本地數(shù)據(jù)庫的過程。包信息包含了小程序包的下載地址、小程序包版本號等。
下載小程序包。 把小程序包從服務(wù)端下載到手機。
安裝小程序包。 下載目錄,拷貝到手機安裝目錄。
前提條件
您已接入小程序組件。更多關(guān)于小程序組件的接入信息,請參見 快速開始使用小程序。
您已接入 H5 容器組件。更多關(guān)于 H5 容器的接入信息,請參見 快速開始使用 H5 容器。
操作步驟
預(yù)置小程序包。
在 mPaaS 控制臺發(fā)布小程序包并下載 AMR 文件和配置文件。
將下載到的 AMR 文件和配置文件放置在 mPaaS 項目的 assets 目錄下。
在工程中添加預(yù)置代碼,以在應(yīng)用啟動時調(diào)用預(yù)置代碼安裝應(yīng)用。預(yù)置代碼示例如下:
new Thread(new Runnable(){ @Override public void run(){ MPNebula.loadofflineNebula(jsonFileName: "h5_json.json", new MPNebulaOfflineInfo(offLineFileName:"2020121620201216_1.0.1.0.amr", addId:"2020121620201216", version:"1.0.1.0")); } }).start();
說明此方法為阻塞調(diào)用,請勿在主線程上調(diào)用內(nèi)置預(yù)置包方法。
此方法僅能調(diào)用一次。若多次調(diào)用,僅第一次調(diào)用有效。所以需要一次性傳入所有需預(yù)置包信息。
如果內(nèi)置多個 AMR 包,需要確保文件已存在;如不存在,會造成其他內(nèi)置預(yù)置包失敗。
啟動小程序。啟動小程序的示例代碼如下。
/** * 啟動小程序 * * @param appId 小程序id */ public static void startApp(String appId);
更新小程序。 默認(rèn)情況下,每次打開應(yīng)用,小程序 SDK 都會嘗試檢查是否有可更新的版本。出于減少服務(wù)端壓力的考慮,該檢查有時間間隔限制,默認(rèn)為 30 分鐘。如果想立即檢查最新可用版本,可調(diào)用下方的代碼來請求更新。一般情況下,可以在應(yīng)用啟動或者用戶登錄后調(diào)用。
MPNebula.updateAllApp(new MpaasNebulaUpdateCallback(){ @Override public void onResult(final boolean success, final boolean isLimit) { super.onResult(success, isLimit); runOnUiThread(new Runnable() { @Override public void run() { AUToast.makeToast(NebulaAppActivity.this, success ? R.string.update_success : R.string.update_failure, 2000).show(); } }); } });
校驗安全簽名。 小程序具有簽名校驗機制,防止惡意程序篡改下載到設(shè)備的小程序包。通過調(diào)用 MPNebula 接口設(shè)置驗簽參數(shù)即可開啟此機制。如果您使用的基線是 10.1.60 或以上版本,需要額外開啟容器配置,詳情參見 H5 容器配置。
說明請在第一次打開小程序包前調(diào)用 MPNebula 接口,否則將會導(dǎo)致公鑰初始化失敗。關(guān)于公鑰與私鑰,請參見 配置小程序包 > 密鑰管理。
無論客戶端是否開啟簽名校驗,在被判斷為 root 的手機上都會強制進行簽名校驗。
/** * @param publicKey 驗簽公鑰 */ public static void enableAppVerification(final String publicKey)
刪除本地小程序。 Nebula 提供了刪除本地應(yīng)用信息的接口。當(dāng)本地應(yīng)用信息被刪除后,再次打開應(yīng)用時會重新請求服務(wù)端下載、更新本地小程序的信息。
public class MPNebula { // appId 為小程序的應(yīng)用 ID public static boolean deleteAppInfo(String appId); }
說明此 API 在 10.1.68 系列和 10.1.60 系列支持的最低基線版本分別為 10.1.68.8 和 10.1.60.14 。