Quick-cocos2d-x的热更新机制实现(终极版2)(更新3.3版本)

这个可以在更新flist文件的时候就应该可以获取到需要下载的文件大小总和,来判断存储空间是否不足。

怎么知道存储空间还有多大,要下载的文件的总和我是知道的

不同平台有不同的接口, 你可以搜索下 ios 和 android 上获取存储空间还有多大的相关链接。

用的是这更新,iOS真机报错app里已经下到flist,需要更新的资源上传到服务器根目录就行么?

flist 文件是按照我给的样式写的吗?请检查下。

问下 launcher里面getappversioncode()这个方法 得出来的版本是哪个版本?

在不同平台上定义的版本。对应发布整包的版本。

那这个发布版本是一定的,那更新过一次后,每次启动更新都会将更新目录删除?
local appVersionCode = Launcher.getAppVersionCode()
if appVersionCode ~= self._fileList.appVersion then
–新的app已经更新需要删除upd/目录下的所有文件
Launcher.removePath(self._path)
require(“main”)
return
end

不是 的 这块逻辑是当有大版本更新的时候,也就是apk 或者ipa更新了,在更新第一次启动的时候才会删除以前保存在upd/目录下的资源文件。之后再启动游戏就不会走这块的逻辑了。

thanks我看错了是

楼主可以出个quickV3的例子吗?感觉还是有点迷糊。。。

有点不太明白为什么framework_precompiled.zip也要热更新?
如果这个zip热更新到了新版,但对应的C++部分的代码还是旧版,会有问题吧,如果API变了怎么办。
我的理解这个zip应该和C++部分的核心一起升级才对,也就是需要通过app store进行大版本更新。

我遗漏了什么?

ramework_precompiled.zip 不一定是c++ 代码有问题啊 ,C++ 有问题就只能等整包更新,framework_precompiled lua 也有很多代码的 你能保证没有bug?

请看一下我楼上的解释,有不明白的,可以再提出来。

多谢解答。

如何才能得知某一版本的更新只变动了framework的而没有变动C++呢?
通过人工去看?如果只变了framework,则热更新,如果C++也变了,则app store整包更新?

一般自己的项目发布了,底层框架就应该上传自己的svn 或者git 备份保,有些改动并不是框架会修改,很有可能是你们项目需求需要修改。这样你就得维护你自己的框架版本。另外 quick 更新了, 不是大版本的更新,只是修改了一些bug,比如内存泄露,ui 等等,你的项目受到影响 需要更新,你可以从github上下载更新的quick 在和自己备份的底层框架做merge.

明白了,这样的话确实是有用。多谢多谢!

楼主您好,我有几个问题希望能帮我解答下。

1、AppDelegate.cpp 中的

void AppDelegate::initResourcePath()
{
CCFileUtils* sharedFileUtils = CCFileUtils::sharedFileUtils();
//设置SearchPaths
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
std::vectorstd::string oldSearchPaths = sharedFileUtils->getSearchPaths();
std::vectorstd::string tempPaths(oldSearchPaths);
std::vectorstd::string searchPaths;
searchPaths.push_back(sharedFileUtils->getWritablePath() + “upd/”);
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
searchPaths.push_back(“res/”);
#else
std::string strBasePath = getAppBaseResourcePath();
searchPaths.push_back(strBasePath);
searchPaths.push_back(strBasePath + “res/”);
#endif
for (int i = 0; i < tempPaths.size(); ++i) {
//searchPaths.push_back(tempPaths); 我这里编译不了 我用的是xcode6.1 改成了下面的代码
searchPaths.push_back(tempPaths*);
}
sharedFileUtils->setSearchPaths(searchPaths);
#else
sharedFileUtils->addSearchPath(“res/”);
#endif
}



这样改是否有问题?

2、客户端的flist文件是打第一个包的时候就打到res根目录下的?还是怎么回事?
launcher.lua 请看注释描述
<pre class="brush:lua; toolbar: true; auto-links: false;">

function LauncherScene:_checkUpdate()
    Launcher.mkDir(self._path)

    self._curListFile =  self._path .. Launcher.fListName
    print("curListFilePath:" .. self._curListFile)
    if Launcher.fileExists(self._curListFile) then
        self._fileList = Launcher.doFile(self._curListFile)
    end

    if self._fileList ~= nil then
        local appVersionCode = Launcher.getAppVersionCode()
        if appVersionCode ~= self._fileList.appVersion then
            --新的app已经更新需要删除upd/目录下的所有文件
            Launcher.removePath(self._path)
            require("main")
            return
        end
    else
        -- 程序在这里出问题了 调用doFile方法报错 Launcher.fListName=flist 错误为 LUA ERROR: :0: bad argument #1 to 'loadstring' (function expected, got nil)
        -- 应该是这个文件不存在导致的 而且这里只是传入一个文件名是怎么回事?
        self._fileList = Launcher.doFile(Launcher.fListName)
    end

    if self._fileList == nil then
        self._updateRetType = Launcher.UpdateRetType.OTHER_ERROR
        self:_endUpdate()
    end

    self:_requestFromServer(Launcher.libDir .. Launcher.lcherZipName, Launcher.RequestType.LAUNCHER, 30)
end


3、require(“lfs”) 这个lfs是什么东西?

4、我使用的是quickV3 RC1 我将launcher中的v2的代码全部改成了V3支持。暂时不知道还有没有其他问题,如果我所有测试通过。我将会把我的发上来跟大家分享。*
*
*
*
*
期待楼主大大的回答 多谢!!!

问题1: 是我再论坛上打漏了,应该是这样的searchPaths.push_back(tempPaths i ]);
问题2:客户端的flist文件是打包的时候就放到res根目录下的
问题3:require(“lfs”) 是lua版本的文件操作库
问题4:quick v3版本的只需要修改v3支持的地方就可以跑在v3上了。
PS: 我发现 论坛上的bug了 “ i ]” 打了不能显示 。。。。。。必须在中间加空格。

请查看楼上回答。