cocoscreatorホットアップデート

最初は公式文書であります

http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html
http://docs.cocos.com/creator/manual/zh/advanced-topics/assets-manager.html

原則のホットアップデート

クライアントがありproject.manifestのいくつかの情報を含むファイルは:

  • たPackageURL:URL、サーバーのルートディレクトリ更新パケット。
  • remoteManifestUrl:URL、サーバー上の[オプション] project.manifest URLファイル、
  • remoteVersionUrl:URL、サーバーversion.mainifest URLファイル。
  • バージョン:XXX、プロジェクトのバージョン。
  • 資産:{}、リソースリスト;
    キー:相対パス・リソース(リソースルートに対して)
    MD5:MD5値は、バージョン情報リソースファイル表す
    圧縮を:trueの場合、[オプション]、ファイルを自動的に解凍ダウンロードされます現在、唯一のzip圧縮フォーマットのサポート
    サイズスケジュール情報に素早くアクセスするために、[オプション]バイトサイズのファイル:
  • 、検索パス:「」、検索パス

地元を介してクライアントproject.manifest URLで、サーバー・取得することができますproject.manifestを、両方のファイルの比較のバージョン属性は、クライアントの場合はバージョンがサーバーよりも低い場合、更新を開始します。
更新内容:資産は完全なリソースのプロジェクトを一覧表示し、ファイルリスト、である、各リソースは、MD5は、ローカルクライアントによると、言ったproject.manifest 資産のリストとサーバーの資産のリストをダウンロードするには異なるリソースを比較しますすべてのリソースが正常であれば、一時的なフォルダは、最終的には、ローカルキャッシュフォルダを置き換えるために一時フォルダの内容を入れて、フォルダの最初の検索パスを変更します。そのため、リソースの使用は、キャッシュフォルダから最初の検索の後、ゲームを再起動します。

環境のニーズ

  • nodejs
  • cocoscreator

公式ケース

  • ダウンロード公式の例を、抽出します。場合は、クライアントを入れていると、サーバーのリソースがうまくパッケージされ、リモート資産フォルダの更新パッケージ。

     
    image.png

     

  • サーバー - 私はnodejsを使用しています。

1. hotUpdateフォルダに新しいフォルダnodejs、新しいhotUpdateフォルダnodejs、公式のコピーリモート資産のケースを作成します。


 
image.png

2.新しいnodejsのJSスクリプトを作成し、次のようにスクリプトを読み込みます

var express = require('express');
var path = require('path'); var app = express(); app.use(express.static(path.join(__dirname, 'hotUpdate'))); app.listen(80); 

3.ファイル名を指定して実行nodejsフォルダノードapp.jsあなたがアクセスすることができ、サーバを起動するためのコマンドhttp://127.0.0.1/remote-assets/project.manifestを成功し、サーバーが正常に起動しアクセスする場合は、。

 
image.png

 

次に、URL内のマニフェストファイルを変更し、3つのファイルは、公式プロジェクトの資産フォルダに、2つのサフィックスマニフェストファイルサーバリモート資産を修正する必要がありますproject.manifest

 
image.png

 
image.png

唯一の3つのURLを変更
 
image.png

変更が完了したら、シミュレータの実行と結果を確認するためのプロジェクトを開きます。
Check for Updatesボタンをクリックします
 
image.png

今すぐ更新]ボタンをクリックします
 
image.png

 

何らかの理由で、エミュレータの更新は、リソースを使用することはできません更新を再開するので、ネイティブにコンパイルする必要が完了し、私のコンピュータではなく地図上、窓をコンパイルすることはできません。セルフテストにパッケージ化APKが正常に更新することができます。

