localDir="update",localFile="update.json",//本地保存升级描述目录和文件名
keyUpdate="updateCheck",//取消升级键名
keyAbort="updateAbort",//忽略版本键名
checkInterval=0,
dir=null;
/**
* 准备升级操作
* 创建升级文件保存目录
*/
function initUpdate(){
// 打开doc根目录
plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function(fs){
fs.root.getDirectory( localDir, {create:true}, function(entry){
dir = entry;
//进行版本判断,运行版本小于服务器版本则更新
//checkUpdate();
//直接更新不判断版本号的问题
getUpdateData();
}, function(e){
console.log( "准备升级操作,打开update目录失败:"+e.message );
});
},function(e){
console.log( "准备升级操作,打开doc目录失败:"+e.message );
});
}
/**
* 检测程序升级
*/
function checkUpdate() {
// 判断升级检测是否过期
// var lastcheck = plus.storage.getItem( keyUpdate );
// if ( lastcheck ) {
// var dc = parseInt( lastcheck );
// var dn = (new Date()).getTime();
// if ( dn-dc < checkInterval ) { // 未超过上次升级检测间隔,不需要进行升级检查
// return;
// }
// // 取消已过期,删除取消标记
// 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 ) {
fentry.remove();
var data = null;
try{
data=JSON.parse(e.target.result);
}catch(e){
console.log( "读取本地升级文件,数据格式错误!" );
return;
}
checkUpdateData( data );
}
reader.readAsText(file);
}, function(e){
console.log( "读取本地升级文件,获取文件对象失败:"+e.message );
fentry.remove();
} );
}, function(e){
// 失败表示文件不存在,从服务器获取升级数据
getUpdateData();
});
}
/**
* 检查升级数据
*/
function checkUpdateData( j ){
//当前客户端版本号
var curVer=plus.runtime.version;
//var curVer = "1.0";
inf = j[plus.os.name];
var srvVer = inf.version;
//alert("当前版本:" + curVer + " 新版本 " + srvVer);
// 判断是否需要升级
if ( compareVersion(curVer,srvVer) ) {
// 提示用户是否升级
plus.ui.confirm( inf.note, function(i){
if ( 0==i ) {
var apk_dir = j.Android.url;
createDownload(apk_dir);
} else {
}
}, inf.title, ["立即更新","取 消"] );
}
}
/**
* 从服务器获取升级数据,并存储到本地;
*/
function getUpdateData(){
mui.getJSON(server,{},function (data) {
if(true){
// 保存到本地文件中
dir.getFile( localFile, {create:true}, function(fentry){
fentry.createWriter( function(writer){
writer.onerror = function(){
console.log( "获取升级数据,保存文件失败!" );
};
//从服务器下载下来JSON文件
writer.write(data);
//根据下载的JSON文件判断是否更新
checkUpdateData(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;
}
}
// 创建下载任务
function createDownload(apk_dir) {
apk_dir = encodeURI(apk_dir);
var dtask = plus.downloader.createDownload( apk_dir, {}, function ( d, status ) {
// 下载完成
if ( status == 200 ) {
console.log( "Download success: " + d.filename );
installApp(d.filename);
} else {
console.log( "Download failed: " + status );
}
});
var w=plus.nativeUI.showWaiting(" 开始下载... ");
dtask.addEventListener( "statechanged", function(task,status){
switch(task.state) {
case 1: // 开始
w.setTitle(" 开始下载... ");
break;
case 2: // 已连接到服务器
w.setTitle(" 开始下载... ");
break;
case 3:
var a = task.downloadedSize/task.totalSize*100;
w.setTitle(" 已下载"+parseInt(a)+"% ");
break;
case 4: // 下载完成
w.close();
break;
}
} );
dtask.start();
}
//安装软件
function installApp(install_dir){
plus.runtime.install( install_dir, {}, function(){
console.info("install success !");
plus.runtime.quit();
}, function(){
console.info("install error !");
});
}
一个小凌乱
- 发布:2015-03-13 11:57
- 更新:2015-11-18 17:18
- 阅读:5248
用小米手机进行更新,下载到99%一直卡主,其他Android手机能更新下载安装成功
分类:HTML5+
3 个回复
ygzhang
参照楼主的做了App升级,安卓下可以正常下载下载完后无法安装,提示“安装失败”?????
楼主的如何安装??
立扬
请问楼上解决了么?正好我也要用这个功能 不想用浏览器下载的
毒气
现在demo中做的已经不错了
2015-10-26 22:42
立扬
demo里的是直接用浏览器打开下载吧?体验不是很好
2015-11-18 17:16
立扬
自己改的,测试成功,在此借用记录一下
//检查更新
function checkUpdate() {
var server = "http://xxxx.com/external/update.aspx"; //获取升级描述文件服务器地址
console.log(server)
mui.ajax(server, {
data: {
version: "" + plus.runtime.version + ""
},
dataType: 'json',
type: 'get',
timeout: 50000,
success: function(data) {
console.log(data.url)
if (data.status) {
plus.nativeUI.confirm(data.note, function(event) {
if (0 == event.index) {
//plus.runtime.openURL(data.url);
downApk(data.url);
console.log(1243)
}
}, data.title, ["立即更新", "取 消"]);
}
},
error: function(xhr, type, errorThrown) { //异常处理;
plus.nativeUI.toast("检测更新失败");
console.log(JSON.stringify(xhr));
}
});
}
// 下载wgt文件
var sw;