怎么在 Windows 上用 Delphi FireMonkey 开发并打包 iOS 应用程序?

12 阅读5分钟

Delphi 和 C++Builder 的 FireMonkey 在 iOS 这条线上定位很特别——IDE 只有 Windows 版,你在 Windows 上写代码、点编译,但链接和打包要通过 PAServer 转交给一台联网的 Mac,那台 Mac 上得装 Xcode 命令行工具。所以严格讲,Delphi 做 iOS 还是要一台 Mac 在网络里待命,只是你不用坐到它前面去。

我遇到的第一个真问题是 Project Options 里 Provisioning 那几个下拉框全是空的,什么都选不了。折腾下来才明白:那些下拉框读的是那台 Mac 上的钥匙串和描述文件目录,本地没东西可读。所以得先把证书和描述文件弄出来、装到 Mac 上。这两样我在 Windows 上用开心上架(AppUploader)签的,没去开钥匙串。

先说结论:哪一步真绕不开 Mac

环节我实际怎么做的
注册 Bundle ID、签发证书、生成描述文件Windows 上做完
写代码、IDE 操作Windows,IDE 本来就只有 Windows 版
链接、签名、打包成 IPA要一台 Mac——通过 PAServer 转交
提交 App StoreWindows 上传
装到 iPhone 测试扫码注册 UDID,再扫码装

说明一下:我用的工具本身在 macOS 上也能用(网页版不挑系统,桌面客户端有 macOS 版)。表里"不需要 Mac"是指这一步不再需要 Xcode、钥匙串访问或 Transporter。

第一步:把 CFBundleIdentifier 改掉

Project → Options → Application → Version Info(切到 iOS Device 64-bit 平台),CFBundleIdentifier 字段填反向域名,比如 com.yourcompany.appname。

默认值常常是 com.embarcadero.$(MSBuildProjectName) 这种模板串。这是最常见的签名失败原因——我第一次打包就是忘了改,报错信息也不明说,查了半天。改完之后确认 Release 配置下也生效了,两个配置是分开的。

第二步:在 Windows 上签出证书和描述文件

注册 Bundle ID:开心上架的「Bundle ID」页面点「新建 Bundle ID」,Identifier 填第一步那个值。创建后改不了。要用推送这些能力的,在「权限」页面勾上再保存。 注册bid

签发证书:「证书」页面点「新建证书」,上架选发布签名证书,真机调试选开发签名证书。绑定 Bundle ID,填名称邮箱,设一个 .p12 保护密码——把证书导入那台 Mac 的钥匙串时要输,服务器不保存它,忘了只能吊销重签。

建议勾上「使用开心上架服务同步证书」。那台 Mac 可能不在你手边(我们的就放在机房),靠云备份直接在上面下载同一张证书,比远程拷文件省事。

生成描述文件:「描述文件」页面点「新建描述文件」,上架选 App Store 类型,内测选 Ad Hoc 并勾上测试设备,真机调试选开发类型。关联上面的 Bundle ID 和证书,提交后下载 .mobileprovision。

私钥和 CSR 在本机生成,不用在 Mac 上用钥匙串请求证书。

第三步:把材料装到 PAServer 那台 Mac 上

在那台 Mac 上执行(或者把文件拷过去双击导入):

# 导入证书(含私钥)
security import dist.p12 -k ~/Library/Keychains/login.keychain-db -P "你的p12密码" -T /usr/bin/codesign

# 描述文件放到 Xcode 认识的位置
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp AppStore.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/

导完之后回 Windows 的 IDE,Project → Options → Provisioning(不同 Delphi 版本入口名字略有差异)里就能读到列表了,按构建类型分别选:

  • Development:开发类型描述文件 + 开发签名证书;
  • Ad Hoc:Ad Hoc 描述文件 + 发布签名证书;
  • App Store:App Store 描述文件 + 发布签名证书。

前提是 IDE 已经在 Tools → Options → Deployment → Connection Profile Manager 里配好了指向那台 Mac 的连接,Mac 上的 PAServer 在跑,SDK 也已经在 SDK Manager 里导入过。下拉框还是空的话,先回去 Test Connection 一下,八成是连接没通。

第四步:编译出 IPA

目标平台切到 iOS Device 64-bit,Build Configuration 选 Release,然后 Project → Deployment 或者直接 Build。IDE 会把产物同步到 Mac,由那边完成链接和签名,产出 .ipa。

有一点要留意:不同 Delphi 版本对 Xcode 版本和 iOS SDK 版本有明确的兼容矩阵,SDK 太新或太旧都可能在链接阶段挂掉。我升级 Xcode 之后就撞过一次,回退到支持范围内的版本才好。以你那个 Delphi 版本的官方发行说明为准。

图标和启动画面也记得在 Project Options 里按 iOS 各档尺寸配齐,缺了的话上传阶段会被打回。

第五步:把 IPA 传上去

IPA 到手之后这一步不需要 Mac 参与。我一般先在开心上架的「文件&提交」页面把包打开看一眼签名信息,确认了再点「提交 App Store」,日志实时滚。

命令行版本在 Windows 上直接跑:

appuploader-cli upload -f MyApp.ipa -u dev@example.com -p abcd-efgh-ijkl-mnop

-p 是 Apple 生成的 App 专用密码(xxxx-xxxx-xxxx-xxxx),不是 Apple ID 登录密码。团队用 API 密钥更合适:

appuploader-cli upload -f MyApp.ipa --api-key <KeyID> --api-issuer <IssuerID> --private-key Auth_Key.p8

密钥方式只收 .ipa,且 App 要先在 App Store Connect 里建好。

第六步:发内测包

「设备」页面点「注册设备」,二维码发出去让人扫上报 UDID(一年 100 台,免费账号 3 台)。回描述文件那边点「重建」,生成一份包含这些设备的 Ad Hoc 描述文件,拷到 PAServer 那台 Mac 上。

IDE 的 Provisioning 里 Ad Hoc 那栏换成新描述文件,重新构建,然后在「文件&提交」页面生成二维码让人扫码装。

写在最后

Delphi 这条线,那台 Mac 理想状态就是个开着 PAServer 的黑盒。真正需要人操作的证书维护、描述文件重建、包上传,全都能在 Windows 的 IDE 旁边顺手做完。

我用的是开心上架网页版,打开就能用。如果你也卡在 Provisioning 下拉框是空的这一步,按上面的顺序走一遍试试