Cocos Creator 热更新

前端之家收集整理的这篇文章主要介绍了Cocos Creator 热更新前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

参考博客:https://www.jianshu.com/p/cec263b6b9ac

官方文档:https://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html

 

官方提供的那个21点热更新demo,在ios和andriod真机端都没有跑出来,黑屏,粉屏,无语。。。

只好按参考博客的作者新建项目直接开搞

 

用真机测试,Creator自带的模拟器,能更新资源,但是更新后加载不了资源,没法测试效果

测试下来安卓和iOS是可以共用一套代码一次更新构建,安卓或者iOS构建的新版本,两端都会提示更新,且能正常更新和进入

 

Creator版本:2.1.0

HotUpdate.js      使用的是官方demo 最新里的

UpdatePanel.js   使用的是官方demo 最新里的

资源也是借用官方demo里的,整的目录结构如下

分享图片

 

 

 因为没有其他更多依赖,代码也放一下

HotUpdate.js

var UpdatePanel = require(‘./UpdatePanel‘@H_301_48@);

// Custom manifest removed the following assets:
// 1. res/raw-assets/2a/2a40e5e7-4c4a-4350-9e5d-76757755cdd2.png
// 2. res/raw-assets/2d/2d86a854-63c4-4b90-8b88-a4328b8526c2.png
// So when custom manifest used,you should be able to find them in downloaded remote assets
var customManifestStr =@H_301_48@ JSON.stringify({
    "packageUrl": "http://192.168.50.220:5555/tutorial-hot-update/remote-assets/"@H_301_48@,"remoteManifestUrl": "http://192.168.50.220:5555/tutorial-hot-update/remote-assets/project.manifest"@H_301_48@,"remoteVersionUrl": "http://192.168.50.220:5555/tutorial-hot-update/remote-assets/version.manifest"@H_301_48@,"version": "1.10"@H_301_48@,"assets"@H_301_48@: {
        "src/cocos2d-jsb.js"@H_301_48@: {
            "size": 3341465@H_301_48@,"md5": "fafdde66bd0a81d1e096799fb8b7af95"@H_301_48@
        },"src/project.dev.js"@H_301_48@: {
            "size": 97814@H_301_48@,"md5": "ed7f5acd411a09d4d298db800b873b00"@H_301_48@
        },"src/settings.js"@H_301_48@: {
            "size": 3849@H_301_48@,"md5": "deb03998a4cfb8f8b468fba8575cb1c9"@H_301_48@
        },"res/import/03/0379fb962.json"@H_301_48@: {
            "size": 1107@H_301_48@,"md5": "d102d0f14ed6b6cb42cc28d88b3b9069"@H_301_48@
        },"res/import/0c/0cd5de143.json"@H_301_48@: {
            "size": 80883@H_301_48@,"md5": "f06347880038a1381043ed505d6f8a9a"@H_301_48@
        },"res/import/0d/0d756af45.json"@H_301_48@: {
            "size": 10137@H_301_48@,"md5": "02dc8b795e79b9fd62e00d4a2c70c8c1"@H_301_48@
        },"res/import/0d/0dc6a4e59.json"@H_301_48@: {
            "size": 14970@H_301_48@,"md5": "a500f696892df6869341dff5f31b1a33"@H_301_48@
        },"res/import/41/4128b78b-00ae-4d8a-ae35-4e5ca5c5cde9.json"@H_301_48@: {
            "size": 76@H_301_48@,"md5": "3f79d93ce8d42b186ecd43d868c8d023"@H_301_48@
        },"res/import/49/49539cb0-3893-459a-b310-7cc1b7f6d335.json"@H_301_48@: {
            "size": 72@H_301_48@,"md5": "8a36388cda7c3773b5bf7a53d8824535"@H_301_48@
        },"res/import/9e/9e2ae507-fae5-4511-940b-f2e46f81b790.json"@H_301_48@: {
            "size": 74@H_301_48@,"md5": "98f6b1d93a4ee3a1f2074be9ce00fbb2"@H_301_48@
        },"res/raw-assets/0e/0ed8cf6e-8c04-4569-8d17-626a26e1099f.png"@H_301_48@: {
            "size": 4665@H_301_48@,"md5": "9e8bf9af30ac7a9ea9d3b72f37a193e1"@H_301_48@
        },"res/raw-assets/13/137d1ca6-e90c-440b-9fa2-4b9ffff569f7.png"@H_301_48@: {
            "size": 1627@H_301_48@,"md5": "75060291e24294abd6a52553fa22317e"@H_301_48@
        },"res/raw-assets/15/15d5f3f0-f965-4c00-945b-d2c8faee78b6.png"@H_301_48@: {
            "size": 3840@H_301_48@,"md5": "cb525edab8063a845e6bd1e9d29b8cde"@H_301_48@
        },"res/raw-assets/19/19509bb1-dc08-4cbf-ab8f-2460e207265c.png"@H_301_48@: {
            "size": 9638@H_301_48@,"md5": "6e159c9cc1b971d3921bc8908071a70b"@H_301_48@
        },"res/raw-assets/26/26e9a867-3d2f-4981-8a33-82d440de7aff.png"@H_301_48@: {
            "size": 6417@H_301_48@,"md5": "5c139729708dd26bd461bcd3e8201823"@H_301_48@
        },"res/raw-assets/2d/2ddfe005-2129-41d8-aeec-2b1f51f02962.png"@H_301_48@: {
            "size": 2290@H_301_48@,"md5": "874dccfd88108a9f0188bda59c5df183"@H_301_48@
        },"res/raw-assets/34/3459ab36-782c-4c4e-8aef-7280aff8b272.png"@H_301_48@: {
            "size": 18969@H_301_48@,"md5": "3a810a636f3779b357e854155eafa4b6"@H_301_48@
        },"res/raw-assets/36/36b6ea73-ff48-430e-a0c7-0e5e8defe341.png"@H_301_48@: {
            "size": 2711@H_301_48@,"md5": "e64625aeb59a1de225e718a7126634ad"@H_301_48@
        },"res/raw-assets/39/394bac82-54fb-472f-a27f-b5107821bfb8.png"@H_301_48@: {
            "size": 1641@H_301_48@,"md5": "049d2201d7d99fc6dbdb017d8d8bd9b8"@H_301_48@
        },"res/raw-assets/3c/3cedb8b4-8532-4037-a00e-b8d3e0013158.png"@H_301_48@: {
            "size": 94313@H_301_48@,"md5": "a2e763866c1bdd6b189be69f3d37eedd"@H_301_48@
        },"res/raw-assets/41/4128b78b-00ae-4d8a-ae35-4e5ca5c5cde9.manifest"@H_301_48@: {
            "size": 6358@H_301_48@,"md5": "c1d18879851e567545ea04bf135a325f"@H_301_48@
        },"res/raw-assets/49/49539cb0-3893-459a-b310-7cc1b7f6d335.mp3"@H_301_48@: {
            "size": 971644@H_301_48@,"md5": "f45ec6666f06b729d8c0461bc89d4b94"@H_301_48@
        },"res/raw-assets/4e/4e06c7f1-72ac-4e4e-90de-683e16905156.png"@H_301_48@: {
            "size": 2406@H_301_48@,"md5": "5f0c28e0eed7ec0cb75e45f5937dd7c6"@H_301_48@
        },"res/raw-assets/50/50da5486-dfa1-46d2-9d4f-686eb5527c1a.png"@H_301_48@: {
            "size": 6911@H_301_48@,"md5": "51cf32529c923146f06019a58398c98d"@H_301_48@
        },"res/raw-assets/52/5245e25c-010c-45fb-84a3-f3bce95793e7.png"@H_301_48@: {
            "size": 3963@H_301_48@,"md5": "0f050ba45e09986b3d785b7b23ffcc1e"@H_301_48@
        },"res/raw-assets/6d/6de06a23-d0de-4766-a9e1-a0314136d62e.png"@H_301_48@: {
            "size": 10878@H_301_48@,"md5": "9f89eec7a1b0f615a3c1bab0857aefff"@H_301_48@
        },"res/raw-assets/70/700faa17-11a6-46cd-aeb5-d6900bc264f8.png"@H_301_48@: {
            "size": 3765@H_301_48@,"md5": "878e89a0a3e02b13beee9f3274f2ca39"@H_301_48@
        },"res/raw-assets/71/71561142-4c83-4933-afca-cb7a17f67053.png"@H_301_48@: {
            "size": 1050@H_301_48@,"md5": "c06a93f5f1a8a1c6edc4fd8b52e96cbf"@H_301_48@
        },"res/raw-assets/80/8071df9d-029b-40e8-98f3-8eab08dbf6ca.png"@H_301_48@: {
            "size": 25205@H_301_48@,"md5": "f688777a92fba11bfe85c3061a4476e5"@H_301_48@
        },"res/raw-assets/82/82fe58d4-ae13-4806-9a41-2e73902ea811.png"@H_301_48@: {
            "size": 24298@H_301_48@,"md5": "b807df8ffcb540f3dd20db75ac95b73b"@H_301_48@
        },"res/raw-assets/83/83cc2086-d713-47a0-8d86-a8d6068b6258.png"@H_301_48@: {
            "size": 3782@H_301_48@,"md5": "9827ce705349caa604e1aba1d53b0fd9"@H_301_48@
        },"res/raw-assets/96/96e3e293-4e36-426d-a0a6-eb8d025c0d5b.png"@H_301_48@: {
            "size": 15379@H_301_48@,"md5": "d6ce47aed38348a1ea0f003fa0063079"@H_301_48@
        },"res/raw-assets/97/97a6316c-7fcb-4ffe-9045-35625bc6abf6.png"@H_301_48@: {
            "size": 2187@H_301_48@,"md5": "f3f41b4c0783a751e561f1b84d91a70b"@H_301_48@
        },"res/raw-assets/97/97bb9c9c-5568-4419-af04-4ed5a2969a02.png"@H_301_48@: {
            "size": 10370@H_301_48@,"md5": "48ab94f1c34b0e9a047297cab1aeabc4"@H_301_48@
        },"res/raw-assets/99/99170b0b-d210-46f1-b213-7d9e3f23098a.png"@H_301_48@: {
            "size": 1177@H_301_48@,"md5": "d1118d133683bb4227d5e60c79c846b7"@H_301_48@
        },"res/raw-assets/99/99acc716-33df-4c4c-879d-cc3407f0cd8c.png"@H_301_48@: {
            "size": 9754@H_301_48@,"md5": "23e7221934021f3fbe6c6a52b023ded8"@H_301_48@
        },"res/raw-assets/9e/9e2ae507-fae5-4511-940b-f2e46f81b790.mp3"@H_301_48@: {
            "size": 3179@H_301_48@,"md5": "90d17b1a25200c90e292d9a3748c9fec"@H_301_48@
        },"res/raw-assets/ac/ac11439d-3758-49f5-8728-81ed22c1ed96.png"@H_301_48@: {
            "size": 11935@H_301_48@,"md5": "c20ae4a74c42b2aed28bb8c9247eb5d5"@H_301_48@
        },"res/raw-assets/ae/ae4e2188-2b7b-42a9-85e1-8fb987600b04.png"@H_301_48@: {
            "size": 634171@H_301_48@,"md5": "07b03f7145b75579708ae05ea2a2c029"@H_301_48@
        },"res/raw-assets/af/afe329a6-e85e-46a0-98ed-8a34e128907b.png"@H_301_48@: {
            "size": 2209@H_301_48@,"md5": "30ae2fe844c7c53f1d00291051230607"@H_301_48@
        },"res/raw-assets/b2/b2037f34-04ff-4351-b9da-5be4bb557017.png"@H_301_48@: {
            "size": 1530@H_301_48@,"md5": "bb96dacb8b09e0443d83462cc7b20095"@H_301_48@
        },"res/raw-assets/b4/b43ff3c2-02bb-4874-81f7-f2dea6970f18.png"@H_301_48@: {
            "size": 1114@H_301_48@,"md5": "83fcc9912e01ae5411c357651fb8b1cf"@H_301_48@
        },"res/raw-assets/c3/c39ea496-96eb-4dc5-945a-e7c919b77c21.png"@H_301_48@: {
            "size": 2548@H_301_48@,"md5": "ae7a04af25e238a5478170759b55a7ba"@H_301_48@
        },"res/raw-assets/ca/caaaf9ff-5036-4232-a8a7-88b80b2e4c88.png"@H_301_48@: {
            "size": 1829@H_301_48@,"md5": "94d761c4626df88053787f17fa09914d"@H_301_48@
        },"res/raw-assets/ca/cacafa85-d8e9-4716-bcdb-7eba457e409c.png"@H_301_48@: {
            "size": 7380@H_301_48@,"md5": "e6bb0f4d041257653f07da2dfe1edd09"@H_301_48@
        },"res/raw-assets/ce/ce6d2de9-7056-4ba8-a1b1-40b00bb6f469.png"@H_301_48@: {
            "size": 10982@H_301_48@,"md5": "52aa0df577edafe11de1cfdb44422895"@H_301_48@
        },"res/raw-assets/cf/cfef78f1-c8df-49b7-8ed0-4c953ace2621.png"@H_301_48@: {
            "size": 1140@H_301_48@,"md5": "a4b5953dffeb145b4b70072d91c4052b"@H_301_48@
        },"res/raw-assets/d5/d5dfe6a8-eb19-4aae-a74f-83b71eaa57dc.png"@H_301_48@: {
            "size": 8755@H_301_48@,"md5": "aeb1055ced334ce20fe030579e187494"@H_301_48@
        },"res/raw-assets/da/da3e556f-1bce-4c31-87dc-897ea2d788e2.png"@H_301_48@: {
            "size": 11636@H_301_48@,"md5": "d81124346c110eb1377f7b56346b31e4"@H_301_48@
        },"res/raw-assets/e8/e851e89b-faa2-4484-bea6-5c01dd9f06e2.png"@H_301_48@: {
            "size": 1082@H_301_48@,"md5": "90cf45d059d0408bec327f66eae5764c"@H_301_48@
        },"res/raw-assets/ec/ec244ee5-6f1f-4920-9b69-d4df0e78ec2d.png"@H_301_48@: {
            "size": 55581@H_301_48@,"md5": "68fdff7430b1b02f3a6e76bea92c6372"@H_301_48@
        },"res/raw-assets/fc/fccc4d85-6ad4-496d-9b33-ea76e69da132.png"@H_301_48@: {
            "size": 82257@H_301_48@,"md5": "df4359cdcb956f52f2e5b4ef777bbb7d"@H_301_48@
        }
    },"searchPaths"@H_301_48@: []
});

