Do平臺的應用升級包含二種升級方式,一種是最常用的安裝包的升級,另外一種是應用內升級。很顯然第二種升級方式更靈活。 應用安裝包升級 原生應用通常的升級方式就是這種,比如android的安裝包是apk文件,ios的安裝包是ipa文件。如果要升級,只能重新下載一個新的apk/ipa文件,然後安裝覆蓋舊的 ...
Do平臺的應用升級包含二種升級方式,一種是最常用的安裝包的升級,另外一種是應用內升級。很顯然第二種升級方式更靈活。
應用安裝包升級
原生應用通常的升級方式就是這種,比如android的安裝包是apk文件,ios的安裝包是ipa文件。如果要升級,只能重新下載一個新的apk/ipa文件,然後安裝覆蓋舊的版本,基本流程如下:
調用do_Global.getVersion()方法檢查當前應用的版本號
通過do_Http發送GET/POST請求升級服務端,請求當前應用的最新的版本號,這個服務端是開發者自己搭建,和Do平臺無關。
比較這二個版本號,如果不一樣,則調用do_External.openURL()方法使用操作系統帶的瀏覽器打開下載應用的網頁。在網頁上下載安裝新的應用覆蓋舊的應用。
這裡要註意的是:
-
如果要生成一個特定版本號的App,需要在
應用配置
-平臺配置
-版本
的地方設置一下版本號,然後再打一個發佈版本。 -
還有就是如果在新版本的應用里更新了一個組件的版本,或者增加了某個組件,應用安裝包升級是必須的過程,這相當於功能的更新。不能使用應用內升級。
-
iOS的app如果想發佈到組件商店上,是不允許使用程式檢測版本號來升級,只能用iOS自帶的操作系統的升級管理。否則不能上Appstore。但是如果是用企業證書,不受這個限制。
升級的過程比較簡單,我們就不提供示例代碼了。
應用內升級
應用內升級並不是Do平臺的特有功能,但是Do平臺使用應用內升級還是很方便的。應用內升級可以理解為增量升級,替換任何項目文件。
檢查當前應用的版本號,這個版本號可能是從文件里讀出來的,可能是從SQLite資料庫讀出來的,反正這個版本的讀和寫都是由用戶來決定。
通過do_Http發送GET/POST請求升級服務端,請求當前應用的最新的版本號,這個版本號是指應用內源代碼的版本號,服務端是開發者自己搭建,和Do平臺無關,而且版本號的維護也是由開發者來決定。
比較這二個版本號,如果不一樣,則調用do_Http.download方法下載升級包,通常是一個zip文件。
下載後,解壓這個zip文件到data:// 下一個目錄
利用do_App的update方法拷貝所有的最新文件拷貝到source:// 下對應的目錄,覆蓋舊的文件。並更新新的版本到文件或資料庫。
這裡要註意的是:
-
升級的頁面只有再次打開才能看到變化,比如當前頁面更新了,需要退出這個頁面再打開才能看到變化。假如升級的是首頁,則需要退出應用重新打開App了。
-
如果選擇了代碼加密,則更新的文件也必須是加密過,而且是同樣的deviceone開發者賬號下的同樣的應用id。目前還沒有提供一個方便的方式隨意加密任何源代碼,只能重新打包,再從打出的包扣出相應的加密過的代碼。
參考一個示例Demo,主要的源代碼如下:
var button = ui("do_Button_1"); button.on("touch", function() { upgrade(); }); function upgrade() { // 獲取當前應用的版本號 var current_version = storage.readFileSync("data://version.txt"); // 獲取服務端最新的版本號,並下載升級 // 因為沒有搭建一個真正的升級服務,所以先註釋這一行且直接調用update方法 // getLatestVersion(current_version); update("1.1", "data://update.zip"); } // 從伺服器上獲取最新的版本號 function getLatestVersion(ver) { var http = mm("do_Http"); http.method = "GET"; http.url = "http://www.xxxx.com/getLatestVersion?current=" + ver; http.on("success", function(d) { // 服務端判斷最新的版本不等於當前的版本就會返回一個最新版本和下載地址,否則返回空 if (d) { // 開始下載最新zip download(d); } else nf.alert("當前版本已經是最新版本"); }); http.request(); } // 從伺服器上獲取最新的升級包 function download(d) { var http = mm("do_Http"); var zip = "data://update.zip"; http.method = "POST"; // d.downlaodURL是zip的下載url,d.version是最新的版本號 http.url = d.downloadURL; http.on("success", function(d) { update(d.version, zip); }); http.download(zip); } // 解壓,然後覆蓋舊的文件,然後更新本地版本號 function update(ver, zip) { storage.unzip(zip, "data://update", function(data) { // 這裡可以拷貝文件,也可以拷貝目錄 app.update([ "data://update/test.ui", "data://update/test.ui.js" ], "source://view", function() { nf.alert("升級完成"); storage.writeFile("data://version.txt", "1.1",function(){ app.closePage(); }); }); }) }
這個示例的下載參考這裡