Quick-cocos2d-x增长了编译及加密源代码的功能(具体可参考这篇文章)。以此功能为基础,我实现了一个版本更新模块,解决了本身项目中的版本更新需求。现抛砖引玉,与你们分享。
git
从基本原理和方案讲起比较枯燥,直接从介绍具体用法开始吧。 web
要可以在线更新文件,一个服务器是必须的。我目前实现的是用HTTP协议取文件,只须要有一个基本的web服务器,能经过相似http://<server>/<filename>的连接取到文件便可。固然,若是须要根据平台和版本进行文件的分发,服务器端还须要进行相应配置。 小程序
要调试下面的例子,本身在内网甚至就在本机上搭建一个最简单的web服务器就能够了。 服务器
1、基本更新功能
1.建立一个能够自动更新的程序
首先准备好咱们的quick-x工程。做为例子,咱们直接使用create_project来建立一个新工程helloworld来使用。这一步不用我多说。
接下来,请到这里下载我写的更新模块。只须要根目录下的update.lua文件便可,其余的目录下只是个人一些例子和工具。 app
(2014.5.30加注:quick-x的2.2.3版本里的sample/2048使用了这一更新模块,可使用例子中的update.lua文件)
将update.lua文件加到helloworld工程的scripts目录下。修改文件中“local server = "http://192.168.1.98:8088/"”这一句,改为本身的服务器地址。
在scripts目录下建立一个新文件appentry.lua,而后打开工程原来的main.lua文件,把里面调用程序入口的代码复制过来。若是你使用的是最新版的quick-x,那么就只有“require("app.MyApp").new():run()”这一句。保存appentry.lua文件。
如今修改main.lua文件,去掉原来的程序入口代码,改为“require "update"”。
这样,更新模块就添加好了。程序在启动时,将先运行更新模块,完成后,自动调用appentry进入原来程序的真正入口。
如今能够先运行看看了,相信你们都会选择最方便的player来调试的。实际上真机也是没问题的。
运行后,界面上首先会显示“Loading...”,而后再进入熟悉的“Hello,world”界面。
接下来咱们调试与服务器的链接是否正常。在服务器上建立一个flist文件,内容为:
工具
local list = { ver = "1.0.1", stage = { }, remove = { }, } return list
须要保证用http://<server>/flist这样的网址能取到flist。若是是最基本的web服务器,把flist文件放在web服务目录的根下面就能够。若是但愿用http://<server>/getfile?filename=flist这样的形式取文件,请本身修改update.lua里的相关代码。 ui
如今从新运行程序,运行结果看起来没有什么不一样。不过,若是是在player上调试,应该能在helloworld工程目录下找到flist文件,和服务器上的文件内容是同样的,说明咱们从服务器取到了文件,链接是正常的。若是是真机,请在device.writablePath指向的目录下找flist文件。
如今,咱们已经有一个能够自动更新版本的程序了。为了模拟真实的应用环境,咱们将把源码加密打包再进行后面的调试。若是还不知道应该怎么打包,请再认真参考前面的文章。另外,推荐使用QuickXDev插件进行打包(可参考这一篇)。
为了后面更好的演示图片资源的更新,打包前能够修改一下MainScene.lua,在界面上添加一张图片,以下:
加密
display.addSpriteFramesWithFile(GAME_TEXTURE_DATA_FILENAME, GAME_TEXTURE_IMAGE_FILENAME) self.bg = display.newSprite("#logo.png", display.cx-200, display.cy-200) self:addChild(self.bg)
将资源放到res目录下,在config.lua里配置好GAME_TEXTURE_DATA_FILENAME和GAME_TEXTURE_IMAGE_FILENAME的值。运行能正常显示图片后,就能够真正打包源码了。 lua
假如你是彻底按照参考文章去打包的,那你应该会将打包后的文件game.zip放在res目录下,并将scripts目录下全部原来的源码所有移走,启动程序,运行结果和没打包以前一致。
2.简单的功能更新
如今,咱们但愿将显示的文字改为中文。代码的修改是很简单的,将MainScene.lua中显示的字串“Hello, World”改为“你好,世界”就能够了。
但咱们怎么让程序自动进行更新呢?固然是打包新代码而后放到服务器上让程序来取了。
由于咱们只修改了MainScene.lua,因此咱们只须要打包这个文件就能够了。打包时须要注意的是,MainScene.lua是放在app\scenes目录下的,因此它在打包目录下也应该放在相同的两级目录之下才行。
咱们将新打包的文件随便改个文件名(其实在这一情境中,仍然叫game.zip也是没问题的),好比update.bin。将它放到服务器上,固然仍然要保证http://<server>/update.bin这样的网址能取到。
接下来咱们修改服务器上的flist文件,以下:
spa
local list = { ver = "1.0.2", stage = { {name="update.bin", code="8c528975dec8b6da5811e92f10a41be0", act="load"}, }, remove = { }, } return list
能够看出,list文件的版本号变成了1.0.2,这样客户端程序就知道有了更新,准备取新的文件。
stage里指出这个版本里有多少须要下载到客户端的文件。接下来咱们将讨论一下更新的基本原理,以确认咱们的更新方式是真正可行的,同时进一步演示如何进行更深层次的功能更新(如资源路径变化的处理、framework包修改、update模块自身更新等)。固然,更新机制的健壮性(不能由于更新失败,或者更新文件被破坏形成程序没法工做),还有如何根据平台和机型进行版本文件的分发等,也是咱们要讨论的。