怎么用 Cocos2d-x 打包 iOS 游戏并上架 App Store?
Cocos2d-x 是纯代码向的引擎,C++ / Lua / JS 都能写,工程结构里 proj.ios_mac/ 下就是一个现成的 Xcode 工程。所以它的 iOS 流程比带编辑器的引擎更直接:不需要"发布"或"构建原生工程"这一步,直接用 Xcode 打开那个工程就能编。
代价是这一步必须在 macOS 上做,cocos compile -p ios 底层调的也是 Xcode 的工具链。不过签名材料的准备和最后的上传都不用 Mac,我这边是用开心上架(AppUploader)在 Windows 上处理的。
哪一步必须需要 Mac
| 环节 | 我实际怎么做的 |
|---|---|
| 注册 Bundle ID、签发证书、生成描述文件 | Windows 上做完 |
| 写代码、跑 Win32 目标调试逻辑 | Windows |
| 编译签名成 IPA | 要 macOS |
| 提交 App Store | Windows 上传 |
| 装到 iPhone 测试 | 扫码注册 UDID,再扫码装 |
说明一下:我用的签证书工具本身在 macOS 上也能用(网页版不挑系统,桌面客户端有 macOS 版)。表里"不需要 Mac"是指这一步不再需要 Xcode、钥匙串访问或 Transporter。
第一步:确认 Bundle Identifier
Cocos2d-x 的 iOS 标识就在 proj.ios_mac/ios/Info.plist 的 CFBundleIdentifier 里,或者在 Xcode 工程的 target 设置里改。定成反向域名,比如 com.yourcompany.gamename。
因为这个工程是随模板生成的,很多人一直沿用 org.cocos2dx.hellocpp 这种默认值,直到打包才发现要改。建议一开工就改掉,顺手把 CFBundleShortVersionString 和 CFBundleVersion 也理一下——build number 每次上传都得比上次大。
第二步:在 Windows 上签出证书和描述文件
注册 Bundle ID:开心上架的「Bundle ID」页面点「新建 Bundle ID」,Identifier 填上一步那个值。创建后改不了。游戏要用 Game Center、内购、推送的,在这个 Bundlfthke ID 的「权限」页面勾上再保存。
签发证书:「证书」页面点「新建证书」,上架选发布签名证书,真机调试选开发签名证书。绑定上面的 Bundle ID,填名称邮箱,设一个 .p12 保护密码——导入 Mac 钥匙串时要输,服务器不保存它,忘了只能吊销重签。
建议勾上「使用开心上架服务同步证书」。团队里写代码的人和管发版的人常常不是同一个,云备份能省掉互相传 .p12 的麻烦,也不用担心传丢或者传给错的人。
生成描述文件:「描述文件」页面点「新建描述文件」,上架选 App Store 类型,内测选 Ad Hoc 并勾上测试设备,关联上面的 Bundle ID 和证书,提交后下载 .mobileprovision。
私钥和 CSR 都在本机生成后封进 .p12,不用在 Mac 上走一遍申请证书的流程。
第三步:在 macOS 上导入签名材料
security import dist.p12 -k ~/Library/Keychains/login.keychain-db -P "你的p12密码" -T /usr/bin/codesign
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp AppStore.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
第四步:编译出 IPA
用 Xcode 打开 proj.ios_mac/项目名.xcodeproj:
- 选中 iOS 那个 target → Signing & Capabilities;
- 关掉 Automatically manage signing;
- Provisioning Profile 选刚拷进去的那份,证书选对应的;
- Product → Archive → Distribute App。
命令行方式是 cocos compile -p ios -m release,配合 xcodebuild archive 加 xcodebuild -exportArchive 出包,ExportOptions.plist 里用手动签名指定描述文件的名称(就是你在开心上架创建时填的那个名字,不是文件名也不是 UUID)。
有一点提醒:Cocos2d-x 的 Xcode 工程是随模板生成后由你自己维护的,升级引擎版本时经常要手动合并工程文件的改动。签名配置写在工程里的话,合并时容易被冲掉,稳妥做法是放进 xcconfig 或者统一交给命令行的 ExportOptions.plist 管。
第五步:把 IPA 传上去
拿到 IPA 就跟 Mac 无关了。我一般先在开心上架的「文件&提交」页面把包打开看一眼签名信息——Bundle ID、描述文件类型、证书有效期,确认了再点「提交 App Store」,日志实时滚。
命令行版本,Windows/Linux 的 Runner 也能跑:
appuploader-cli upload -f Game.ipa -u dev@example.com -p abcd-efgh-ijkl-mnop
-p 是 Apple 生成的 App 专用密码(xxxx-xxxx-xxxx-xxxx),不是 Apple ID 登录密码。团队用 API 密钥更合适:
appuploader-cli upload -f Game.ipa --api-key <KeyID> --api-issuer <IssuerID> --private-key Auth_Key.p8
密钥方式只收 .ipa,且 App 要先在 App Store Connect 里建好。
游戏包体一般不小,注意单个上传文件的大小上限,超了就得考虑把大资源改成按需下载。
第六步:发内测包
「设备」页面点「注册设备」,二维码发群里让人扫上报 UDID(一年 100 台,免费账号 3 台)。回描述文件那边点「重建」,生成一份包含这些设备的 Ad Hoc 描述文件。
在 Xcode 里换成这份描述文件,Archive 时导出方式选 Ad Hoc,然后在「文件&提交」页面生成二维码让人扫码装。
Cocos2d-x 因为工程结构直白,iOS 这条线其实比带编辑器的引擎更好控——没有"重新生成原生工程"这个环节,你在 Xcode 里配的东西不会莫名其妙被覆盖。剩下要操心的就是证书别过期、描述文件别忘了重建。