cc.Class({
    extends: cc.Component,properties: {
        panel: UpdatePanel,manifestUrl: {
            type: cc.Asset,default: null@H_301_48@
        },updateUI: cc.Node,_updating: false@H_301_48@,_canRetry: false@H_301_48@,_storagePath: ‘‘@H_301_48@
    },checkCb: function@H_301_48@ (event) {
        cc.log(‘Code: ‘ +@H_301_48@ event.getEventCode());
        switch@H_301_48@ (event.getEventCode())
        {
            case@H_301_48@ jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
                this.panel.info.string = "No local manifest file found,hot update skipped."@H_301_48@;
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
            case@H_301_48@ jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
                this.panel.info.string = "Fail to download manifest file,hot update skipped."@H_301_48@;
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
                this.panel.info.string = "Already up to date with the latest remote version."@H_301_48@;
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.NEW_VERSION_FOUND:
                this.panel.info.string = ‘New version found,please try to update.‘@H_301_48@;
                this.panel.checkBtn.active = false@H_301_48@;
                this.panel.fileProgress.progress = 0@H_301_48@;
                this.panel.byteProgress.progress = 0@H_301_48@;
                break@H_301_48@;
            default@H_301_48@:
                return@H_301_48@;
        }
        
        this._am.setEventCallback(null@H_301_48@);
        this._checkListener = null@H_301_48@;
        this._updating = false@H_301_48@;
    },updateCb: function@H_301_48@ (event) {
        var needRestart = false@H_301_48@;
        var Failed = false@H_301_48@;
        switch@H_301_48@ (event.getEventCode())
        {
            case@H_301_48@ jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
                this.panel.info.string = ‘No local manifest file found,hot update skipped.‘@H_301_48@;
                Failed = true@H_301_48@;
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.UPDATE_PROGRESSION:
                this.panel.byteProgress.progress =@H_301_48@ event.getPercent();
                this.panel.fileProgress.progress =@H_301_48@ event.getPercentByFile();

                this.panel.fileLabel.string = event.getDownloadedFiles() + ‘ / ‘ +@H_301_48@ event.getTotalFiles();
                this.panel.byteLabel.string = event.getDownloadedBytes() + ‘ / ‘ +@H_301_48@ event.getTotalBytes();

                var msg =@H_301_48@ event.getMessage();
                if@H_301_48@ (msg) {
                    this.panel.info.string = ‘Updated file: ‘ +@H_301_48@ msg;
                    // cc.log(event.getPercent()/100 + ‘% : ‘ + msg);
@H_301_48@                }
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
            case@H_301_48@ jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
                this.panel.info.string = ‘Fail to download manifest file,hot update skipped.‘@H_301_48@;
                Failed = true@H_301_48@;
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
                this.panel.info.string = ‘Already up to date with the latest remote version.‘@H_301_48@;
                Failed = true@H_301_48@;
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.UPDATE_FINISHED:
                this.panel.info.string = ‘Update finished. ‘ +@H_301_48@ event.getMessage();
                needRestart = true@H_301_48@;
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.UPDATE_Failed:
                this.panel.info.string = ‘Update Failed. ‘ +@H_301_48@ event.getMessage();
                this.panel.retryBtn.active = true@H_301_48@;
                this._updating = false@H_301_48@;
                this._canRetry = true@H_301_48@;
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.ERROR_UPDATING:
                this.panel.info.string = ‘Asset update error: ‘ + event.getAssetId() + ‘,‘ +@H_301_48@ event.getMessage();
                break@H_301_48@;
            case@H_301_48@ jsb.EventAssetsManager.ERROR_DECOMPRESS:
                this.panel.info.string =@H_301_48@ event.getMessage();
                break@H_301_48@;
            default@H_301_48@:
                break@H_301_48@;
        }

        if@H_301_48@ (Failed) {
            this._am.setEventCallback(null@H_301_48@);
            this._updateListener = null@H_301_48@;
            this._updating = false@H_301_48@;
        }

        if@H_301_48@ (needRestart) {
            this._am.setEventCallback(null@H_301_48@);
            this._updateListener = null@H_301_48@;
            // Prepend the manifest‘s search path
            var searchPaths =@H_301_48@ jsb.fileUtils.getSearchPaths();
            var newPaths = this@H_301_48@._am.getLocalManifest().getSearchPaths();
            console.log(JSON.stringify(newPaths));
            Array.prototype.unshift.apply(searchPaths,newPaths);
            // This value will be retrieved and appended to the default search path during game startup,
            // please refer to samples/js-tests/main.js for detailed usage.
            // !!! Re-add the search paths in main.js is very important,otherwise,new scripts won‘t take effect.
            cc.sys.localStorage.setItem(‘HotUpdateSearchPaths‘@H_301_48@,JSON.stringify(searchPaths));
            jsb.fileUtils.setSearchPaths(searchPaths);

            cc.audioEngine.stopAll();
            cc.game.restart();
        }
    },loadCustomManifest: function@H_301_48@ () {
        if (this._am.getState() ===@H_301_48@ jsb.AssetsManager.State.UNINITED) {
            var manifest = new jsb.Manifest(customManifestStr,this@H_301_48@._storagePath);
            this._am.loadLocalManifest(manifest,this@H_301_48@._storagePath);
            this.panel.info.string = ‘Using custom manifest‘@H_301_48@;
        }
    },retry: function@H_301_48@ () {
        if (!this._updating && this@H_301_48@._canRetry) {
            this.panel.retryBtn.active = false@H_301_48@;
            this._canRetry = false@H_301_48@;
            
            this.panel.info.string = ‘Retry Failed Assets...‘@H_301_48@;
            this@H_301_48@._am.downloadFailedAssets();
        }
    },checkUpdate: function@H_301_48@ () {
        if (this@H_301_48@._updating) {
            this.panel.info.string = ‘Checking or updating ...‘@H_301_48@;
            return@H_301_48@;
        }
        if (this._am.getState() ===@H_301_48@ jsb.AssetsManager.State.UNINITED) {
            // Resolve md5 url
            var url = this@H_301_48@.manifestUrl.nativeUrl;
            if@H_301_48@ (cc.loader.md5Pipe) {
                url =@H_301_48@ cc.loader.md5Pipe.transformURL(url);
            }
            this@H_301_48@._am.loadLocalManifest(url);
        }
        if (!this._am.getLocalManifest() || !this@H_301_48@._am.getLocalManifest().isLoaded()) {
            this.panel.info.string = ‘Failed to load local manifest ...‘@H_301_48@;
            return@H_301_48@;
        }
        this._am.setEventCallback(this.checkCb.bind(this@H_301_48@));

        this@H_301_48@._am.checkUpdate();
        this._updating = true@H_301_48@;
    },hotUpdate: function@H_301_48@ () {
        if (this._am && !this@H_301_48@._updating) {
            this._am.setEventCallback(this.updateCb.bind(this@H_301_48@));

            if (this._am.getState() ===@H_301_48@ jsb.AssetsManager.State.UNINITED) {
                // Resolve md5 url
                var url = this@H_301_48@.manifestUrl.nativeUrl;
                if@H_301_48@ (cc.loader.md5Pipe) {
                    url =@H_301_48@ cc.loader.md5Pipe.transformURL(url);
                }
                this@H_301_48@._am.loadLocalManifest(url);
            }

            this._failCount = 0@H_301_48@;
            this@H_301_48@._am.update();
            this.panel.updateBtn.active = false@H_301_48@;
            this._updating = true@H_301_48@;
        }
    },show: function@H_301_48@ () {
        if (this.updateUI.active === false@H_301_48@) {
            this.updateUI.active = true@H_301_48@;
        }
    },// use this for initialization
    onLoad: function@H_301_48@ () {
        // Hot update is only available in Native build
        if (!@H_301_48@cc.sys.isNative) {
            return@H_301_48@;
        }
        this._storagePath = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : ‘/‘) + ‘blackjack-remote-asset‘@H_301_48@);
        cc.log(‘Storage path for remote asset : ‘ + this@H_301_48@._storagePath);

        // Setup your own version compare handler,versionA and B is versions in string
        // if the return value greater than 0,versionA is greater than B,
        // if the return value equals 0,versionA equals to B,
        // if the return value smaller than 0,versionA is smaller than B.
        this.versionCompareHandle = function@H_301_48@ (versionA,versionB) {
            cc.log("JS Custom Version Compare: version A is " + versionA + ‘,version B is ‘ +@H_301_48@ versionB);
            var vA = versionA.split(‘.‘@H_301_48@);
            var vB = versionB.split(‘.‘@H_301_48@);
            for (var i = 0; i < vA.length; ++@H_301_48@i) {
                var a =@H_301_48@ parseInt(vA[i]);
                var b = parseInt(vB[i] || 0@H_301_48@);
                if (a ===@H_301_48@ b) {
                    continue@H_301_48@;
                }
                else@H_301_48@ {
                    return a -@H_301_48@ b;
                }
            }
            if (vB.length >@H_301_48@ vA.length) {
                return -1@H_301_48@;
            }
            else@H_301_48@ {
                return 0@H_301_48@;
            }
        };

        // Init with empty manifest url for testing custom manifest
        this._am = new jsb.AssetsManager(‘‘,this._storagePath,this@H_301_48@.versionCompareHandle);

        var panel = this@H_301_48@.panel;
        // Setup the verification callback,but we don‘t have md5 check function yet,so only print some message
        // Return true if the verification passed,otherwise return false
        this._am.setVerifyCallback(function@H_301_48@ (path,asset) {
            // When asset is compressed,we don‘t need to check its md5,because zip file have been deleted.
            var compressed =@H_301_48@ asset.compressed;
            // Retrieve the correct md5 value.
            var expectedMD5 =@H_301_48@ asset.md5;
            // asset.path is relative path and path is absolute.
            var relativePath =@H_301_48@ asset.path;
            // The size of asset file,but this value could be absent.
            var size =@H_301_48@ asset.size;
            if@H_301_48@ (compressed) {
                panel.info.string = "Verification passed : " +@H_301_48@ relativePath;
                return true@H_301_48@;
            }
            else@H_301_48@ {
                panel.info.string = "Verification passed : " + relativePath + ‘ (‘ + expectedMD5 + ‘)‘@H_301_48@;
                return true@H_301_48@;
            }
        });

        this.panel.info.string = ‘Hot update is ready,please check or directly update.‘@H_301_48@;

        if (cc.sys.os ===@H_301_48@ cc.sys.OS_ANDROID) {
            // Some Android device may slow down the download process when concurrent tasks is too much.
            // The value may not be accurate,please do more test and find what‘s most suitable for your game.
            this._am.setMaxConcurrentTask(2@H_301_48@);
            this.panel.info.string = "Max concurrent tasks count have been limited to 2"@H_301_48@;
        }
        
        this.panel.fileProgress.progress = 0@H_301_48@;
        this.panel.byteProgress.progress = 0@H_301_48@;
    },onDestroy: function@H_301_48@ () {
        if (this@H_301_48@._updateListener) {
            this._am.setEventCallback(null@H_301_48@);
            this._updateListener = null@H_301_48@;
        }
    }
});

