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模塊自身更新等)。固然,更新機制的健壯性(不能由於更新失敗,或者更新文件被破壞形成程序沒法工做),還有如何根據平臺和機型進行版本文件的分發等,也是咱們要討論的。