在進行版本迭代時一般是局部更新,所以熱更新就是新的需求,HBuilderX 1.6.5 起,uni-app 支持生成 App 資源升級包。
完成新需求,需要熱更新時,具體步驟如下:
1:熱更新程序代碼:
在App.vue文件中的onLaunch中編碼
onLaunch() {
let _this = this;
// #ifdef APP-PLUS
/** 鎖定屏幕方向 */
plus.screen.lockOrientation('portrait-primary');
? ? ? ? ? ? console.log("onLaunch111")
/** 檢測升級 */
// 取得版本號
plus.runtime.getProperty(plus.runtime.appid, function(info) {
console.log("當前應用版本:" + info.version + "---" + plus.runtime.version);
_this.$com.ajax("update", {
"appid": plus.runtime.appid,
"version": plus.runtime.version
}, "POST", false,function(ret) {
console.log("【appid】", plus.runtime.appid)
console.log("【version】", plus.runtime.version)
? ? console.log("版本升級接口回調", ret)
if (ret.status) {
// 下載wgt文件?
var wgtUrl = "https://xxxxx.cn/update/1.0.1.wgt";? //下載文件地址(也可以從后臺獲?。?/p>
plus.nativeUI.showWaiting("正在更新中,請稍后..");
plus.downloader.createDownload(wgtUrl, {
filename: "_doc/update/"
}, function(d, status) {
if (status == 200) {
let path =d.filename
// 安裝wgt包 更新應用資源
plus.nativeUI.showWaiting("正在更新中,請稍后...");
plus.runtime.install(d.filename, {
force: true
}, function() {
plus.nativeUI.closeWaiting();
console.log("新版本文件成功!");
plus.nativeUI.alert("軟件應用更新完成!", function() {
plus.runtime.restart(); //必須執(zhí)行 plus.runtime.restart(),否則新的內容并不會生
});
}, function(e) {
console.log(e)
plus.nativeUI.closeWaiting();
console.log("更新失敗[" + e.code + "]:" + e.message);
plus.nativeUI.alert("更新失敗[" + e.code + "]:" + e.message);
});
} else {
console.log("下載wgt失??!");
plus.nativeUI.alert("下載wgt失??!");
}
plus.nativeUI.closeWaiting();
}).start();
}
})
})
// #endif
},
2:更新 manifest.json 中的版本號(比如之前是 1.0.0,那么新版本應該是 1.0.1 或 1.1.0,小版本更新一般為1.0.1,大版本的話1.1.0)

3:發(fā)行,在 HBuilderX 中生成升級包(wgt),菜單->發(fā)行->原生App-制作移動App資源升級包 ,輸出wgt文件地址后,將文件放在服務器上就可以了。重新啟動APP后配合后端測試驗證。
< PPSS 后續(xù)請注意?。? >
不支持的情況
SDK 部分有調整,比如新增了 Maps 模塊等,不可通過此方式升級,必須通過整包的方式升級。
如果是老的非自定義組件編譯模式,之前沒有 nvue 文件,但更新中新增了 nvue 文件,不能使用此方式。因為非自定義組件編譯模式如果沒有nvue文件是不會打包weex引擎進去的,原生引擎無法動態(tài)添加。自定義組件模式默認就含著weex引擎,不管工程下有沒有nvue文件。
原生插件的增改,同樣不能使用此方式。
注意事項
條件編譯,僅在 App 平臺執(zhí)行此升級邏輯。
appid 以及版本信息等,在 HBuilderX 真機運行開發(fā)期間,均為 HBuilder 這個應用的信息,因此需要打包自定義基座或正式包測試升級功能。
plus.runtime.version 或者 uni.getSystemInfo() 讀取到的是 apk/ipa 包的版本號,而非 manifest.json 資源中的版本信息,所以這里用 plus.runtime.getProperty() 來獲取相關信息。
安裝 wgt 資源包成功后,必須執(zhí)行 plus.runtime.restart(),否則新的內容并不會生效。
如果App的原生引擎不升級,只升級wgt包時需要注意測試wgt資源和原生基座的兼容性。平臺默認會對不匹配的版本進行提醒,如果自測沒問題,可以在manifest中配置忽略提示,詳見https://ask.dcloud.net.cn/article/35627
關于熱更新是否影響應用上架
應用市場為了防止開發(fā)者不經市場審核許可,給用戶提供違法內容,對熱更新大多持排斥態(tài)度。
但實際上熱更新使用非常普遍,不管是原生開發(fā)中還是跨平臺開發(fā)。
Apple曾經禁止過jspatch,但沒有打擊其他的熱更新方案,包括cordovar、react native、DCloud。封殺jspatch其實是因為jspatch有嚴重安全漏洞,可以被黑客利用,造成三方黑客可篡改其他App的數據。
使用熱更新需要注意:
上架審核期間不要彈出熱更新提示
熱更新內容使用https下載,避免被三方網絡劫持
不要更新違法內容、不要通過熱更新破壞應用市場的利益,比如iOS的虛擬支付要老老實實給Apple分錢
如果你的應用沒有犯這些錯誤,應用市場是不會管的。