スクラッチ

  • 新しいバージョンで作成し
    たプロジェクトの新しいバージョンは、サーバー上に格納されたリソースであるとして、2つのシーンがあります。古いバージョンとしてシーンを削除するには、携帯電話上でコンパイルしてインストール。目標は、新しいバージョンへのホットアップデートの古いバージョンを使用して、成功したシーンを切り替えることです。
    新しいプロジェクトを作成し、二つの新しいシーンが、HelloWorldのテストシナリオは、シーンのよりホットラインの成功である(古いバージョンはHelloWorldの存在しない、あなたは、更新することにより、シーンにジャンプすることができます)。hotUpdateシナリオ、シナリオは、以下の2つのプログレスバーを追加し、ファイルの2種類に対応したバイト数が、3つのラベルを進行し、進捗プロンプト情報の2種類、3つのボタン、つまり、更新を確認、更新、ハンドオーバシナリオに対応します。

     
    image.png

     

  • スクリプトの--copy公式例
    新しいhotUpdateスクリプトは、キャンバスの上に追加しました。5つの追加のスクリプト変数は、対応するノードにシーンをドラッグします。ボタンの上に彼をバインドするために、3つのコールバックメソッドを増加しました。

     
    image.png

     

    cc.Class({
    extends: cc.Component,

    properties: {
        byteLabel: cc.Label,
        fileLabel: cc.Label,
        byteProgress: cc.ProgressBar, fileProgress: cc.ProgressBar, label: cc.Label, manifestUrl: cc.RawAsset, }, onLoad() { var self = this; this._storagePath = jsb.fileUtils.getWritablePath(); this._am = new jsb.AssetsManager('', this._storagePath, this.versionCompareHandle); if (!cc.sys.ENABLE_GC_FOR_NATIVE_OBJECTS) { this._am.retain(); } this._am.setVerifyCallback(function (path, asset) { var compressed = asset.compressed; var expectedMD5 = asset.md5; var relativePath = asset.path; var size = asset.size; if (compressed) { self .label.string = "Verification passed : " + relativePath; return true; } else { self .label.string = "Verification passed : " + relativePath + ' (' + expectedMD5 + ')'; return true; } }); this.byteProgress.progress = 0; this.fileProgress.progress = 0; }, hotUpdate() { if (this._am && !this._updating) { this._updateListener = new jsb.EventListenerAssetsManager(this._am, this.updateCb.bind(this)); cc.eventManager.addListener(this._updateListener, 1); if (this._am.getState() === jsb.AssetsManager.State.UNINITED) { this._am.loadLocalManifest(this.manifestUrl); } this._am.update(); this._updating = true; } }, checkUpdata() { if (this._updating) { this.label.string = 'Checking or updating ...'; return; } if (this._am.getState() === jsb.AssetsManager.State.UNINITED) { this._am.loadLocalManifest(this.manifestUrl); } if (!this._am.getLocalManifest() || !this._am.getLocalManifest().isLoaded()) { this.label.string = 'Failed to load local manifest ...'; return; } this._checkListener = new jsb.EventListenerAssetsManager(this._am, this.checkCb.bind(this)); cc.eventManager.addListener(this._checkListener, 1); this._am.checkUpdate(); this._updating = true; }, changeScene() { cc.director.loadScene('helloworld'); }, checkCb: function (event) { switch (event.getEventCode()) { case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST: this.label.string = "No local manifest file found, hot update skipped."; break; case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST: case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST: this.label.string = "Fail to download manifest file, hot update skipped."; break; case jsb.EventAssetsManager.ALREADY_UP_TO_DATE: this.label.string = "Already up to date with the latest remote version."; break; case jsb.EventAssetsManager.NEW_VERSION_FOUND: this.label.string = 'New version found, please try to update.'; this.fileProgress.progress = 0; this.byteProgress.progress = 0; break; default: return; } cc.eventManager.removeListener(this._checkListener); this._checkListener = null; this._updating = false; }, updateCb: function (event) { var needRestart = false; var failed = false; switch (event.getEventCode()) { case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST: this.label.string = 'No local manifest file found, hot update skipped.'; failed = true; break; case jsb.EventAssetsManager.UPDATE_PROGRESSION: this.byteProgress.progress = event.getPercent(); this.fileProgress.progress = event.getPercentByFile(); this.fileLabel.string = event.getDownloadedFiles() + ' / ' + event.getTotalFiles(); this.byteLabel.string = event.getDownloadedBytes() + ' / ' + event.getTotalBytes(); var msg = event.getMessage(); if (msg) { this.label.string = 'Updated file: ' + msg; } break; case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST: case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST: this.label.string = 'Fail to download manifest file, hot update skipped.'; failed = true; break; case jsb.EventAssetsManager.ALREADY_UP_TO_DATE: this.label.string = 'Already up to date with the latest remote version.'; failed = true; break; case jsb.EventAssetsManager.UPDATE_FINISHED: this.label.string = 'Update finished. ' + event.getMessage(); needRestart = true; break; case jsb.EventAssetsManager.UPDATE_FAILED: this.label.string = 'Update failed. ' + event.getMessage(); this._updating = false; this._canRetry = true; break; case jsb.EventAssetsManager.ERROR_UPDATING: this.label.string = 'Asset update error: ' + event.getAssetId() + ', ' + event.getMessage(); break; case jsb.EventAssetsManager.ERROR_DECOMPRESS: this.label.string = event.getMessage(); break; default: break; } if (failed) { cc.eventManager.removeListener(this._updateListener); this._updateListener = null; this._updating = false; } if (needRestart) { cc.eventManager.removeListener(this._updateListener); this._updateListener = null; var searchPaths = jsb.fileUtils.getSearchPaths(); var newPaths = this._am.getLocalManifest().getSearchPaths(); Array.prototype.unshift(searchPaths, newPaths); cc.sys.localStorage.setItem('HotUpdateSearchPaths', JSON.stringify(searchPaths)); jsb.fileUtils.setSearchPaths(searchPaths); cc.game.restart(); } }, }); 
  • 打包资源
    首先构建原生
     
    image.png

    构建完成在项目中会生成原生项目,热更新需要的资源是res,src两个文件夹以及里面的内容。
    把nodejs--hotUpdate--remote-assets文件夹下所有东西都删除,把res,src复制到nodejs--hotUpdate--remote-assets文件夹下。
     
    image.png

