一个小凌乱
一个小凌乱
  • 发布:2015-03-13 11:57
  • 更新:2015-11-18 17:18
  • 阅读:5248

用小米手机进行更新,下载到99%一直卡主,其他Android手机能更新下载安装成功

分类:HTML5+
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 负责人:无 分享
已邀请:
ygzhang

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;

    function downApk(url) {  
        sw = plus.nativeUI.showWaiting("下载更新文件...");  
        var dtask = plus.downloader.createDownload(url, {  
            filename: "_doc/update/"  
        }, function(d, status) {  
            if (status == 200) {  
                sw.setTitle("下载完成准备安装");  
                installApk(d.filename); // 安装wgt包  
            } else {  
                console.log("下载更新失败!");  
                plus.nativeUI.alert("下载更新失败!");  
            }  
            plus.nativeUI.closeWaiting();  
        });  
        dtask.addEventListener("statechanged", function(task, status) {  
            switch (task.state) {  
                case 1: // 开始  
                    sw.setTitle("开始下载...");  
                    break;  
                case 2: // 已连接到服务器  
                    sw.setTitle("链接到服务器...");  
                    break;  
                case 3: // 已接收到数据  
                    sw.setTitle("下载中" + task.downloadedSize + "/" + task.totalSize);  
                    break;  
                case 4: // 下载完成  
                    sw.setTitle("下载完成" + task.totalSize);  
                    break;  
            }  
        });  
        dtask.start();  
    }  
    // 更新应用资源  
    function installApk(path) {  
        sw.setTitle("安装更新文件...");  
        plus.runtime.install(path, {}, function() {   
            plus.nativeUI.closeWaiting();  
            console.log("安装更新文件成功!");  
            plus.nativeUI.alert("应用资源更新完成!确定后重启应用", function() {  
                plus.runtime.restart();  
            });  
        }, function(e) {  
            plus.nativeUI.closeWaiting();  
            console.log("安装更新文件失败");  
            plus.nativeUI.alert("安装更新文件失败");  
        });  
    }

该问题目前已经被锁定, 无法添加新回复