官方提供了自动检测更新的代码,我这里稍微更改了一下,可以手动检测更新。
不过建议使用App资源在线升级更新
我这里也提供了自动+手动的App资源在线升级
<ul class="mui-table-view" style="margin-top: 25px;">
<li class="mui-table-view-cell">
<a id="onlineupgrade">
在线升级 <span class="mui-pull-right" id="supgrade" style="color: red;display: none;">
New
</span>
</a>
</li>
</ul>
mui.plusReady(function() {
var supgrade = document.getElementById("supgrade");
//有新版本显示提示
mui.initUpdate(function() {
supgrade.style.display = "inline-block";
});
document.getElementById("onlineupgrade").addEventListener('tap', function() {
if (supgrade.style.display != "none") {
mui.initUpdate();
}
});
});
(function($) {
//正式上线了请更改app更新地址
var server = "http://www.dcloud.io/helloh5/update.json", //获取升级描述文件服务器地址
localDir = "update",
localFile = "update.json", //本地保存升级描述目录和文件名
keyUpdate = "updateCheck", //取消升级键名
keyAbort = "updateAbort", //忽略版本键名
checkInterval = 3600000, //升级检查间隔,单位为ms,1小时为60*60*1000=3600000, 如果每次启动需要检查设置值为0
dir = null;
/**
* 准备升级操作
* 创建升级文件保存目录
* @param{Function} 有回调函数是手动检查折升级
*/
$.initUpdate = function(callback) {
// 打开doc根目录
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
fs.root.getDirectory(localDir, {
create: true
}, function(entry) {
dir = entry;
checkUpdate(callback);
}, function(e) {
console.log("准备升级操作,打开update目录失败:" + e.message);
});
}, function(e) {
console.log("准备升级操作,打开doc目录失败:" + e.message);
});
}
/**
* 检测程序升级
* @author liuyf 2015-04-27
* @description 手动检测是否升级 是否已过期等标记在手动下无效
*
* @param{Function} 有回调函数是手动检查折升级
* */
function checkUpdate(callback) {
// 判断升级检测是否过期
var lastcheck = plus.storage.getItem(keyUpdate);
if (lastcheck) {
// 取消已过期,删除取消标记
plus.storage.removeItem(keyUpdate);
}
// 读取本地升级文件]
dir.getFile(localFile, {
create: false
}, function(fentry) {
fentry.file(function(file) {
var reader = new plus.io.FileReader();
reader.onloadend = function(e) {
//检测升级的时候不删除本地升级文件
if (!callback) {
fentry.remove();
}
var data = null;
try {
data = JSON.parse(e.target.result);
} catch (e) {
console.log("读取本地升级文件,数据格式错误!");
}
checkUpdateData(data, callback);
}
reader.readAsText(file);
}, function(e) {
console.log("读取本地升级文件,获取文件对象失败:" + e.message);
fentry.remove();
});
}, function(e) {
// 失败表示文件不存在,从服务器获取升级数据
getUpdateData();
});
}
/**
* 检查升级数据
* @author liuyf 2015-04-27
* @description 手动升级 是否存在版本号等逻辑应舍弃
* @param{Function} 有回调函数是手动检查升级
*/
function checkUpdateData(j, callback) {
//当前客户端版本号
var curVer = plus.runtime.version,
inf = j[plus.os.name];
if (inf) {
var srvVer = inf.version;
// 判断是否需要升级
if (compareVersion(curVer, srvVer)) {
if (!callback) {
// 提示用户是否升级
plus.ui.confirm(inf.note, function(i) {
if (0 == i)
plus.runtime.openURL(inf.url);
else {
plus.storage.setItem(keyUpdate, (new Date()).getTime().toString());
}
}, inf.title, ["立即更新", "取 消"]);
} else {
callback();
}
}
}
}
/**
* 从服务器获取升级数据,并存储到本地;
*/
function getUpdateData() {
mui.getJSON(server, {}, function(data) {
//appid一致,才将服务器上的版本数据保存到本地
if (data.appid == plus.runtime.appid) {
// 保存到本地文件中
dir.getFile(localFile, {
create: true
}, function(fentry) {;
fentry.createWriter(function(writer) {
writer.onerror = function() {
console.log("获取升级数据,保存文件失败!");
}
writer.write(data);
}, function(e) {
console.log("获取升级数据,创建写文件对象失败:" + e.message);
});
}, function(e) {
console.log("获取升级数据,打开保存文件失败:" + e.message);
});
}
});
}
/**
* 比较版本大小,如果新版本nv大于旧版本ov则返回true,否则返回false
* @param {String} ov
* @param {String} nv
* @return {Boolean}
*/
function compareVersion(ov, nv) {
if (!ov || !nv || ov == "" || nv == "") {
return false;
}
var b = false,
ova = ov.split(".", 4),
nva = nv.split(".", 4);
for (var i = 0; i < ova.length && i < nva.length; i++) {
var so = ova[i],
no = parseInt(so),
sn = nva[i],
nn = parseInt(sn);
if (nn > no || sn.length > so.length) {
return true;
} else if (nn < no) {
return false;
}
}
if (nva.length > ova.length && 0 == nv.indexOf(ov)) {
return true;
}
}
})(mui);
10 个评论
要回复文章请先登录或注册
1***@qq.com
小摸羊
阿居
LiamWj
5个萝卜
lufei
yungehaha
1***@qq.com
夏小杰
Antecer