cocos3——4.js热更新

1.launch.js代码:

// launch: update files

var __failCount = 0;
var AssetsManager = cc.Scene.extend({
    _am: null,
    _progress: null,
    _percent: 0,
    _percentByFile: 0,
    run: function () {

        // windows may not need update
        var not_update;
        if (cc.sys.os == sys.OS_WINDOWS) {
            not_update = 1;
        }

        if (not_update || !cc.sys.isNative) {
            this.loadGame();
            return;
        }

        var layer = new cc.Layer();
        this.addChild(layer);
        this._progress = new cc.LabelTTF.create("下载进度:0%", "Arial", 12);
        this._progress.x = cc.winSize.width / 2;
        this._progress.y = cc.winSize.height / 2 + 50;
        layer.addChild(this._progress);

        // android: /data/data/com.huanle.magic/files/
        var storagePath = (jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "./");// storagePath表示本地的存储目录,更新的文件将下载到此目录下,程序加载脚本和资源时,也将优先从此目录查询
        this._am = new jsb.AssetsManager("res/project.manifest", storagePath);
        this._am.retain();

        if (!this._am.getLocalManifest().isLoaded()) {
            cc.log("Fail to update assets, step skipped.");
            this.loadGame();
        } else {
            var that = this;
            var listener = new jsb.EventListenerAssetsManager(this._am, function (event) {
                switch (event.getEventCode()) {
                    case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
                        cc.log("No local manifest file found, skip assets update.");
                        that.loadGame();
                        break;
                    case jsb.EventAssetsManager.UPDATE_PROGRESSION:
                        that._percent = event.getPercent();
                        that._percentByFile = event.getPercentByFile();
                        cc.log(that._percent + "%");

                        var msg = event.getMessage();
                        if (msg) {
                            cc.log(msg);
                        }
                        break;
                    case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
                    case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
                        cc.log("Fail to download manifest file, update skipped.");
                        that.loadGame();
                        break;
                    case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
                    case jsb.EventAssetsManager.UPDATE_FINISHED:
                        cc.log("Update finished.");
                        that.loadGame();
                        break;
                    case jsb.EventAssetsManager.UPDATE_FAILED:
                        cc.log("Update failed. " + event.getMessage());

                        __failCount++;
                        if (__failCount < 5) {
                            that._am.downloadFailedAssets();
                        } else {
                            cc.log("Reach maximum fail count, exit update process");
                            __failCount = 0;
                            that.loadGame();
                        }
                        break;
                    case jsb.EventAssetsManager.ERROR_UPDATING:
                        cc.log("Asset update error: " + event.getAssetId() + ", " + event.getMessage());
                        that.loadGame();
                        break;
                    case jsb.EventAssetsManager.ERROR_DECOMPRESS:
                        cc.log(event.getMessage());
                        that.loadGame();
                        break;
                    default:
                        break;
                }
            });

            cc.eventManager.addListener(listener, 1);
            this._am.update();
            cc.director.runScene(this);
        }

        this.schedule(this.updateProgress, 0.5);
    },
    loadGame: function () {
        cc.loader.loadJs(["src/game.js"], function (err) {
            if (err) {
                cc.log("error:" + err);
            } else {
                // run game logic
                game.run();
            }
        });
    },
    updateProgress: function (dt) {
        this._progress.string = "下载进度:" + this._percent + "%";
    },
    onExit: function () {
        this._am.release();
        this._super();
    }
});

更新完后会加载src/game.js,然后game.run跑游戏的主逻辑,所有逻辑从那里开始就可以了。

2.配置文件

在客户端的res目录下添加project.manifest:

{
    "packageUrl" : "http://192.168.1.103/bw",
    "remoteManifestUrl" : "http://192.168.1.103/bw/project.manifest",
    "remoteVersionUrl" : "http://192.168.1.103/bw/version.manifest",
    "version" : "1.0.0",
    "groupVersions" : {
        "1" : "1.0.0"
    }
} 

服务端可用everything搭建http做测试:

project.manifest:

{
    "packageUrl" : "http://192.168.1.103/bw",
    "remoteManifestUrl" : "http://192.168.1.103/bw/project.manifest",
    "remoteVersionUrl" : "http://192.168.1.103/bw/version.manifest",
    "version" : "1.0.5",
    "groupVersions" : {
        "1" : "1.0.5"
    },
    "engineVersion" : "3.0 rc0",
    "assets" : {
        "src/app.zip" : {
			"md5" : "6809C100A369FD8A79A97208B0278A2B",
            "compressed" : true,
            "group" : "1"
        }
    },
    "searchPaths" : [
        "src/"
	]
} 

version.manifest:

{
	"packageUrl" : "http://192.168.1.103/bw",
	"remoteManifestUrl" : "http://192.168.1.103/bw/project.manifest",
	"remoteVersionUrl" : "http://192.168.1.103/bw/version.manifest",
	"version" : "1.0.5",
	"groupVersions": {
		"1" : "1.0.5"
	},
	"engineVersion" : "3.0 rc0"
}