注意:

var UpdatePanel = require(‘./UpdatePanel‘);  这个require的相对路径,根据项目路径自己调整

 

 UpdatPanel.js

module.exports =@H_301_48@ cc.Class({
    extends: cc.Component,properties: {
        info: cc.Label,fileProgress: cc.ProgressBar,fileLabel: cc.Label,byteProgress: cc.ProgressBar,byteLabel: cc.Label,close: cc.Node,checkBtn: cc.Node,retryBtn: cc.Node,updateBtn: cc.Node
    },onLoad () {
        this.close.on(cc.Node.EventType.TOUCH_END,function@H_301_48@ () {
            cc.director.loadScene("helloworld"@H_301_48@);
        },this@H_301_48@);
    }
});

提示:拖到update_panel节点上后,对应属性参考官方demo,下面截个图

分享图片

 

 

 

这是一个用于生成 Manfiest 文件的 NodeJS 脚本

使用样例:node version_generator.js -v 2.2.0 -u http://192.168.1.103:8081/remote-assets/ -s build/jsb-link/ -d assets/

-v 2.2.0                      版本号

-u http://192.168.1.103:8081/remote-assets/    远程地址

-s build/jsb-link/                  源文件路径build/jsb-link/或build/jsb-default/

-d assets/                    生成后目标路径         

 

