AppWorker

AppWorker教程-应用升级

2018-06-22  本文已影响0人  wtcgzh

应用升级

AppWorker平台的应用升级包含二种升级方式,一种是最常用的安装包的升级,另外一种是应用内升级。很显然第二种升级方式更灵活。

注意:这2种升级是完全不相关的,没有任何关联的。包括版本号,包括升级服务端都是2套体系,大家不要混在一起。

应用安装包升级

原生应用通常的升级方式就是这种,比如android的安装包是apk文件,ios的安装包是ipa文件。如果要升级,只能重新下载一个新的apk/ipa文件,然后安装覆盖旧的版本,基本流程如下:

1.调用do_Global.getVersion()方法检查当前应用的版本号
通过do_Http发送GET/POST请求升级服务端,请求当前应用的最新的版本号,这个服务端是开发者自己搭建,和Do平台无关。
2.比较这二个版本号,如果不一样,则调用do_External.openURL()方法使用操作系统带的浏览器打开下载应用的网页。在网页上下载安装新的应用覆盖旧的应用。

这里要注意的是:

  1. 如果要生成一个特定版本号的App,需要在应用配置-平台配置-版本的地方设置一下版本号,然后再打一个发布版本。
    image
  1. 还有就是如果在新版本的应用里更新了一个组件的版本,或者增加了某个组件,应用安装包升级是必须的过程,这相当于功能的更新。不能使用应用内升级。
  1. 苹果App Store将向用户自动提示更新,新提交审核版本如果保留检查更新入口审核时将被拒绝。所以如果想发布到组件商店上,是不允许使用程序检测版本号来升级,只能用iOS自带的操作系统的升级管理。否则不能上Appstore。但是如果是用企业证书,不受这个限制。

升级的过程比较简单,我们就不提供示例代码了。

应用内升级

应用内升级并不是AppWorker平台的特有功能,但是AppWorker平台使用应用内升级还是很方便的。
有二种方法

1. 直接下载ui和ui.js或者其它项目文件到data:// 目录下,直接使用,这个很方便,但是缺点是代码不会加密,适合放一些不核心的页面。

2. 下载到data:// 目录下,但是替换现有的source下的项目文件。

检查当前应用的版本号,这个版本号可能是从文件里读出来的,可能是从SQLite数据库读出来的,反正这个版本的读和写都是由用户来决定。
通过do_Http发送GET/POST请求升级服务端,请求当前应用的最新的版本号,这个版本号是指应用内源代码的版本号,服务端是开发者自己搭建,和Do平台无关,而且版本号的维护也是由开发者来决定。
比较这二个版本号,如果不一样,则调用do_Http.download方法下载升级包,通常是一个zip文件。
下载后,解压这个zip文件到data:// 下一个目录
利用do_App的update方法拷贝所有的最新文件拷贝到source:// 下对应的目录,覆盖旧的文件。并更新新的版本到文件或数据库。

这里要注意的是:
1.升级的页面只有再次打开才能看到变化,比如当前页面更新了,需要退出这个页面再打开才能看到变化(这个退出不是指重启app,指closePage再openPage就可以)。假如升级的是首页,则需要退出应用重新打开App了(这个需要重启app,因为首页没法再closePage了)。

2.如果选择了代码加密,则更新的文件也必须是加密过,而且是同样的AppWorker开发者账号下的同样的应用id。目前还没有提供一个方便的方式随意加密任何源代码,只能重新打包,再从打出的包扣出相应的加密过的代码。比如可以修改代码后,再打一个android的apk包,把apk改成zip解压后,再找到assests目录,这个目录下有修改后且加密后的代码了。把这些代码扣出来,做为update.zip部署在你自己的应用内升级服务器上。
参考一个示例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();
                    });
                });
    })
}

这个示例的下载参考这里

补充说明

自己开发的项目里包含的所有js文件打包发布版的时候缺省会加密,文件名不变,但是内容都不可读了。
所以你应用内升级必须也用一个加密过的js去覆盖旧的。目前没有提供一个简单的方法直接加密文件,

  1. 修改了项目文件后,再次提交发布版打包,然后用电脑下载打包后的apk文件
  2. 把apk改成zip,然后解压这个zip到本地
  3. 打开目录找到assest/appworker,里面都有加密过的文件
  4. 把里面的文件压缩为zip作为应用内升级的升级包,注意里面有一个很长的id的目录不需要。
上一篇下一篇

猜你喜欢

热点阅读