又遇到一个让我费解的热更新问题

ccc1.4.2 用的@panda 的version_generator生成manifest
今天刚更新版本,出了点问题,让我费解,不知道问题在哪里。之前由于cdn问题,我改成更改packageUrl的方式指定新的热更新资源路径。更新完之后,连续几个用户反馈过来有问题,我报错统计后台一查,报了一个 xxx is null ,但是这个xxx是前一个版本的变量,新版本已经移除了这个变量,变量指向资源的一个节点,新版本移除了这个节点,看起来像是更新完之后代码还是老的,但是资源是新的了。

如果卸载重装app,然后热更新到新版本,一切正常。这说明我的热更新资源是没有问题的。
而且我对比了新旧版本的project.manifest 里面的 project.jsc 的md5码,是不同的。

我想不明白这到底怎么回事。

应该是 CDN 缓存没有清除的原因导致的

我不是覆盖热更新资源的,我是改packageUrl指向一个完全新的目录的

新版本 main.js 有没有更新?会不会是 main.js 把旧版本的 search path 加进去了?另外,本地的保存路径是否一样?

this._am = new jsb.AssetsManager(this.manifestUrl, storagePath);
这个storagePath是可以直接覆盖的吧?
main的searchPath没动过,一直就是这个:
if (cc && cc.sys.isNative) { var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths'); if (hotUpdateSearchPaths) { jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths)); } }

不知有沒有重定向?

后台统计到的受影响用户还在增加,好像都是苹果用户,应该不是必现,因为上午就有1W+活跃了,如果是必现不会才影响100多个人

重定向是什么意思?

版本控制的時候, 你是直接set到root裡面, 還是通過redirect實現的

没明白你的意思。
我的更新流程是这样的:
1.构建好资源
2.用version_generator生成manifest文件
3.将生成的project.manifest里面的packageUrl改成新目录比如http://xxx/v2.0/remote-assets/
4.将构建好的res,src,project.manifest,version.manifest上传至http://xxxxx/v2.0/remote-assets/下
5.更改远程version.manifest里面的version为2.0,packageUrl,remoteManifestUrl都指向http://xxx/v2.0/remote-assets/
6.刷新一下version.manifest 的cdn缓存,更新完毕

@panda 有问题吗 ?安卓,ios是分开的,更新方式是一样的,我后台统计出问题的好像都是iphone用户

如果下载目录不变的话,假设用户下载过 v1.x 的更新文件,那么下载目录已经有一个版本了,此时更新 v2.0,更新完成后,v2.0 的文件是直接添加到下载目录下,并不会删除下载目录下原有的文件,如果同名会覆盖。但是如果 v1.x 包含的文件,v2.0 不包含,并不会删除这个文件。

你想想你的游戏这样的情况会不会带来问题。

直接覆盖应该不存在这个问题,上次更新也出过问题,也都是ios用户,我的通信协议文件是二进制文件放在resource下的,后端告诉我说,更新之后,还有不少客户端版本是新的但是发的通信协议是老版本的。说明上次更新也是有只更新到了部分的问题。实在想不明白了~

1.6.1
遇到了相同的问题,资源是新的 jsc走的老的
会不会是更新完后 被覆盖的老的jsc文件当时被占用导致覆盖失败呢 @panda

cocos creator 热更新路径存在问题,js这边热更新后,会把热更新的目录优先级调到最高,但是这样会出现莫名的问题,例如:覆盖安装新的apk,再次热更,就会出现问题

我现在的解决办法:是把热更新目录优先级调到最高的逻辑放到了c++层,目前还没有出问题

我这边检测到到新版本会把可写路径下的资源清空,然后跳转下载新的版本进行覆盖安装。安卓覆盖安装后可写目录不变,ios覆盖安装会开辟一个新的可写路径。会不会由此引发问题

覆盖安装新版本,可以把之前的可写路径清空。
http://forum.cocos.com/t/apk/50125
http://forum.cocos.com/t/app/47964/5