jsb.AssetsManager有哪些接口的 从哪可以看到文档或代码

jsb.AssetsManager有哪些接口的?从哪可以看到文档或代码?

我从官网的首页没有找到。
有个需求是,
修改热更新的机制。
将热更新获取远程版本的方式调整为接口方式。

2赞

1.5 中其实支持了:

https://github.com/cocos-creator/cocos2d-x-lite/blob/develop/extensions/assets-manager/AssetsManagerEx.h#L149

2赞

1.5现在可以下载使用了么?(主要是这块没有相关API文档,看的泪奔)

@panda panda大大,我现在的需求是,我的远程热更新的地址随时可能更改,所以考虑用一个接口来返回最新的热更新地址,然后再开始对接口返回的地址进行热更新检测比对,然后开始下载。
这个需求可以被支持么?

@justin_zzc 同學,你的需求跟我的一樣,
我目前是這樣做的,

每次要執行update之前,先使用 jsb.fileUtils 去修改熱更新路徑下暫存的 project.manifest
這樣 AssetsManager 在 check 或 update 的時候,就會去你想要的位址

當然第一次還沒有暫存路徑時,你要先複製一個project.manifest 過去

我目前這樣可以達成我想要的功能,參考看看

當然若Panda大神有更好的解決辦法,我也會跟進

1赞

你们可以看一下 1.5 热更新范例中是怎么加载自定义 local manifest 的,你们的需求可以动态修改 local manifest 来做到

https://github.com/cocos-creator/tutorial-hot-update/blob/master/assets/scripts/module/HotUpdate.js#L500

1赞

相对于AssetsManager更希望有出个下载组件 详细反馈下载进度的 其他的 自己代码实现起来比较灵活 因为每个人的更新 消息 机制都不一样 给我们轮子就好.
其他的 我们自己干 这样熊猫大大也可以有多时间去搞js引擎优化.
对了 还有md5组件:)

1.5 已经提供,在上面的 HotUpdate.js 范例里面也有使用方式

EventListenerAssetsManager 的event中是提供了 但是AM现在还不够灵活 (也可能是有这功能但是我不知道) 例如自定义本地路径 自定义远程服务器路径
熊猫大大这么晚还在 @老板 看到要加鸡腿啊

这个写法可以在1.4中使用么?还是只能升级到1.5呢

使用
var manifest = new jsb.Manifest(customManifestStr, storagePath);
在android中会显示如下警告就不向下执行了

Native thread exiting without having called DetachCurrentThread (maybe it’s going to use a pthread_key_create destructor?): Thread[19,tid=30372,Native,Thread*=0xad0fa840,peer=0x12c980a0,“Thread-14889”]

@RazgrizHsu 你好,你修改的其实是已经从热更新服务器下载下来的project.manifest文件么?

@panda 大神,请教下例子的customManifestStr的值为什么直接写在代码里? 刚开始没看懂,是临时写法还是啥?

@justin_zzc

我修改了部份的程式碼,整體流程是這樣的, 你參考看看


//我是這樣建立 AssetsManager 的
var onVersionCompare = function(){ /* js 的版本比對, 這邊省略 */ };
var updatePath = jsb.fileUtils.getWritablePath() + 'HotUpdate'; 
var am = new jsb.AssetsManager( '', updatePath, onVersionCompare );

//然後, 判斷update資料夾是否存在, 不存在則建立
if( !jsb.fileUtils.isDirectoryExist( updatePath ) ) jsb.fileUtils.createDirectory( updatePath );

//接著判斷manifest cache是不是存在, 若不存在則建立, 存在則直接使用
//若你的AssetsManager執行過check或update, 這個檔案會被自動建立
//若還沒執行過, 這個位置會是空的, 
//但是若要做到動態更換位址,每次都需要去修改這個檔案裡的路徑
var path_Manifest_Cache = updatePath + '/project.manifest';
var jsonString = ''; //預留變數

if ( !jsb.fileUtils.isFileExist( path_Manifest_Cache ) )
{
    //表示cache不存在, 你需要用loadRes從你項目裡的project.manifest讀出來
    //修改位址,然後寫一份到這個路徑去
    jsonString = '{project.manifest的內容}';
    jsb.fileUtils.writeStringToFile( jsonString, path_Manifest_Cache ); //寫檔
}
else
{
    //表示cache存在, 所以在餵給AssetsManager之前, 我們要先讀出來並修改位址
    jsonString = jsb.fileUtils.getStringFromFile( path_Manifest_Cache );
    var json = JSON.parse( jsonString );
    json.packageUrl = //修改過的位址
    json.remoteManifestUrl = //修改過的位址
    json.remoteVersionUrl = //修改過的位址
    jsonString = JSON.stringify( json );
    //然後再寫回去
    jsb.fileUtils.writeStringToFile( jsonString, path_Manifest_Cache ); //寫檔
}

//最後,你再把你項目裡原本的project.manifest餵給 AssetsManager
let manifest = new jsb.Manifest( jsonString, updatePath ); //先建立Manifest的類, 把json餵進去

//再餵給assetsManger
am.loadLocalManifest( manifest, updatePath );
1赞

另外,這些功能要更新到 1.5 才有哦

這些是Panda大神在1.5版本後做的修改

必须升级,升级引擎大版本时,应用包请不要通过热更新升级,需要提交完整应用包到 app store

就是个示例,实际上可以是动态生成的,可以是通过 downloader 从远程下载的,可以是从其他文件中读取的,只要你能创建出 Manfiest 对象,就可以通过 loadLocalManifest 来作为本地 manifest 使用

明白了谢谢:grinning:

因为现在还不方便更新到1.5,所以最终还是采用了类似于你的一个方法:

  1. http从远程服务器获取到到现在热更新服务器的信息(packageUrl等)
  2. 获取本地的project.Manifest文件,转化成json对象{MANI}
  3. 将{MANI}中的packageUrl等信息替换成从远程获取到的信息
  4. 将{MANI}写入到一个临时文件temp.manifest中
  5. 将temp.manifest的路径作为参数 new 一个 jsb.AssetsManager
  6. 剩下的流程就是走原来的热更新了

mark

这个loadcustom不能用啊,如果我更新完了一次并成功了,再次想要使用自定义customer更新的话是不行的。总是读取到已经下载后的版本。这个要加什么东西么还?