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(); }); }); }) }
这个示例的下载参考这里