做 iOS 开发的都知道,Xcode 是苹果官方的 IDE,只跑在 macOS 上。如果你想往 App Store 提交一个版本,过去几乎没有选择——要么买一台 Mac,要么在黑苹果或远程 Mac 方案里折腾。

但现实情况是,很多团队或个人开发者不具备随时用 Mac 的条件。团队可能只有一两台 Mac 用于签名打包,其他人用 Windows 开发;或者你用 Flutter、uni-app 这类跨平台框架,整个构建流程已在 CI 上完成,唯独上传 IPA 这一步还被 Mac 环境卡着。

这个环节能不能绕过去?结合几种工具组合是可以做到的。

传统方案的局限性

先看过去常见的几种做法。

黑苹果是在 PC 上装 macOS,可以获得完整的 Xcode 体验。但驱动兼容性需要花时间折腾,系统版本不敢随意升级,硬件变更后重装成本很高。如果只是为了偶尔上个版本更新,专门维护一台黑苹果性价比太低了。

租用远程 Mac——MacInCloud、MacStadium 这类服务——按时付费,远程桌面操作。实际体验中网络延迟会影响操作效率,长期租用的成本不低,月费很快能赶上一台二手 Mac mini。

虚拟机方案的问题更直接:苹果的 EULA 禁止 macOS 在非苹果硬件上运行。即便不考虑合规性,VMware 下的 macOS 性能也勉强,编译和签名容易出现不明原因的报错。

解耦构建和上传

梳理一下 App Store 提交流程:代码开发、Archive 打包、签名、上传 IPA、填写元数据、提交审核。其中真正依赖 macOS 的环节是签名和上传,因为 codesign 和 Application Loader 绑死在苹果生态内。

如果把签名和上传从 Xcode 中解耦出来,问题就简单了。一个可行的组合是:在 Windows 上完成代码构建,然后用跨平台工具完成证书申请和 IPA 上传。

iOS 的开发证书和发布证书可以在 Windows 上生成。Appuploader 的证书管理模块提供了创建功能,输入证书名称、邮箱和密码就能直接生成 .p12 证书文件,不需要钥匙串访问。描述文件也可以在同一个界面里创建,关联 App ID 和证书后自动生成 .mobileprovision 文件。

操作流程

以 Windows 环境为例过一遍实操步骤。

第一步,准备证书。打开 Appuploader 进入证书管理,创建类型选 iOS Distribution,填一个标识名称和你的 Apple ID 邮箱。工具会调用苹果开发者后台 API 生成证书。下载 .p12 文件保存好。

第二步,创建描述文件。在描述文件管理里点创建,关联 App ID 和之前生成的证书,系统会生成 .mobileprovision 文件。

第三步,签名。Flutter 项目在 Windows 上跑 flutter build ipa --release 会生成未签名的 IPA。用签名工具导入证书和描述文件完成签名。

第四步,上传。在 Appuploader 的 IPA 上传模块选择签名后的文件,填入 Apple ID 专用密码(需要在 appleid.apple.com 上生成),点击上传。上传进度实时显示,完成后 App Store Connect 里就能看到构建版本。

第五步,可以批量上传截图和元数据。App Store 的截图和本地化描述是上架准备里最耗时的环节之一。Appuploader 支持多语言版本的截图和描述一次性提交,内购项目也能一起管理。

CI/CD 集成

如果项目已经在用 GitHub Actions 或 Jenkins 做自动化构建,还能把这套流程集成进去。Appuploader 提供命令行工具 appuploader_cli,在 CI 脚本里传参指定账号、密码和 IPA 文件路径就能完成上传。

一个典型的 GitHub Actions 流程:Windows runner 上执行 flutter build ipa,然后用 appuploader_cli 推送 IPA。Fastlane 的 pilot 命令可以配合做 TestFlight 分发,Transporter(苹果官方的跨平台上传工具)也能实现类似上传功能。不过 Transporter 只处理上传,不管证书管理和描述文件创建。工具选型不需要非此即彼:Fastlane 做版本号递增和 TestFlight 分发,Appuploader 做证书管理和 IPA 上传,两者各管一摊。

需要说明的是,这套方案的目标不是替代 Mac 在 iOS 开发中的地位。完整的 Xcode 工程调试和 Instruments 性能分析仍然建议在 macOS 上做。但如果你的主要场景是持续交付版本更新,或者团队里不是每个人都有 Mac,那么把 macOS 从上传环节中解耦出去,确实能减少对 Mac 硬件的依赖。