version_generator.js

var fs = require(‘fs‘@H_301_48@);
var path = require(‘path‘@H_301_48@);
var crypto = require(‘crypto‘@H_301_48@);

var manifest =@H_301_48@ {
    packageUrl: ‘http://localhost/tutorial-hot-update/remote-assets/‘@H_301_48@,remoteManifestUrl: ‘http://localhost/tutorial-hot-update/remote-assets/project.manifest‘@H_301_48@,remoteVersionUrl: ‘http://localhost/tutorial-hot-update/remote-assets/version.manifest‘@H_301_48@,version: ‘1.0.0‘@H_301_48@,assets: {},searchPaths: []
};

var dest = ‘./remote-assets/‘@H_301_48@;
var src = ‘./jsb/‘@H_301_48@;

// Parse arguments
var i = 2@H_301_48@;
while ( i <@H_301_48@ process.argv.length) {
    var arg =@H_301_48@ process.argv[i];

    switch@H_301_48@ (arg) {
    case ‘--url‘@H_301_48@ :
    case ‘-u‘@H_301_48@ :
        var url = process.argv[i+1@H_301_48@];
        manifest.packageUrl =@H_301_48@ url;
        manifest.remoteManifestUrl = url + ‘project.manifest‘@H_301_48@;
        manifest.remoteVersionUrl = url + ‘version.manifest‘@H_301_48@;
        i += 2@H_301_48@;
        break@H_301_48@;
    case ‘--version‘@H_301_48@ :
    case ‘-v‘@H_301_48@ :
        manifest.version = process.argv[i+1@H_301_48@];
        i += 2@H_301_48@;
        break@H_301_48@;
    case ‘--src‘@H_301_48@ :
    case ‘-s‘@H_301_48@ :
        src = process.argv[i+1@H_301_48@];
        i += 2@H_301_48@;
        break@H_301_48@;
    case ‘--dest‘@H_301_48@ :
    case ‘-d‘@H_301_48@ :
        dest = process.argv[i+1@H_301_48@];
        i += 2@H_301_48@;
        break@H_301_48@;
    default@H_301_48@ :
        i++@H_301_48@;
        break@H_301_48@;
    }
}


