適配 Korok 遊戲到 MAC
來自專欄 korok引擎開發5 人贊了文章
前幾天我們 Android 版本的 2048 小遊戲上線了 GooglePlay,接下來就開始了 MAC 版本的適配,MAC 平台相對 Android 來說,更為簡單,我們之前提供的文件、語言相關的方法都是跨平台的,所以 MAC 版本基本上沒有多餘的操作,直接打包構建二進位文件了。
回顧一下,做 Android 時候提供的平台相關的方法:
var lang = hid.Language()var file = hid.FileDir()
在 MAC 上提供這些方法使用的是 Go 調用 Objec-C 實現的,中間使用 Cgo 作為中介。以語言為例,調用 Object-C 的代碼大概如下:
/*#cgo CFLAGS: -x objective-c#cgo LDFLAGS: -framework Cocoa#import <Cocoa/Cocoa.h>#include <stdlib.h>#include <string.h>char* kk_getLanguage() { // get the current language and country config NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSArray *languages = [defaults objectForKey:@"AppleLanguages"]; NSString *currentLanguage = [languages objectAtIndex:0]; // get the current language code.(such as English is "en", Chinese is "zh" and so on) NSDictionary* temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage]; NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode]; //get uft8 string and copy it const char* str = [languageCode UTF8String]; char * retString = strdup(str); return retString;}*/import "C"import ( "unsafe")func Language() string { return deviceAttr.Lang(func() string { var ret string cstring := C.kk_getLanguage() ret = C.GoString(cstring) C.free(unsafe.Pointer(cstring)) return ret })}
這樣,我們的同一套代碼也得到了復用。適配 MAC 的大部分工作集中到了打包環節。
如何構建一個 MAC 系統的可執行程序?
如果是 Go 語言的工程,使用 go build
既可以編譯出一個可執行的二進位文件,比如我們的2048遊戲,工程目錄大概如下:
tree ..├── assets│ ├── icon.png│ └── simp.ttf├── board.go├── color.go├── file.go├── file_darwin.go├── input.go├── main.go├── popup.go├── text_font.go└── tile.go
需要注意的是這樣會編譯出來的工程可能會存在一些兼容性的為,手動執行Build出來的二進位文件是沒有問題的,但是到打包環節MAC會檢測打包的二進位的兼容性,這需要在編譯的時候指定MAC的最低兼容API版本既mmacosx-version-min=10.8
,需要這麼寫:
$ CGO_CFLAGS=-mmacosx-version-min=10.8 CGO_LDFLAGS=-mmacosx-version-min=10.8 go build -ldflags -v *.go
這是 go 的一些原因導致的見 https://github.com/golang/go/issues/18400 有詳細解釋。
這個二進位文件還依賴 assets
目錄,所以需要打包成 MAC 的可執行文件格式才方便分發。MAC 的可執行文件其實是一個以 .app
作為後綴名的文件夾,大概結構如下:
? cd The 2048 Game.app ? The 2048 Game.app tree Contents Contents├── Info.plist├── MacOS│ └── 2048├── Resources│ ├── assets│ │ ├── icon.png│ │ └── simp.ttf│ └── icon.icns└── _CodeSignature └── CodeResources
其中,分為4個部分:
- Info.plist 配置文件,包含可執行文件名,ICON 等信息
- MacOS 存放可執行的二進位文件的地方
- Resources 資源目錄
- _CodeSignature 簽名信息,發布到 MAC STORE 才需要簽名(可以不簽)
這樣,我們把用 go build
打包出來的二進位可執行文件複製到 MacOS 目錄,把依賴的資源複製到 Resources 目錄,基本上算是完成了。接下來需要給應用添加圖標和配置文件,典型的 Info.plist 可以從一個MAC應用工程裡面複製出來,然後做一些修改即可。比較關鍵的欄位有:
- CFBundleExecutable 可執行二進位文件名字
- CFBundleIdentifier 包名,應用的唯一ID
- CFBundleIconFile Icon 文件的名字
其它的信息可以參考:
? Contents cat Info.plist <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>CFBundleGetInfoString</key> <string>The 2048 Game</string> <key>CFBundleExecutable</key> <string>2048</string> <key>CFBundleIdentifier</key> <string>io.korok.2048</string> <key>CFBundleName</key> <string>The 2048 Game</string> <key>CFBundleIconFile</key> <string>icon.icns</string> <key>CFBundleShortVersionString</key> <string>1.0</string> <key>CFBundleVersion</key> <string>1.2</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>IFMajorVersion</key> <integer>0</integer> <key>IFMinorVersion</key> <integer>1</integer> <key>NSHighResolutionCapable</key> <true/> <key>NSSupportsAutomaticGraphicsSwitching</key> <true/> <key>LSApplicationCategoryType</key> <string>public.app-category.games</string> <key>NSHumanReadableCopyright</key> <string>Copyright ? 2018 Korok.io. All rights reserved.</string> <key>LSMinimumSystemVersion</key> <string>10.9</string> <key>CFBundleDevelopmentRegion</key> <string>en</string></dict></plist>
然後就是應用圖片,MAC 應用的圖片文件是 icns
文件,其實是一個文件包含了多種解析度的圖標集合。MAC 提供了工具來自動生成 icns
文件,我用的是網上找到的一段腳本,提供了一個1024*1024的圖標文件作為模板便可以生成 icns
。
如果這些信息都準備好了,複製到 .app
文件中,會發現文件夾的樣子變成了:
這和MAC上的其它應用已經沒有區別了。甚至直接 zip
之後就可以分發。但是如果需要上傳到 Mac Store,那麼還要做簽名、打包 pkg
文件,這些工作屬於 MAC 開發人員的日常,在此不表。
最後,歡迎大家下載體驗我們MAC版本的2048小遊戲,相比 Android 版本,重新設計了UI,添加了不同模式的選擇:
可以選擇 4X4/5X5/6X6 等不同的模式。
傳送門:https://ntop.itch.io/the-2048-game
PS: 因為是2048題材,在上傳MacStore的時候被拒絕了很多次,事實上我的硬碟里還有好幾份修改版,2048中文版本/2048天干地支版/2048最簡版.. 總之都被拒絕了,做這款遊戲主要還是為了演示所以還是需要上傳到一個地方,最後發現了 itch.io , 一個非常適合放原型遊戲的地方。關於 MacStore/AppStore 歡迎有經驗的同學再下面評論交流,因為我發現上面有很多山寨的遊戲或者是直接從手機適配來的遊戲但是確能審核通過,這是一件奇妙的事情。
推薦閱讀:
※AAPL Beijing Council 招募辦法(Developer Version)
※那些用了都說好的MAC軟體
※為PowerBook G3 Series添加USB介面
※BootMania伺服器端配置並網路啟動舊款Mac電腦
※解決 macOS High Sierra 系統「安全性與隱私」設置中沒有「任何來源」選項問題