H5+App通常指的是我们将移动Web端封装成一个的App后的一种形式,我们通过这样的方法就可以比较简单地形成一个可被应用的App,这样的一个App能够像正常的App应用去调用手机底层的Api,比如相机,推送等。
但是这样的方式虽然便捷,但是肯定相对于原生的App是有一定的弊端,渲染速度,以及各种调用底层Api的功能都会存在不小的差距。
但是在目前各种框架插件的辅助下,往往在简单的应用内都可以达到以假乱真的效果。
这里只介绍dclound的提供的3种方式,一种是Wap2App,一种是直接的往Web页面套壳的纯h5+方式。
1.第一种是wap2App的方式,通过这样的方式,我们可以重新定义我们App中的路由,只要将不同的页面配置一个唯一的页面ID,这样底层的框架就会去处理相关的一些事件,包括跳转等问题。
这种方式有一个特点,就是我们的页面其实不是放在APP里面的,而是放在我们的服务器上,然后打包成的App其实可以理解为一个浏览器App,然后我们只是单纯地去访问我们服务器上的页面地址,从服务器可以获取到最新的页面更新。
达到可以不用去更新App,就更新到我们App内容的一种快速更换内容的效果。这当然也是这样的一种套壳App的优势。
2.第二种方式是纯套壳方式,直接在我们生成的App首页访问项目的首页地址,这样就相当于好像我们打开了App不是一个空白的页面,而是一个另类的App。这种方式当然也会有以上的所说的套壳App特色。
3.第三种是用Vue打包后的项目包,加上一个App的配置文件,重新打包成一个App,这样的话我们项目就是封闭的一个状态,必须要重新打包成App才能达到更新App的效果。
1.有一个点是三种方式都得注意的,那就是必须在头部给手机状态栏留下一个空白的div位置,不然我们的页面很容易因为这个状态栏变得畸形。
一般我们可以先通过判断我们项目的运行环境,然后控制状态栏DIV的显隐。
if(navigator.userAgent.indexOf("Html5Plus") > -1){
downloadEl.style.display = "none";//隐藏下载banner
}
2.另外一个是关于我们App的更新问题,不管是通过怎么样的打包方式,最后都需要一个更新App的功能,套壳App哪怕能够更新页面内容,但是它却不能让我们的App添加一些本就没有添加的App底层共嗯功能,我们需要重新打包更新去获取手机权限。
以下是实现更新的一种方式,全量更新,让用户更新一整个App
var ua = navigator.userAgent;
if(ua.indexOf('Html5Plus') > -1 && ua.indexOf('StreamApp') == -1) {
var server = "http://xxxx.com/update"; //检查更新地址
var req = { //升级检测数据
"versionCode":plus.runtime.versionCode,
};
//注释部分是wap2app封装请求
wap2app.ajax.post(server, req, function(rsp) {
if(rsp.code == 200000 && rsp.data != 'none'){
plus.nativeUI.alert("新版本可用", function(event) {
var dtask = plus.downloader.createDownload(
rsp.data,
{},
function(d, status) {
console.log('下载完成!');
if (status == 200) {
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename), {}, e => e, function(error) {
console.log('安装失败-01!');
})
} else {
console.log('更新失败-02!');
}
});
//设置检查更新进度显示
try {
dtask.start(); // 开启下载的任务
var prg = 0;
var showLoading = plus.nativeUI.showWaiting("正在下载"); //创建一个showWaiting对象
dtask.addEventListener('statechanged', function(
task,
status
) {
// 给下载任务设置一个监听 并根据状态 做操作
switch (task.state) {
case 1:
showLoading.setTitle("正在下载");
break;
case 2:
showLoading.setTitle("已连接到服务器");
break;
case 3:
prg = parseInt(
(parseFloat(task.downloadedSize) /
parseFloat(task.totalSize)) *
100
);
showLoading.setTitle(" 正在下载" + prg + "% ");
break;
case 4:
plus.nativeUI.closeWaiting();
//下载完成
break;
}
});
} catch (err) {
plus.nativeUI.closeWaiting();
console.log('更新失败-03')
}
}, "提示", "立即更新");
}
});
}
不管是原生App,还是套壳App,能够实现完成我们目前需要功能,而且能达到效果的就是一个好用的App,所以当我们急需要完成一个App的项目的时候,往往可以选择这样一种便捷的方式去达到我们的目的。