做增量包的话要用groupVersions,可以参见http://cn.cocos2d-x.org/tutorial/show?id=1186

时间: 2024-08-04 17:26:07

cocos3——4.js热更新的相关文章

webpack开启本地服务器与热更新

第一个webpack本地服务 webpack本地服务相关的一些操作指令与应用 一.第一个webpack本地服务 //工作区间 src//文件夹 index.js//入口文件 index.css//测试样式文件 index.html//结构文件 package.json//打包系统配置信息 webpack.config.js//打包配置 需要下载安装的加载器和插件: 1 npm install webpack --save-dev 2 npm install webpack-cli --save-

Cocos Creator热更新

一,添加热更新需要的文件 1. 在项目根目录添加 version_generator.js 文件   version_generator.js 内容如下: /** * 此模块用于热更新工程清单文件的生成 */ var fs = require('fs'); var path = require('path'); var crypto = require('crypto'); var manifest = { //服务器上资源文件存放路径(src,res的路径) packageUrl: 'http

cocos2dx js 3.2 热更新

COCOS IDE用手机调试更新是正常的,是预想的结果,但用COCOS IDE打包发布APK,安装到手机上,热更新下载图片.JSON UI什么的都能正常更新替换,但JS脚本没有替换,这是为毛.更新文件是已经有下载到手机上了[email protected]:/ # ls -l /data/data/org.cocos2dx.CocosJSGame/files/ls -l /data/data/org.cocos2dx.CocosJSGame/files/-rw------- u0_a113  u

Node.Js的热更新服务——supervisor

因为目前项目每次修改文件要看效果,必须重启服务:node app.js再进入浏览器看效果,很是麻烦.所幸的是有很多第三方的管理工具(supervisor,hotnode,forever,pm2等),当文件修改保存后,能自动重启node服务,但需要刷新浏览器,帮助我们节省开发时间. $ npm install -g supervisor 启动服务: supervisor node.js 命令窗口显示信息如下: [暂时贴不了,需要重新登录] 其实webpack也是可以实现实时热更新服务,暂时没去配置

移动端热更新方案(iOS+Android)

PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5%88%86%E4%BA%ABPPT.pptx 一 .热更新(热修复)产品背景 这里谈到的热更新都是指APP(不包含网页).APP按大类别可以粗略分为 应用 和 游戏.APP的开发周期是极其快速的,在实际开发流程中,我们总会有一些需求迫使我们短时间内快速上线,比如需求流程出错,程序员主观导致的一些bu

JSPatch热更新的利器.

如果用一句话来描述JSPatch,就是利用系统自带的JavaScriptCore.framework配合RunTime机制,进行实时的代码下载与运行.. 而且使用也很简单,启动,加载JS,运行... [JPEngine startEngine]; NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"]; NSString *script = [NSStri

unity 热更新 c# 实战经验分享(二) - 动态Protobuff协议,再也不用担心为了换条协议换包了 ~~!

先提前说明一下,如果哪位小伙伴 觉得生疏的话,可以看这篇博客的前面两个博客,里面讲述了 高大上 JSB,unity 热更新方案,用强大的宇宙第一编辑器vs 来开发 unity 热观更新脚本,更新c# 不在是梦 这次的demo 工程我已经长传了,地址 在这里http://pan.baidu.com/s/1qWQlXUW:下载后(放在D盘 放在D盘 放在D盘!!!!)里面的unity 工程直接打开然后运行main 场景 .就会出现下图,这篇博客唯一 的意义就在于这个demo,实战就是实战不跟你讲废话

iOS 热更新技术探索

最近在找工作,所以有时间研究一些BAT用到的一些框架和技术,今天要写的是热更新. 1.什么是热更新. 受限于iOS平台需要先审核在上线,一旦线上发现bug,想要修复还需要等到下次版本提交,这无形中会带给我们一些困扰,尤其是一些BAT量APP,所以热更新技术应运而生. 2.热更新解决方案. 我目前知道的有两种 第一种:微信使用的JSPatch JSPatch看名字就知道它是通过JS来实现的,大致原理就是通过下发JS脚本,通过消息转发调一些OC原生的方法,这个框架主要是用到一些JS高阶和运行时结合消

ionic2新手入门整理,搭建环境,创建demo,打包apk,热更新,优化启动慢等避坑详解

onic官方文档链接:http://ionicframework.com/docs/ 如果是新的环境会有很多坑,主要是有墙,请仔细阅读每个步骤 文档包含以下内容: l  环境搭建 l  创建demo并调试运行 l  打包APK l  添加支持热更新 l  优化启动慢问题 l  常用命令 1.      环境搭建 需要安装以下软件和插件(Android): l  安装nodeJS(自带npm) l  配置cnpm  (使用淘宝镜像取代npm) l  安装cordova和ionic2 l  安装JA