注:本文為前端代碼資源熱更新。如果是整包升級,另見文檔 https://ask.dcloud.net.cn/article/34972
HBuilderX 1.6.5 起,uni-app 支持生成 App 資源升級包。
生成 App 資源升級包
修改版本號
首先,更新 manifest.json 中的版本號。
比如之前是 1.0.0,那么新版本應該是 1.0.1 或 1.1.0 這樣。
發行
然后,在 HBuilderX 中生成升級包(wgt)。
菜單->發行->原生App-制作移動App資源升級包
生成結束會在控制台告知升級包的輸出位置。
安裝資源升級包
應用的升級需要服務端與客戶端配合完成,下面以本地測試過程中的操作舉例說明:
存放資源
將 %appid%.wgt 文件存放在服務器的 static 目錄下,即 http://www.example.com/static/UNI832D722.wgt。
客戶端檢測升級
在 App.vue 的 onLaunch 中檢測升級,代碼如下:
// #ifdef APP-PLUS
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
uni.request({
url: 'http://www.example.com/update/',
data: {
version: widgetInfo.version,
name: widgetInfo.name
},
success: (result) => {
var data = result.data;
if (data.update && data.wgtUrl) {
uni.downloadFile({
url: data.wgtUrl,
success: (downloadResult) => {
if (downloadResult.statusCode === 200) {
plus.runtime.install(downloadResult.tempFilePath, {
force: false
}, function() {
console.log('install success...');
plus.runtime.restart();
}, function(e) {
console.error('install fail...');
});
}
}
});
}
}
});
});
// #endif
不支持的情況
- SDK 部分有調整,比如新增了 Maps 模塊等,不可通過此方式升級,必須通過整包的方式升級。
- 如果是老的非自定義組件編譯模式,之前沒有 nvue 文件,但更新中新增了 nvue 文件,不能使用此方式。因為非自定義組件編譯模式如果沒有nvue文件是不會打包weex引擎進去的,原生引擎無法動態添加。自定義組件模式默認就含着weex引擎,不管工程下有沒有nvue文件。
- 原生插件的增改,同樣不能使用此方式。
注意事項
- 條件編譯,僅在 App 平台執行此升級邏輯。
- appid 以及版本信息等,在 HBuilderX 真機運行開發期間,均為 HBuilder 這個應用的信息,因此需要打包自定義基座或正式包測試升級功能。
- plus.runtime.version 或者 uni.getSystemInfo() 讀取到的是 apk/ipa 包的版本號,而非 manifest.json 資源中的版本信息,所以這里用 plus.runtime.getProperty() 來獲取相關信息。
- 安裝 wgt 資源包成功后,必須執行 plus.runtime.restart(),否則新的內容並不會生效。
- 如果App的原生引擎不升級,只升級wgt包時需要注意測試wgt資源和原生基座的兼容性。平台默認會對不匹配的版本進行提醒,如果自測沒問題,可以在manifest中配置忽略提示,詳見https://ask.dcloud.net.cn/article/35627
- www.example.com 是一個僅用做示例說明的地址,實際應用中應該是真實的 IP 或有效域名,請勿直接復制粘貼使用。
關於熱更新是否影響應用上架
應用市場為了防止開發者不經市場審核許可,給用戶提供違法內容,對熱更新大多持排斥態度。
但實際上熱更新使用非常普遍,不管是原生開發中還是跨平台開發。
Apple曾經禁止過jspatch,但沒有打擊其他的熱更新方案,包括cordovar、react native、DCloud。封殺jspatch其實是因為jspatch有嚴重安全漏洞,可以被黑客利用,造成三方黑客可篡改其他App的數據。
使用熱更新需要注意:
- 上架審核期間不要彈出熱更新提示
- 熱更新內容使用https下載,避免被三方網絡劫持
- 不要更新違法內容、不要通過熱更新破壞應用市場的利益,比如iOS的虛擬支付要老老實實給Apple分錢
- 如果你的應用沒有犯這些錯誤,應用市場是不會管的。