在客戶端預(yù)置 iOS 小程序
傳統(tǒng)的小程序技術(shù)容易受到網(wǎng)絡(luò)環(huán)境影響,當網(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)用商店審核,可以讓用戶及早接收到更新。
前提條件
您已接入小程序組件。更多關(guān)于小程序組件的接入信息,請參見 快速開始使用小程序。
操作步驟
預(yù)置小程序包。
在 mPaaS 控制臺發(fā)布小程序包并下載 AMR 文件和配置文件。
新建一個獨立的 bundle,如
DemoCustomPresetApps.bundle
,將從發(fā)布平臺下載的 AMR 離線包和h5_json.json
文件添加到此 bundle 中。說明目前發(fā)布平臺僅支持下載單個離線包的
h5_json.json
配置文件。當預(yù)置多個小程序包時,需要將不同h5_json.json
中的 data 數(shù)據(jù)手動合并到一個配置文件中。初始化小程序時,在
initNebulaWithCustomPresetApplistPath
接口中設(shè)置預(yù)置小程序離線包路徑為上一步中創(chuàng)建的 bundle。- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 初始化 rpc [MPRpcInterface initRpc]; // 初始化容器 // [MPNebulaAdapterInterface initNebula]; // 自定義jsapi路徑和預(yù)置小程序包信息 NSString *presetApplistPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"DemoCustomPresetApps.bundle/h5_json.json"] ofType:nil]; NSString *appPackagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"DemoCustomPresetApps.bundle"] ofType:nil]; NSString *pluginsJsapisPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"DemoCustomPlugins.bundle/Poseidon-UserDefine-Extra-Config.plist"] ofType:nil]; [MPNebulaAdapterInterface initNebulaWithCustomPresetApplistPath:presetApplistPath customPresetAppPackagePath:appPackagePath customPluginsJsapisPath:pluginsJsapisPath]; }
啟動小程序。與非預(yù)置小程序類似,進入對應(yīng)的頁面時,調(diào)用 Nebula 容器提供的接口方法加載小程序。
[MPNebulaAdapterInterface startTinyAppWithId:@"2020121720201217" params:nil];
更新小程序。默認情況下,每次打開應(yīng)用,小程序 SDK 都會嘗試檢查是否有可更新的版本。出于減少服務(wù)端壓力的考慮,該檢查有時間間隔限制,默認為 30 分鐘。如果想立即檢查最新可用版本,可調(diào)用下方的代碼來請求更新。一般情況下,可以在應(yīng)用啟動或者用戶登錄后調(diào)用。
-(void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ //全量更新本地小程序包信息 [[MPNebulaAdapterInterface shareInstance] requestAllNebulaApps:^(NSDictionary *data, NSError *error) { NSLog(@"[mpaas] nebula rpc data :%@", data); }]; }
校驗安全簽名。小程序具有簽名校驗機制,防止惡意程序篡改下載到設(shè)備的小程序包。通過調(diào)用小程序接口設(shè)置驗簽參數(shù)即可開啟此機制。
說明請在第一次打開小程序包前調(diào)用
MPNebulaAdapterInterface
接口,否則將會導(dǎo)致公鑰初始化失敗。關(guān)于公鑰與私鑰,請參見 配置小程序包 > 密鑰管理。開啟驗簽。
[MPNebulaAdapterInterface shareInstance].nebulaNeedVerify = YES;
刪除本地小程序。Nebula 提供了刪除本地應(yīng)用信息的接口。當本地應(yīng)用信息被刪除后,再次打開應(yīng)用時會重新請求服務(wù)端下載、更新本地小程序的信息。
/** * @brief 刪除本地應(yīng)用信息(包括包信息、amr以及安裝目錄) * * @date 2019-02-28 * * @return */ -(void)clearAllAppInfo:(NSString *)appId; //使用方法 [[NBServiceGet() appCenter] clearAllAppInfo:@"2020199503242811"];