写了一个超长的热更新文档,欢迎反馈

每个安装包都写死一个版本号(只能写入main.js),启动的时候检查,并写入配置文件里。每次启动的时候从配置文件读取之前写入的版本号,和当前包里写死的比较,就可以判断是不是新安装了。
为了防止忘记修改。可以把这个版本号显示到界面,并和main.js的版本号比较(通过window传递)。发现不匹配,就弹出错误提示,就不会忘记修改了。

想請教 @panda 大神一個問題,

如果我需要動態修改熱更新的位址,

我是不是在

//這個路徑下
let path = jsb.fileUtils.getWritablePath() + "project.manifest";

寫入新的project.manifest,
AssetsManager就會依據這個manifest裡的網址去做熱更新了?

謝謝 :smiley:

在android 机器中!热更新过程中强杀进程!可能导致js层奔溃的问题

热更新过程中还走热更新的状态(更新进度,更新资源。。。),强杀进程后,在进入游戏就立马还走热更新的状态机制

不走 coco2d-js v3.14 (js层打印)

求解决

是这样没错,不过我在 1.5 计划提供一些新功能,比如使用自定义的 local manifest,暂时还在测试阶段。

这个我不是很理解,重新进入游戏会直接进入更新流程?这个应该是 main.js 的问题吧?你的游戏可能是在 main.js 直接检查更新状态,并直接更新。在第二次更新的时候,发现前一次更新未完成,的确会让热更新机制发现新的更新并进入更新过程

1赞

謝謝 @panda 大神的回覆,

經由您的指點,
目前我經由在初始化AssetsManager 之前,
在WriteablePath裡,修改 version&project 的Url位址,
就能夠動態改變熱更新的伺服器位置,

不過,在AssetsManager自動取得 temp Manifest的時候,
它就會使用 temp 裡的 version&project 的路徑,

這部份則修改了 AssetsManagerEx.cpp 裡的

  1. void AssetsManagerEx::downloadManifest()
    這邊 manifestUrl = _localManifest->getManifestFileUrl(); //一律使用localManifest
  2. void AssetsManagerEx::startUpdate()
    這邊 std::string packageUrl = _localManifest->getPackageUrl(); // 也是改成用localManifest

這樣組合出來的更新位址就是正確的,也能夠正常的熱更新了

我引頸期待新功能 :slightly_smiling:

1赞

跳转场景的时候跳转不了其他项目的scene 知道这个问题吧?

新功能在下一个 1.5 测试版就可以测试了,可以看一下最新的 tutorial hot update 里面的修改,主要添加了详细的进度提示(byte 和 file),以及使用自定义 local manifest 的实例

https://github.com/cocos-creator/tutorial-hot-update/commit/620fffd2f67b427592dca0c93ae5f9b9ac8529d7#diff-e672d16e4306aced3d704154da631c57

1赞

tutorialhotupdate-mobile.app/src/project.dev.js:1778:TypeError: jsb.AssetsManager.State is undefined

真机,模拟器都是报这个错误:cry:

要用还没有发布的 1.5 新 beta 版本才支持 jsb.AssetsManager.State,耐心等一下更新

感謝 @panda 大神辛苦的努力

我發現您把 manifest 的部份開放給JSB了,
這下我就能直接使用本地端的檔案了

等下一個版本出來,我再來重新整合一次
期待下一個版本,謝謝

客户端中如何做文件的md5呢?

现在github上的的热更项目https://github.com/cocos-creator/tutorial-hot-update 是只有creator 1.5才支持么?
用1.4.2报错,找到不loadLocalManifest

对,1.5 才支持,在后续版本(预计 1.6)会提供 md5 计算接口

我的也是,xcode模拟器 报jsb.AssetsManager.State is undefined

在1.4.2中可以使用下面的方法。

var data = jsb.fileUtils.getDataFromFile(path);
var curMD5 = md5(data);
if(curMD5 == asset.md5){
cc.info(‘MD5 verify success!’);
return true;
}
else{
cc.info(‘MD5 verify fail,path a:’ + path + ‘,path b:’ + asset.path + ‘,md5 a:’ + curMD5 + ‘,md5 b:’ + asset.md5);
return false;
}
具体的MD5算法附件中有。
md5.rar (3.9 KB)

1赞

下载version.manifest、project.manifest和需要更新的文件都没有加入版本信息,如何保证从cdn下载的是最新版本的文件呢?

getSearchPaths() 获取的默认路劲为空?
@panda

目前还不支持 url 后缀

对,Manifest 中的 searchPath 是相对 storage path 的相对路径,默认情况下,storage path 本来就是需要被添加到 search path 中的,只是你可以附加更多的子 search path,这个功能并不常用。

源码会把这个文件加入下载失败列表,如果下载回来的md5还是不一样。。。不会死循环么?

@panda
如果手机空间不足,热更失败会有什么事件抛出呢?
缓存中的文件有没有可能被用户(用垃圾清理工具)清理掉呢?
谢谢!