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

creator1.52,通过热更新方式下载了图片资源后,没有立即重启,而是接着点击屏幕操作,为什么会报如下错误呢?
/Users/*/Library/Developer/CoreSimulator/Devices/D92DADE8-621C-46CB-AEA5-0ED899F5CD41/data/Containers/Bundle/Application/1278BB83-572F-43AA-B9A3-D322FFA63BE1/-mobile.app/src/jsb_polyfill.js:17360:TypeError: split[1].split is not a function
jsb_polyfill.js中的代码片段:
[ (function(require, module, exports) {
var CallbacksInvoker = require("…/platform/callbacks-invoker");
var Path = require("…/utils/CCPath");
var JS = require("…/platform/js");
var _qid = 0 | 998 * Math.random();
var _queues = {};
var _pool = [];
var _POOL_MAX_LENGTH = 10;
var ItemState = {
WORKING: 1,
COMPLETE: 2,
ERROR: 3
};
var _queueDeps = {};
var _parseUrl = function(url) {
var result = {};
if (!url) {
return result;
}
var split = url.split("?");
if (!split || !split[0]) {
return result;
}
result.url = split[0];
if (!split[1]) {
return result;
}
result.param = {};
split = split[1].split("&");//17360行
split.forEach((function(item) {
var itemSplit = item.split("=");
result.param[itemSplit[0]] = itemSplit[1];
}));
return result;
};

是不是在更新后立即去请求一个更新后才有的 url 了?这样的话 AssetsLibrary 那边是找不到这个 url 的

一共6本书资源,4/5/6的图片和音频资源通过热更新方式下载,我点击4后下载了相关资源,然后点击1/2/3进入场景,都报这个错误。如果继续点击5或6的话,热更新的代码还会执行,可以下载5和6的。
看似是loadScene的操作都会报错。

建议更新以后都重启一下,不然我不确定会不会有什么问题

嗯,那就需要持久化记录当前下载资源对应的场景,重启后可以直接进入到这个场景,保持用户操作的连贯性。
另外:大厅子游戏的那个帖子,下载子游戏后,没有重启,而是直接require了子游戏对应的main.js,为什么可以呢

因为那个 main.js 在执行新场景的 main 之前,什么也没做,没有初始化 AssetsLibrary,loader 等

我的项目使用你的这个热更新,功能测试正常,唯独有一个毛病,android热更新后,使用cc.game.restart()后,从第一场景切到第二场景会崩溃,应该说很常见,但ios没有这问题,使用
this.scheduleOnce(function(){
cc.game.restart();
},0.5)后,情况有好转,但仍存在第一次切换场景就崩的情况,但崩溃后,手动点开游戏,一切正常(热更新也是成功的),感觉像是cc.game.restart()不靠谱,论坛中也有反映android cc.game.restart() 崩溃的情况,panda有时间查查这个问题吗

这个在 1.6 会修复

1.6修复 1.7接着修复 哈哈

[quote=“panda, post:11, topic:45321”]
哪个是远程和本地并不重要,你只要保障你返回的比较结果是正确的就可以了。如果不写由引擎默认的版本对比函数来对比,支持 x.x.x.x 这种形式的版本号
[/quote] 不知道远程和本地 怎么确保比较的结果是正确的?

在热更新完以后 返回的code是jsb.EventAssetsManager.ALREADY_UP_TO_DATE而不是jsb.EventAssetsManager.UPDATE_FINISHED 请问这是怎么回事,急 求回复

意思是检测的时候当前版本已经是最新的了

你说的热更新完成,下载了最新的版本么,如果没有下载的话,就是两端的版本号没有差异化

我按照范例实践热更新模块模块之后,检查到有新版本更新,并且更新成功了,但是更新的功能并没有在手机中出现,请问会是什么问题呢?

如何判断新资源是否覆盖旧资源?

Resuming from previous unfinished update, 3 files remains to be finished
jsb.EventAssetsManager.ERROR_UPDATING这个错误事件。
产生的原因是之前我的服务端的manifest文件里有不可达的文件路径,1.1版本。
我修改好了服务端的manifest文件,还是报这个错误,但是提高版本号到1.2就可以下载了。

这个是怎么识别出上次未更新下载完全的呢?用的还是之前错误的1.1版本的manifest文件呢?但是我在storagePath目录下没看到manifest文件。

1.6beta6.2
@panda

上次未完成的更新是保存在:“下载路径_temp/project.manifest.temp" 中的,里面会有哪些文件已经下载哪些没有下载的标识

1赞

按照这个规则找到了project.manifest.temp文件,多谢panda

mark 热更新

今天试了下热更新,出现了几个问题
ios手机没问题
android手机大部分没问题
安卓模拟器和部分安卓手机有问题
android-19
下载version.manifest和project.manifest等文件时,下载下来的数据变成html数据
如下图


内网测有这个问题

下面是manifest文件,使用的是外网,只有两个manifest文件,可以测试一下
manifest.zip (624 字节)