小云菜
小云菜
  • 发布:2015-04-30 16:21
  • 更新:2021-07-07 23:37
  • 阅读:24631

手动检测版本更新的代码

分类:HTML5+

官方提供了自动检测更新的代码,我这里稍微更改了一下,可以手动检测更新。

不过建议使用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);
20 关注 分享
DCloud_heavensoft NyxFang IT小兵 magengshun lifedjh 上交国家 飞翔32993 qixi Antecer 1***@qq.com gadget2k Element 5***@qq.com 新生 5***@qq.com LiamWj 1***@qq.com 小明子 沧桑 1***@qq.com

要回复文章请先登录注册

1***@qq.com

1***@qq.com

mark
2021-07-07 23:37
小摸羊

小摸羊

mark
2020-07-07 18:13
阿居

阿居

mark
2020-02-27 19:01
LiamWj

LiamWj

您好,我遇到一个问题,就是第一次打开app的时候可以出现新版本更新提示,第二次就不行,第三次又可以,一直这样,请问是怎么回事呢?用的代码就是update.json这个原装的。。。请大神教我!!!
2018-09-28 11:47
5个萝卜

5个萝卜

mark
2018-04-10 08:43
lufei

lufei

mark
2017-10-26 22:21
yungehaha

yungehaha

mark
2017-05-02 11:18
1***@qq.com

1***@qq.com

mark
2016-12-09 11:20
夏小杰

夏小杰

这个应该写在那个页面下面
2016-08-28 13:05
Antecer

Antecer

Mark
2016-05-29 21:59