function@H_301_48@ readDir (dir,obj) {
    var stat =@H_301_48@ fs.statSync(dir);
    if (!@H_301_48@stat.isDirectory()) {
        return@H_301_48@;
    }
    var subpaths =@H_301_48@ fs.readdirSync(dir),subpath,size,md5,compressed,relative;
    for (var i = 0; i < subpaths.length; ++@H_301_48@i) {
        if (subpaths[i][0] === ‘.‘@H_301_48@) {
            continue@H_301_48@;
        }
        subpath =@H_301_48@ path.join(dir,subpaths[i]);
        stat =@H_301_48@ fs.statSync(subpath);
        if@H_301_48@ (stat.isDirectory()) {
            readDir(subpath,obj);
        }
        else if@H_301_48@ (stat.isFile()) {
            // Size in Bytes
            size = stat[‘size‘@H_301_48@];
            md5 = crypto.createHash(‘md5‘).update(fs.readFileSync(subpath,‘binary‘)).digest(‘hex‘@H_301_48@);
            compressed = path.extname(subpath).toLowerCase() === ‘.zip‘@H_301_48@;

            relative =@H_301_48@ path.relative(src,subpath);
            relative = relative.replace(/\\/g,‘/‘@H_301_48@);
            relative =@H_301_48@ encodeURI(relative);
            obj[relative] =@H_301_48@ {
                ‘size‘@H_301_48@ : size,‘md5‘@H_301_48@ : md5
            };
            if@H_301_48@ (compressed) {
                obj[relative].compressed = true@H_301_48@;
            }
        }
    }
}

