HTML5 WebApp开发(十)在线差异化升级

从4月份公司确定使用H5开发app,主要考虑了两点:
1.一套代码可以生成安卓和iOS 两个平台的app;
2.在线升级(差异化升级和整包升级)。
到现在公司的两款app也基本做完了,期间还做了很多新需求进去了。总体感觉使用H5做app,做界面比原生简单、快,但是用户体验上没法和原生相比,特别是这种电商类的app,一般项目都比较大、页面跳转复杂、业务逻辑多,使用上和原生相比没有任何优势(忽略上面的两点);加上五一之后,苹果生审核政策变了,主要是审核加速了,以前需要两周左右的时间现在一周内就可以搞定(一次是4月29号提交的,1天通过;一次是6月15号提交的,一天通过;还有一次是7月5号提交的,花了两三天也通过了)。而且苹果的政策是严禁应用内升级的。以前做了版本号显示的,点击可以跳转到苹果商店升级都被拒绝了,后来干脆把这个功能干掉了,因为苹果现在应用升级它都会推送给用户,不需要我们再在app里面做检查更新操作了,但是对于企业包来说,可以忽略这些。安卓的各大市场上线时间也是很快的,基本可以不考虑。
再来看看上面两点:感觉就是第一点有优势,因为可以节约成本,而且我们把app的代码组做些修改就可以是做成微信版本的。
个人观点:对于小型app或是app里面的部分模块可以使用H5开发,对于大型的app,不建议使用H5做,因为节约的这点成本,对于产品因为良好的用户体验而获取的用户来说,这个成本不算什么,一般的公司也很难把H5的app的体验做到和原生相差无几。
我们使用的是MUI框架,编译器是HBuild。
这篇博客主要介绍的应用差异化升级。

整包升级

整包升级,先看看官方的文档《整包(apk/ipa)升级》。官方的介绍也是比较详细的,由于本人没有做过整包升级,所以这里不做描述。但是有一点需要注意的:

这里写图片描述

差异化升级

先看官方文档
《App资源在线升级更新》
《App资源在线差量升级更新》
这两篇文章里面已经详细的介绍了差异化升级的流程和制作wgt升级包的步骤和注意事项。
在官方的代码的基础上我做了一点小的修改。
首先新建一个update.js的文件,里面的代码如下:

var wgtVer=null;
function plusReady(){
    // 获取本地应用资源版本号
    plus.runtime.getProperty(plus.runtime.appid,function(inf){
        wgtVer=inf.version;
        console.log("当前应用版本:"+wgtVer);
    });
}
if(window.plus){
    plusReady();
}else{
    document.addEventListener('plusready',plusReady,false);
}

// 检测更新
// 实际项目中需要更换为自己服务器的地址
var checkUrl="http://demo.dcloud.net.cn/test/update/check.php";
function checkUpdate(){
    plus.nativeUI.showWaiting("检测更新...");
    var xhr=new XMLHttpRequest();
    xhr.onreadystatechange=function(){
        switch(xhr.readyState){
            case 4:
            plus.nativeUI.closeWaiting();
            if(xhr.status==200){
                console.log("检测更新成功:"+xhr.responseText);
                var newVer=xhr.responseText;
                if(wgtVer&&newVer&&(wgtVer!=newVer)){
                    downWgt();  // 下载升级包
                }else{
                    plus.nativeUI.alert("无新版本可更新!");
                }
            }else{
                console.log("检测更新失败!");
                plus.nativeUI.alert("检测更新失败!");
            }
            break;
            default:
            break;
        }
    }
    xhr.open('GET',checkUrl);
    xhr.send();
}
// 下载wgt文件
// 实际项目中需要更换为自己服务器的地址
var wgtUrl="http://demo.dcloud.net.cn/test/update/H5EF3C469.wgt";
function downWgt(){
    plus.nativeUI.showWaiting("下载wgt文件...");
    plus.downloader.createDownload( wgtUrl,{filename:"_doc/update/"},function(d,status){
        if ( status == 200 ) { 
            console.log("下载wgt成功:"+d.filename);
            plus.nativeUI.confirm("升级包下载完成,是否需要升级",function(e){
                    var sure = (e.index == 0) ? "Yes" : "No";
                    if (sure == 'Yes') {
                        installWgt(d.filename); // 安装wgt包
                    }
            })
        } else {
            console.log("下载wgt失败!");
            plus.nativeUI.alert("下载wgt失败!");
        }
        plus.nativeUI.closeWaiting();
    }).start();
}
// 更新应用资源
function installWgt(path){
    plus.nativeUI.showWaiting("安装wgt文件...");
    plus.runtime.install(path,{},function(){
        plus.nativeUI.closeWaiting();
        console.log("安装wgt文件成功!");
        plus.nativeUI.alert("应用资源更新完成!\n点击确定按钮重启完成升级",function(){
            plus.runtime.restart();
        });
    },function(e){
        plus.nativeUI.closeWaiting();
        console.log("安装wgt文件失败["+e.code+"]:"+e.message);
        plus.nativeUI.alert("安装wgt文件失败["+e.code+"]:"+e.message);
    });
}
/* * 差异化升级流程: * 1.启动app后在plusReady里面首先获取app版本 * 2.检查服务器版本 * 3.服务器版本大于本地app版本下载升级包,提示安装和升级 * 4.服务器版本小于等于本地版本时,不做任何操作 * 5.重启即可玩升级 */

怎么使用呢?
我们只需要在一个.html文件里面引用这个js文件:

<script type="text/javascript" src="../js/update.js" ></script>

然后在mui.plusReady()方法里面调用checkUpdate()这个方法即可。

改进点

  1. 升级的js文件里面不要使用Loading框,版本检测或是下载就让它静默操作就可以,值需要在是否安装升级包的时候给一个提示框即可;
  2. 根据之前原生app被拒绝的经历来和用户体验的角度来说,我们可以在近app的时候定时一定时间后再调用checkUpdate()这个方法,如果能做一个软开关最好,上架审核期间先关闭这个功能,审核通过以后再打开这个功能。

总结

H5的app也做了两个,加之之前做原生的经验,总体来说使用H5开发app比原生简单一些、开发速度快,但是用户体验差。公司做产品也是在产品质量、开发周期、成本等因素中选取一个平衡点。
代码下载地址:请点击我!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


HTML5和CSS3实现3D展示商品信息的代码
利用HTML5中的Canvas绘制笑脸的代码
Html5剪切板功能的实现
如何通过HTML5触摸事件实现移动端简易进度条
Html5移动端获奖无缝滚动动画实现
关于HTML5和CSS3实现机器猫的代码
HTML5使用DOM进行自定义控制
使用HTML5 Canvas绘制阴影效果的方法
使用PHP和HTML5 FormData实现无刷新文件上传
如何解决HTML5 虚拟键盘出现挡住输入框的问题
HTML5中div和section以及article的区别分析
html5和CSS 实现禁止IOS长按复制粘贴功能
html5 touch事件实现触屏页面上下滑动
canvas 模拟实现电子彩票刮刮乐的代码
HTML5 Plus 实现手机APP拍照或相册选择图片上传的功能
Android自定义环形LoadingView效果
HTML5 canvas绘制五角星的方法
html5使用html2canvas实现浏览器截图
使用Canvas处理图片的方法介绍
利用Canvas模仿百度贴吧客户端loading小球的方法