构建完原生项目,打开官方项目文件夹,拷贝出 version_generator.js 文件到helloworld项目的根目录(如下图),并在helloworld根目录打开命令窗口,执行命令,node version_generator.js -v 1.7.0 -u http://127.0.0.1/remote-assets/ -s build/jsb-default/ -d assets/

 
image.png

在assets文件夹下会多出两个文件,把他们复制到nodejs--hotUpdate--remote-assets文件夹下。


 
image.png

最终远程资源如图


 
image.png

在nodejs文件夹下执行node app.js命令,启动服务器,可以访问http://127.0.0.1/remote-assets/project.manifest,如果成功访问则服务器启动成功。

  • 制作旧版本

删除helloworld场景,脚本,texture文件夹,以及之前生成的manifest文件。保存之后构建项目,构建选项不要变动

 
image.png

、コマンドウィンドウのルートディレクトリを開き、コマンドを実行し、ノードversion_generator.js -u -v 1.0.0 HelloWorldの http://127.0.0.1/remote-assets/ -s / JSB-デフォルト/ -d資産/ビルドし 、ここで注意を- V 1.0.0、1.7.0は前に古いバージョン番号が新しいバージョンより小さいです

 

資産に生成された二つのマニフェストファイル。上記のプロパティインスペクタにProject.manifest。


 
image.png

ネイティブプラットフォームを再構築し、main.js次のコードを追加し、コンパイルします

if (cc.sys.isNative) {
   var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths');
    if (hotUpdateSearchPaths) {
         jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths)); } } 
 
image.png

今、私たちは、生産の古いバージョンを完了しました。これは、Android携帯電話上で私のパフォーマンスです。


 
image.png

 
image.png


著者:オット雨
リンクします。https://www.jianshu.com/p/cec263b6b9ac
出典:ジェーン・ブック
著者によって予約ジェーンブックの著作権、いかなる形で再現され、承認を得るために、作者に連絡して、ソースを明記してください。

おすすめ

転載: www.cnblogs.com/suneil/p/11267647.html