var mkdirSync = function@H_301_48@ (path) {
    try@H_301_48@ {
        fs.mkdirSync(path);
    } catch@H_301_48@(e) {
        if ( e.code != ‘EEXIST‘ ) throw@H_301_48@ e;
    }
}

// Iterate res and src folder
readDir(path.join(src,‘src‘@H_301_48@),manifest.assets);
readDir(path.join(src,‘res‘@H_301_48@),manifest.assets);

var destManifest = path.join(dest,‘project.manifest‘@H_301_48@);
var destVersion = path.join(dest,‘version.manifest‘@H_301_48@);

mkdirSync(dest);

fs.writeFile(destManifest,JSON.stringify(manifest),(err) =>@H_301_48@ {
  if (err) throw@H_301_48@ err;
  console.log(‘Manifest successfully generated‘@H_301_48@);
});

delete@H_301_48@ manifest.assets;
delete@H_301_48@ manifest.searchPaths;
fs.writeFile(destVersion,(err) =>@H_301_48@ {
  if (err) throw@H_301_48@ err;
  console.log(‘Version successfully generated‘@H_301_48@);
});

 

 

 

 

启本地服务器:这里使用NodeJS

1. 新建一个文件夹nodejs

2. 在nodejs中新建hotUpdate文件

3. 把构建后的res和src复制到hotUpdate文件夹中

