UNI-APP 資源在線升級/熱更新

官方已發(fā)布APP升級中心,支持原生APP整包升級和wgt資源包升級。詳見 https://uniapp.dcloud.io/uniCloud/upgrade-center

注:本文為前端代碼資源熱更新蹬挤。如果是整包升級,另見文檔 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 這樣因惭。

發(fā)行

然后岳锁,在 HBuilderX 中生成升級包(wgt)。
菜單->發(fā)行->原生App-制作移動App資源升級包

生成結(jié)束會在控制臺告知升級包的輸出位置蹦魔。

安裝資源升級包

應用的升級需要服務端與客戶端配合完成激率,下面以本地測試過程中的操作舉例說明:

存放資源

%appid%.wgt 文件存放在服務器的 static 目錄下,即 http://www.example.com/static/**UNI**832D722.wgt勿决。

服務端接口

約定檢測升級的接口乒躺,地址為:http://www.example.com/update/

傳入?yún)?shù)

參數(shù)名 類型 默認值 說明
name String '' 客戶端讀取到的應用名稱,定義這個參數(shù)可以方便多個應用復用接口低缩。
version String '' 客戶端讀取到的版本號信息

返回參數(shù)

參數(shù)名 類型 默認值 說明
update Boolean false 是否有更新
wgtUrl String '' wgt 包的下載地址嘉冒,用于 wgt 方式更新。
pkgUrl String '' apk/ipa 包的下載地址或 AppStore 地址表制,用于整包升級的方式健爬。

代碼示例

下面是一個簡單的服務端判定的示例,僅做參考么介,實際開發(fā)中根據(jù)自身業(yè)務需求處理。

var express = require('express');  
var router = express.Router();  
var db = require('./db');  

// TODO 查詢配置文件或者數(shù)據(jù)庫信息來確認是否有更新  
function checkUpdate(params, callback) {  
    db.query('一段SQL', function(error, result) {  
        // 這里簡單判定下蜕衡,不相等就是有更新壤短。  
        var currentVersions = params.appVersion.split('.');  
        var resultVersions = result.appVersion.split('.');  

        if (currentVersions[0] < resultVersions[0]) {  
            // 說明有大版本更新  
            callback({  
                update: true,  
                wgtUrl: '',  
                pkgUrl: result.pkgUrl  
            })  
        } else {  
            // 其它情況均認為是小版本更新  
            callback({  
                update: true,  
                wgtUrl: result.wgtUrl,  
                pkgUrl: ''  
            })  
        }  
    });  
}  

router.get('/update/', function(req, res) {  
    var appName = req.query.name;  
    var appVersion = req.query.version;  
    checkUpdate({  
        appName: appName,  
        appVersion: appVersion  
    }, function(error, result) {  
        if (error) {  
            throw error;  
        }  
        res.json(result);  
    });  
});

注意事項

  • 以上約定,僅做參考慨仿。
  • 服務端的具體判定邏輯久脯,請根據(jù)自身的業(yè)務邏輯靈活處理。
  • 應用中的路徑盡量不要包含特殊符號

客戶端檢測升級

在 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 部分有調(diào)整帘撰,比如新增了 Maps 模塊等,不可通過此方式升級万皿,必須通過整包的方式升級摧找。
  • 原生插件的增改,同樣不能使用此方式牢硅。
    對于老的非自定義組件編譯模式蹬耘,這種模式已經(jīng)被淘汰下線。但以防萬一也需要說明下减余,老的非自定義組件編譯模式综苔,如果之前工程沒有 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() 來獲取相關(guān)信息妇垢。
  • 安裝 wgt 資源包成功后,必須執(zhí)行 plus.runtime.restart()肉康,否則新的內(nèi)容并不會生效闯估。
  • 如果App的原生引擎不升級,只升級wgt包時需要注意測試wgt資源和原生基座的兼容性吼和。平臺默認會對不匹配的版本進行提醒涨薪,如果自測沒問題,可以在manifest中配置忽略提示炫乓,詳見 https://ask.dcloud.net.cn/article/35627
  • www.example.com 是一個僅用做示例說明的地址刚夺,實際應用中應該是真實的 IP 或有效域名,請勿直接復制粘貼使用末捣。

關(guān)于熱更新是否影響應用上架

應用市場為了防止開發(fā)者不經(jīng)市場審核許可侠姑,給用戶提供違法內(nèi)容,對熱更新大多持排斥態(tài)度箩做。

但實際上熱更新使用非常普遍莽红,不管是原生開發(fā)中還是跨平臺開發(fā)。

Apple曾經(jīng)禁止過jspatch邦邦,但沒有打擊其他的熱更新方案安吁,包括cordovar、react native圃酵、DCloud柳畔。封殺jspatch其實是因為jspatch有嚴重安全漏洞,可以被黑客利用郭赐,造成三方黑客可篡改其他App的數(shù)據(jù)薪韩。

使用熱更新需要注意:

  • 上架審核期間不要彈出熱更新提示
  • 熱更新內(nèi)容使用https下載确沸,避免被三方網(wǎng)絡劫持
  • 不要更新違法內(nèi)容、不要通過熱更新破壞應用市場的利益俘陷,比如iOS的虛擬支付要老老實實給Apple分錢
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罗捎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拉盾,更是在濱河造成了極大的恐慌桨菜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捉偏,死亡現(xiàn)場離奇詭異倒得,居然都是意外死亡,警方通過查閱死者的電腦和手機夭禽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門霞掺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讹躯,你說我怎么就攤上這事菩彬。” “怎么了潮梯?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵骗灶,是天一觀的道長。 經(jīng)常有香客問我秉馏,道長耙旦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任沃饶,我火速辦了婚禮母廷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糊肤。我一直安慰自己,他們只是感情好氓鄙,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布馆揉。 她就那樣靜靜地躺著,像睡著了一般抖拦。 火紅的嫁衣襯著肌膚如雪升酣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天态罪,我揣著相機與錄音噩茄,去河邊找鬼。 笑死复颈,一個胖子當著我的面吹牛绩聘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼凿菩,長吁一口氣:“原來是場噩夢啊……” “哼机杜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衅谷,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤椒拗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后获黔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚀苛,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年玷氏,在試婚紗的時候發(fā)現(xiàn)自己被綠了堵未。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡预茄,死狀恐怖兴溜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耻陕,我是刑警寧澤拙徽,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站诗宣,受9級特大地震影響膘怕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜召庞,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一岛心、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篮灼,春花似錦忘古、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娘荡,卻和暖如春干旁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炮沐。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工争群, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人大年。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓换薄,卻偏偏與公主長得像玉雾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子专控,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容