关于cocoscreator ios热更新的一些疑问

对cocoscreator的热更新不是很熟请教几个问题- -
通过这个方法jsb.fileUtils.getWritablePath()获取到的路径假设为PathA
PathA在安卓上一直不变,但是在ios上为啥一直都在改变呢
这是ios上的路径
/var/mobile/Containers/Data/Application/FCE3805F-7198-498D-8032-42F733E4F816/Documents/udpate/Main
中间有一串每一次进入游戏都会改变的字段


但是安卓上面这段字符串一直都是安卓的包名
//
我们从远程服务器下载的资源被存到了手机的内部存储里了。这个内部存储路径是固定的。并且路径是存储到了hotUpdateSearchPaths的key上 通过cc.sys.localStorage固化保存在用户机器上。
//但是前面说到的ios的路径会一直改变。所以我每次进入游戏都不知道怎么去找我的内部存储文件了- -
(我是将项目打的assetBundle包。然后放到服务器的。自身包体很小。所以如果本地和服务器版本号一致的情况下,每次需要从手机内部存储取到游戏资源)

啊啊啊有没有大佬知道啊- - -

你用热更,为什么还要用assetBundle?

iOS就是这样的,XCode每次安装都会更换路径,除非App Store或者Testflight覆盖安装
iOS下测试热更新可以用Chrome的devtool去调试

你好。但是我这边。通过xcode安装一个包之后。即便是退出这个包,重新进入 ,,我的内存储存路径都会改变。

如果不是通过XCode run进入的包路径就不会变,手动点进去就行

他会自动进入游戏吧,,怎么让他安装了不自动run游戏呢 :joy:,对xcode不是很熟- -

你好。我再问个小问题。在appstore里 玩家下载新包去覆盖老包的时候。那这个路径会改变吗。。。
如果会改变。一般是怎么处理的呢- -

会变,旧热更文件删除,新包新更

会变的正常不用担心, 下载的 资源放在 let downloadRoot = (jsb.fileUtils ? jsb.fileUtils.getWritablePath() : “/”);里, 然后每次构建项目时记得 改下main.js 里的 searchPath , 优先读上面的 downloadRoot 就好

自动进一次之后stop,手动点进去

那官方的main.js里的代码是不是就有点小问题了啊- -
这是官方的代码

// 在 main.js 的开头添加如下代码
(function () {
    if (typeof window.jsb === 'object') {
        var hotUpdateSearchPaths = localStorage.getItem('HotUpdateSearchPaths');
        if (hotUpdateSearchPaths) {
            var paths = JSON.parse(hotUpdateSearchPaths);
            jsb.fileUtils.setSearchPaths(paths);

            var fileList = [];
            var storagePath = paths[0] || '';
            var tempPath = storagePath + '_temp/';
            var baseOffset = tempPath.length;

            if (jsb.fileUtils.isDirectoryExist(tempPath) && !jsb.fileUtils.isFileExist(tempPath + 'project.manifest.temp')) {
                jsb.fileUtils.listFilesRecursively(tempPath, fileList);
                fileList.forEach(srcPath => {
                    var relativePath = srcPath.substr(baseOffset);
                    var dstPath = storagePath + relativePath;

                    if (srcPath[srcPath.length] == '/') {
                        cc.fileUtils.createDirectory(dstPath)
                    }
                    else {
                        if (cc.fileUtils.isFileExist(dstPath)) {
                            cc.fileUtils.removeFile(dstPath)
                        }
                        cc.fileUtils.renameFile(srcPath, dstPath);
                    }
                })
                cc.fileUtils.removeDirectory(tempPath);
            }
        }
    }
})();

不会变,用build版本号,安卓对应的是version code做缓存,如果没有该版本号的缓存则fileUtils.removeDirectory清除热更新缓存并game.restart()

大佬你说的是对的,,因为我用xcode安装一次之后。又通过xcode覆盖安装就出问题了。。但是我用xcode安装之后,自己推出去 又自己点进去 。。就是正常的了

是有点问题的,要考虑下下次换包的情况下 清除下你的下载缓存目录,不然会读旧的文件 。main.js 这里可以使用时间缀机制 作为版本标记。

嗯。。是的,,但是安卓好像可以。。因为安卓的路径不会变。。。

覆盖安装应该都存在,如果是清除安装就不存在。

嗯,我这个包因为是把本地的assetbundle包也放到服务器的。所以下载到本地的时候也会包括这块资源。所以我发出去的包 包体很小。,我在覆盖安装的时候。我上一次从服务器下载的资源是都被自动清除了。还是保留在本地呢- -

其实我就是想在版本号不变的情况下。我不管如何覆盖安装。应该都是使用 第一次下载的资源,因为我本地没资源的呀- - 所以如果根据版本号判断的结果是最新版本。我就得去用我上一次下载到本地得资源

先谢谢大佬们的回答。。这里面的大佬,超好的。说好又好听。。。
经过这两天研究。终于是解决了、、说下解决办法哈。有不对的可以指出~。。
ios存在沙盒机制,大致就是每一个app都有一个单独的内存空间,我们的应用只能在沙盒内部进行业务处理。我们的本地文件路径和资源在哪些情况下会被自动清除或者改变呢
1.当我们不对app进行安装覆盖等操作的时候,只是进入退出这种操作,我们的热更新路径和文件肯定是不会有任何变化的
2.当我们卸载app时候。之前的热更新文件和路径自然都会被删除。
3.当我们覆盖安装的时候,我们的热更新文件是不会被自动删除的。但是我们的热更新路径会自动改变,所以这种方式进入游戏的时候,我们之前存的热更新路径已经找不到我们的热更新文件了。
、、、、、、
所以说如果是覆盖安装同版本的包,也就是我们不需要从服务器下载的时候,我们就要使用本地的热更新文件了。在这种情况下我的处理逻辑就是,,判断上一次localstorge存储的热更新路径与当前的我们实际的可读写路径是否相同,相同的话证明没有进行覆盖安装操作,若不相同,只需要将我们的可搜索路径的第一个值修改为我们当前的可读写路径即可。。。
(安卓路径不会改变,所以不存在这个问题)

5赞