4. 在nodejs文件夹中新建一个app.js脚本

var express = require(‘express‘@H_301_48@);
var path = require(‘path‘@H_301_48@);
var app =@H_301_48@ express();
app.use(express.static(path.join(__dirname,‘hotUpdate‘@H_301_48@)));
app.listen(8081); // 端口自己起一个不常用的,以免被占用

5. 命令行进入到nodejs文件夹下,执行node app.js命令,启动服务器,

6. 可以访问http://192.168.1.103:8081/remote-assets/project.manifest,如果成功访问则服务器启动成功。

注意:192.168.1.103:8081  根据自己的本机地址更改,可以命令行ifconfig查看,也可以在这里查看

分享图片

 

 

 

整理操作流程:

1、选择ios或者android平台构建

2、构建完成后拷贝官方的version_generator.js到项目根目录下(和assets同级)(后者使用上面贴的version_generator.js代码

3、命令行进到version_generator.js目录,执行node version_generator.js -v 1.0.0 -u http://192.168.1.103:8081/remote-assets/ -s build/jsb-link/ -d assets/

4、在项目assets目录下会生成两个文件:project.manifest  和  version.manifest

5、回到Creator把Canvas节点上的脚本ManifestUrl属性关联上生成的project.manifest文件

6、xcode打开项目,运行到ios设备上

 

7、接下来制作新版本(hotUpdate页面左上角按钮会跳helloworld页面,我们再helloworld页面做点改动)

8、helloworld页面改动后,重新构建(构建属性不要调整)

9、把构建好的(在build/jsb-link/下)res和src拷贝到 启服务器的路径下(nodejs/hotUpdate/remote-assets/)

10、再一次执行:命令行进到version_generator.js目录,执行node version_generator.js -v 1.0.1 -u http://192.168.1.103:8081/remote-assets/ -s build/jsb-link/ -d assets/

11、在项目assets目录下会生成两个文件:project.manifest  和  version.manifest

12、将这两个文件同样拷贝到 启服务器的路径下(nodejs/hotUpdate/remote-assets/),目前目录结构如下

分享图片

13、开始测试热更新,ios设备启动进入原来运行的app,点击检测更新,正常会提示有版本可以更新,然后点击更新,就能更新了,然后点击左上角按钮进入helloworld,查看改成所做修改

 

 

这个过程中会遇到的坑:ip不对,端口被占用,官方demo运行不了,版本混乱。。。

猜你在找的Cocos2d-x相关文章