離線包的管理操作包括:預置 H5 應用、利用全域資源套件、更新 H5 應用、下載 H5 應用、安裝 H5 應用、擷取應用資訊、校正安全簽名以及刪除本地應用。
前置條件
預置 H5 應用
通常情況下,第一次開啟 H5 應用時,離線包可能未完成下載。此時,需要通過使用 fallback URL 的方式開啟應用。
預置 H5 應用相當於在用戶端發布的安裝包中預先安裝可用的 H5 應用。當使用者第一次開啟預先安裝應用時,可直接使用離線包資源,提高使用者體驗。
建議您只預裝核心 H5 應用,避免預置了使用率不高的應用。
預置 H5 應用需要完成以下步驟:
從 H5 應用發布後台下載 H5 應用配置的
.json
檔案以及需要預置的離線包。將
.json
檔案和離線包添加到工程的asset
目錄下。在應用啟動時,調用預置代碼安裝應用,範例程式碼如下:
MPNebula.loadOfflineNebula("h5_json.json", new MPNebulaOfflineInfo("90000000_1.0.0.6.amr", "90000000", "1.0.0.6"));
說明此方法為阻塞調用,請不要在主線程上調用內建離線包方法。
此方法僅能調用一次,若多次調用,僅第一次調用有效。所以需要一次性傳入所有需預置的離線包資訊。
如果內建多個 amr 包,要確保檔案已存在,如不存在,會造成其他內建離線包失敗。
利用全域資源套件
Nebula 全域資源套件解決多個 H5 應用使用同一資源產生的冗餘問題。如 React 應用使用 ReactJS 架構代碼。您可以將公用資源放入全域資源套件,以降低 H5 應用體積。
通常情況下,專案需預置全域資源套件,後續更新依然可以通過 H5 應用後台下發。
下方的範例程式碼指定應用 ID (appId
) 為 66666692
的離線包作為全域資源套件使用,並預置 assets/nebulaPreset/66666692
離線包,其中:
getCommonResourceAppList
:用於告知 H5 容器指定 ID 的離線包將作為全域資源套件使用。如果您沒有配置此 ID,即使內建該離線包,也不會生效。getH5PresetPkg
:用於指定內建全域資源套件的路徑和版本。H5 容器會從指定的 asset 資來源目錄載入資源套件。不過如果服務端發現更高的版本,該低版本內建包將不會被載入。另外,您也可以使用上文提及的loadOffLineNebula
方法來預置全域資源套件,此種情況下,您無需在此方法中配置內建離線包的路徑和版本。說明該方法只適用於 H5 全域資源套件。
getTinyCommonApp
:僅用於返回小程式的架構資源套件 ID,如果您的全域資源套件僅被 H5 使用,請不要在此方法中寫入該公用資源套件 ID。
參考實作類別範例程式碼:
public class H5AppCenterPresetProviderImpl implements H5AppCenterPresetProvider {
private static final String TAG = "H5AppCenterPresetProviderImpl";
// 業務的公用資源套件,盡量避開666666開頭
private static final String COMMON_BIZ_APP = "xxxxxxxx";
// 小程式專用資源包,業務勿動
private static final String TINY_COMMON_APP = "66666692";
// 預置包的 asset 目錄
private final static String NEBULA_APPS_PRE_INSTALL = "nebulaPreset" + File.separator;
// 預置包集合
private static final Map<String, H5PresetInfo> NEBULA_LOCAL_PACKAGE_APP_IDS = new HashMap();
static {
H5PresetInfo h5PresetInfo2 = new H5PresetInfo();
// 內建目錄的檔案名稱
h5PresetInfo2.appId = TINY_COMMON_APP;
h5PresetInfo2.version = "1.0.0.0";
h5PresetInfo2.downloadUrl = "";
NEBULA_LOCAL_PACKAGE_APP_IDS.put(TINY_COMMON_APP, h5PresetInfo2);
}
@Override
public Set<String> getCommonResourceAppList() {
Set<String> appIdList = new HashSet<String>();
appIdList.add(getTinyCommonApp());
appIdList.add(COMMON_BIZ_APP);
return appIdList;
}
@Override
public H5PresetPkg getH5PresetPkg() {
H5PresetPkg h5PresetPkg = new H5PresetPkg();
h5PresetPkg.setPreSetInfo(NEBULA_LOCAL_PACKAGE_APP_IDS);
h5PresetPkg.setPresetPath(NEBULA_APPS_PRE_INSTALL);
return h5PresetPkg;
}
@Override
public Set<String> getEnableDegradeApp() {
return null;
}
@Override
public String getTinyCommonApp() {
return TINY_COMMON_APP;
}
@Override
public InputStream getPresetAppInfo() {
return null;
}
@Override
public InputStream getPresetAppInfoObject() {
return null;
}
}
然後在應用啟動時調用:
H5Utils.getH5ProviderManager().setProvider(H5AppCenterPresetProvider.class.getName(), new H5AppCenterPresetProviderImpl());
更新 H5 應用
預設情況下,每次開啟 H5 應用,Nebula 都會嘗試檢查是否有可更新的版本。出於服務端壓力考慮,該檢查有時間間隔限制,預設為 30 分鐘。如果想立即檢查最新的可用版本,可以調用下方的代碼來請求更新。一般情況下,可以在應用啟動或者使用者登入後調用。
MPNebula.updateAllApp(new MpaasNebulaUpdateCallback(){
@Override
public void onResult(final boolean success, final boolean isLimit, String detailCode) {
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();
}
});
}
});
下載 H5 應用
MPNebula 提供了手動下載 H5 應用的介面:
/**
* 下載離線包
*
* @param appId 離線包 id
* @param mpaasNebulaDownloadCallback 下載回調
*/
public static void downloadApp(final String appId, final MpaasNebulaDownloadCallback mpaasNebulaDownloadCallback)
安裝 H5 應用
MPNebula 提供了手動安裝 H5 應用的介面:
/**
* 安裝離線包
*
* @param appId 離線包 id
* @param mpaasNebulaInstallCallback 安裝回調
*/
public static void installApp(final String appId, final MpaasNebulaInstallCallback mpaasNebulaInstallCallback)
擷取應用資訊
調用 H5AppProvider 的方法以擷取 H5 應用的相關資訊:
H5AppProvider provider = H5Utils.getProvider(H5AppProvider.class.getName());
AppInfo appInfo = provider.getAppInfo("10000000"); //擷取應用配置
boolean isInstalled = provider.isInstalled("10000000", "1.0.0.0"); //某版本應用是否已經安裝
boolean isAvailable = provider.isAvailable("10000000", "1.0.0.0"); //某版本應用離線包是否已經下載完成
校正安全簽名
Nebula 具有離線包簽名校正機制,以防止惡意程式篡改下載到裝置的離線包。通過調用 MPNebula
介面設定驗簽參數即可開啟此機制。如果您使用的基準是 10.1.60 或以上版本,需要額外開啟容器配置,詳情參見 H5 容器配置。
請在第一次開啟離線包前調用
MPNebula
介面,否則將會導致公開金鑰初始化失敗。關於公開金鑰與私密金鑰,參見 配置離線包 > 密鑰管理。無論用戶端是否開啟簽名校正,在被判斷為 root 的手機上都會強制進行簽名校正。
/** * @param publicKey 驗簽公開金鑰 */ public static void enableAppVerification(final String publicKey)
刪除本地應用
Nebula 提供了刪除本地應用資訊的介面。當本地應用資訊被刪除後,再次開啟應用時會重新請求服務端下載更新本地應用資訊。
public class MPNebula {
// appId 為離線包或小程式的應用 ID
public static boolean deleteAppInfo(String appId);
}
此 API 支援的最低基準版本分別為 10.1.68.8 和 10.1.60.14。