1. 先说清楚:GameMaker 的 iOS 导出为什么绕不开一台 Mac
我猜点进这篇东西的人,大概率是"手上只有 Windows 笔记本,又想在 GameMaker 里做 iOS 游戏"的独立开发者。你已经在 GameMaker 里把玩法跑通了,Demo 玩起来也挺顺,结果到了导出环节,点开 Build 下面的 iOS 选项,发现 GameMaker 直接弹提示——要连接一台 Mac。这时候你才意识到,事情没那么简单。
先说结论:GameMaker 2018 之后的版本,iOS 导出是支持远程构建的。什么意思?就是你的 Windows 机器负责写代码、做资源、调逻辑,最后一步交给一台 Mac 来执行编译、签名和生成 .ipa 文件。这个远程构建并不是把整个项目发过去让你在 Mac 上开发,而是 GameMaker 的 IDE 会把工程文件、资源、脚本一并传输到 Mac 上安装的 GameMaker 编译器里,由它调用 Xcode 的命令行工具完成最终的 iOS 产物构建。
为什么必须这么做?苹果有明确约束——iOS 应用只能由 Xcode 工具链编译生成,而 Xcode 只跑在 macOS 上。这不是 GameMaker 不想直接生成 .ipa,是苹果从签名到编译链路的整体策略决定了这一步躲不开。理解了这一点,你就知道整个上线流程的主线其实是两条:先用"Windows + Mac 远程构建"把 .ipa 弄出来,再用 Apple 的账号体系把 .ipa 送进 App Store Connect。
这里还要顺带说清楚一个非常常见的误解:很多人以为只要装个跨平台打包工具,就能在 Windows 上一键产出 iOS 包。实际上无论你用 GameMaker、Unity 还是 Flutter,iOS 的最终编译和签名都必须有 macOS 参与,区别只是"Mac 在你的项目里承担多少工作"。GameMaker 的做法已经算省心的了——你在 Windows 上看到的所有报错、所有调试信息,都是 Mac 那边实时回传过来的,体验上基本接近本机开发。
所以,如果你手头真的没有任何 Mac 设备,可以找一台老款 Mac mini 放在局域网里,或者用云 Mac 服务,总之必须有这么一台机器作为"编译机"。我见过有开发者试图用虚拟机折腾 macOS,稳定性很差,而且后续 Xcode 升级、证书同步都会有连锁问题,我的建议是没必要省这个钱——后面会讲为什么。
2. 筹备阶段最容易漏掉的三件事:账号、证书、环境对齐
2.1 Apple Developer 账号与 GameMaker 的 iOS 模块
打包 iOS 游戏,先得有 Apple Developer Program 的付费账号(个人版 99 美元/年,公司版 299 美元/年)。注册时需要准备真实的身份信息,公司账号还要邓白氏编码,这个周期比较长,建议提前处理。个人账号就简单多了,基本上当天申请当天能开通。
GameMaker 这边,你需要确认自己的 GameMaker 版本包含 iOS 导出模块。早期的 GameMaker Studio 2 是单独购买 iOS 模块,现在订阅制的 GameMaker(比如 Professional 及以上档位)会包含所有平台导出。你在 Dashboard 里看一眼许可证状态,如果 iOS 模块是灰的,说明当前订阅没覆盖,导出时会有明确的权限提示。我不建议在许可没到位就开始配置环境,因为第一次远程构建的报错本来就多,再把许可问题掺进来,排查时会很痛苦。
2.2 证书类型和描述文件,提前搞懂能少走很多弯路
iOS 签名相关的概念,很多做 Windows 游戏的开发者第一次接触会觉得绕。我在实际操作中觉得,记住三条主线就够了:证书验证"你是谁",描述文件验证"你被允许在哪些设备上跑",Bundle ID 验证"你要装的是哪个应用"。
开发阶段你需要的是 Apple Development 证书加 Development 描述文件,测试真机时要用;上架阶段你需要的是 Apple Distribution 证书加 App Store 描述文件。这两套签名不能混用,你拿开发证书打包出来的 .ipa 是装不进 TestFlight 的,拿发布证书打包的东西也没法直接往真机装,各自有明确分工。
证书和描述文件在 Apple Developer 后台可以创建。创建证书时需要上传一个 .csr 文件,这个文件可以在 Mac 上用"钥匙串访问"生成,也可以在一些在线工具上生成。我个人建议老老实实在 Mac 上生成,因为后续证书安装、私钥保存都在同一台机器上,省去在 Windows 和 Mac 之间倒腾私钥的风险——私钥这东西泄露出去的后果可比你想的严重。
2.3 Windows 和 Mac 两端版本对齐,是最容易被忽视却最常踩的坑
GameMaker 有个特性:Windows 端 IDE 和 Mac 端编译器的版本必须保持对应。如果 Windows 上装的是 GameMaker 2024.8,Mac 上也必须是 GameMaker 2024.8,版本不一致会导致远程构建时协议不匹配,报错信息还特别模糊——我遇到过一次,GameMaker 直接提示 "The Mac build could not be completed",排查了半天,最后发现是 Mac 端版本太老。
建议在你开始配置之前,先在两台机器上登录同一个 GameMaker 账号,手动检查版本号。GameMaker 不同大版本之间的远程构建协议差异挺大的,比如 2023 系列和 2024 系列在连接参数、输出日志格式上都不一样,跨版本连接的成功率很低。另外,Mac 端的 macOS 版本也别太旧,至少能装得下最近的 Xcode;Xcode 太旧会导致 GameMaker 调用 xcodebuild 时出现兼容性问题。
还有一个需要注意的小点:Mac 上要装 Xcode 的命令行工具,也就是 Command Line Tools。很多人装完 Xcode 就以为万事大吉,但 GameMaker 的 iOS 编译器在构建时可能会用到一些命令行工具路径。你可以用终端跑一下xcode-select -p确认路径是否正确指向 Xcode,如果输出不对,跑一下sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer就能改过来。
3. Windows 连 Mac 远程构建:第一次打通的全过程记录
3.1 在 Mac 端启动 GameMaker 编译器
远程构建的流程是:Windows 端打开 GameMaker,进入 File -> Preferences -> Platform Settings,找到 iOS 的 Target 设置;Mac 端需要保持 GameMaker 处于运行状态,并且允许接收远程构建请求。
Mac 端要做的事其实就一件:确认 GameMaker 的 iOS 编译器已经被正确安装。你可以在 Mac 上打开 GameMaker,新建或打开任意一个项目,如果工具栏里的 Target 下拉框出现了 iOS 选项,说明编译器没问题。有些版本的 GameMaker 需要你手动在 Mac 端跑到 Build -> Run 来触发一次本机编译,这样它会把必要的工具链缓存下来,之后 Windows 远程请求过来时就能更顺畅。这件事不是官方文档里强制要求的,但实测下来,如果 Mac 端从没编译过任何项目,第一次远程构建经常会卡在"Preparing Mac"阶段很久。
3.2 远程构建的连接配置与关键参数
Windows 端在 iOS Target 的设置界面里需要填几个东西:Mac 的 IP 地址、登录用户名和密码。GameMaker 默认走 SSH 协议连接 Mac,所以 Mac 端需要开启"远程登录"(在系统设置 -> 共享 -> 远程登录里打开),允许指定用户访问,这样 GameMaker 才有权限把工程文件传过去。
有一点非常关键:GameMaker 在远程构建时,会把 Windows 上的项目文件打包传到 Mac 的临时目录里编译。这个传输过程在你项目资源多起来之后会变得很慢,我做一个包含大量音频和精灵图的中型项目,单次传输可能要 5-10 分钟。如果你发现构建速度越来越慢,优先检查局域网网速和 Mac 的磁盘剩余空间,Mac 剩余空间太小时,构建产物很容易中途写盘失败。
关于登录方式,GameMaker 支持账号密码登录和密钥登录。长期用的话,我建议你在 Mac 上生成 SSH 密钥,把公钥配置到授权文件里,Windows 端填入私钥路径,这样可以省掉每次构建都要输密码的麻烦。GameMaker 界面里其实有专门的字段让你填私钥,位置在 Preferences -> Platform Settings -> iOS -> Mac 地址的配置框旁边。密钥方式我用了半年,稳定性和便利性都远胜密码方式。
3.3 第一次构建会遇到的一个"假死"现象
第一次点 Build -> Run 或者 Build -> Package时,GameMaker 的 Build 面板会长时间停在某个阶段不动,看起来像卡死了一样。我第一次等的时候盯了十分钟,差点直接关掉窗口。实际上这是远程构建的正常过程:Windows 上传工程到 Mac,Mac 解压并启动编译器,然后开始调用 Xcode 的编译链。整个过程中 Build 面板刷新频率很低,如果你在 Mac 端能看到 GameMaker 的日志在滚动,就说明流程是通着的。
一个更稳妥的办法:在 Mac 端也把 GameMaker 的日志窗口打开,这样两边能对照着看进度。如果你发现 Mac 端日志已经报错而 Windows 端还在傻等,那就赶紧去 Mac 端看具体错误——这是远程构建排查问题时的基本原则:以 Mac 端的日志为准。
4. 签名环节最容易翻车的几个点,我一个个排过雷
4.1 Bundle ID 的一致性是个隐藏大坑
GameMaker 的 iOS 项目里有一个设置叫 Bundle ID,在 Project Settings -> iOS 里。这个值必须和你在 Apple Developer 后台创建的 App ID 完全一致,一个字符都不能差。常见格式是类似com.yourcompany.yourgame的倒域名结构。
最坑的地方在于:GameMaker 的 iOS 设置里还有另一个字段叫"Display Name"或"App Name",很多人会在这里写上中文字段或带空格的名字,然后打包出来,传到 App Store Connect 里却提示名称不合规,或者图标和名称对不上。实际上 App Store 上显示的名称是在 App Store Connect 里配置的,和包内的 Display Name 是两套体系,但如果你 Bundle ID 对不上后台的 App ID,TestFlight 根本就不会接受你的构建版本。这个错误在传输阶段就能发现,因为 App Store Connect 会直接拒绝,提示 Invalid Bundle ID。
4.2 描述文件过期问题比证书过期更隐蔽
证书有过期时间,描述文件也有,但描述文件的过期通常不会像证书那样在 GameMaker 里给你明确的警告。你可能会遇到这种情况:GameMaker 构建正常完成,Xcode 也能打开工程,但真机安装时提示描述文件无效。
我当时的处理办法是:每次准备发布版本之前,先去 Apple Developer 后台确认一下描述文件的状态,如果状态不是 Active 就重新生成,然后下载安装到 Mac 的钥匙串里。GameMaker 在远程构建时会从 Mac 的钥匙串读取证书和描述文件,所以 Windows 端反而不需要安装任何证书——这一点也和很多人想象的不一样,证书永远是 Mac 端的事。
4.3 签名身份的选择:GameMaker 自动的还是手动指定
GameMaker 的 iOS 构建设置里有一个 Provisioning Profile 的配置方式,它提供了两种选项:自动管理证书(Automatic)和手动指定描述文件(Manual)。
自动管理模式下,GameMaker 会在构建时自动从 Apple 服务器拉取描述文件,对新手来说最省心。但自动模式偶尔会在背后换掉描述文件导致缓存问题,表现就是同一份代码,上次构建成功这次却失败。手动模式则要求你显式选择描述文件名称,不匹配就直接报错,排查起来更明确。
如果你是刚开始做发布准备,我建议先用自动模式跑通整个流程,等你确认了证书和描述文件的对应关系后,再切换到手动模式锁定配置。这样即使后续重新安装证书,也不会莫名其妙的构建到一半中断。
5. IPA 生成之后:从 GameMaker 到 App Store 的最后一公里
5.1 用 GameMaker 生成 .ipa 的两种方式
GameMaker 的 Build 菜单里有两个选项要区分清楚:一个是 Build(Run),它构建出来的是开发调试用的应用,可以直接装到已注册的真机上调试;另一个是 Package(或 Build Product),它会产出最终的 .ipa 文件。如果你要上架,必须走 Package,因为只有这种模式下 GameMaker 才会用发布证书签名。
也有一种实际操作思路:让 GameMaker 生成一个 Xcode 工程,然后再在 Xcode 里手动 Archive。这个选项在 GameMaker 的构建选项里叫 "Create Xcode project",它会将导出的工程文件打包到一个文件夹里。这样做的好处是你可以在 Xcode 里直接修改一些图标、启动屏、系统权限相关的配置,然后利用 Xcode 的 Archive 功能生成归档。缺点是每次构建都要手工在 Xcode 里走流程,效率低很多。
我个人的建议是:如果 GameMaker 层面能解决的事就在 GameMaker 解决,生成 .ipa 也交给 GameMaker;Xcode 只保留一个用途——上传。
5.2 Transporter 和 Xcode 上传二选一
到这一步,你的 Windows 机器其实已经退居二线了。持有 .ipa 文件后,你需要在 Mac 上把它上传到 App Store Connect。上传工具有两种:
第一种是 Xcode 自带的 Organizer。打开 Xcode -> Window -> Organizer,选择你导出的包,直接点 Upload。这种方式最直观,Apple 官方推荐,上传过程中会做本地校验,很多明显问题(比如图标尺寸不符、Bundle ID 不一致)在本地就能暴露出来。
第二种是 Transporter。这是 Apple 专门为上传 App 做的独立工具,可以单独安装。把 .ipa 拖进 Transporter 窗口就行,它会检查签名、校验 plist 信息,然后传到 App Store Connect。Transporter 更轻量,不依赖 Xcode 的工程状态,我后来基本都用它。
上传之后,App Store Connect 的后台通常会延迟几分钟到十几分钟才出现第一个版本。如果你的构建包在 "构建版本" 列表里迟迟不出现,优先去 Activity 页面看有没有校验错误。这里有个常见的错误码需要记住:ITMS-90034,意思是证书无效或者签名不匹配,绝大多数情况都是因为你在 Package 时选错了证书类型,或者描述文件是开发的。
5.3 上传常见问题速查
我整理了一份个人实测中概率最高的错误码和处理方式,不一定覆盖全部,但对大多数独立开发者来说已经够用了。
| 错误码 | 含义 | 处理方式 |
|---|---|---|
| ITMS-90034 | 证书或签名无效 | 检查发布证书是否在有效期,描述文件是否为 App Store 类型 |
| ITMS-90062 | 版本号重复 | 在 App Store Connect 的 App 版本里设置更高的版本号 |
| ITMS-90046 | 代码签名错误 | 重新生成描述文件,确认 Bundle ID 匹配 |
| ITMS-90101 | 缺少隐私信息 | 完善 App Store Connect - 隐私政策页面 |
| ITMS-90473 | 架构不被支持 | GameMaker 导出时确认选择了支持 arm64,新版本 iOS 已放弃 armv7 |
碰到问题时不要只记错误码本身,更值得看的是错误码后面的英文描述段落,那里面往往直接点明了具体是哪个 plist 字段或哪个文件不对。
6. 上架前必须处理的 App Store 审核细节,别让技术问题拖住上线
6.1 权限提示、隐私政策与合规选项
你的游戏如果用了 GameMaker 内置的广告功能、网络排行榜、云存档或者付费内购,那么在 Info.plist 里就需要显式声明权限用途说明。常见的有网络访问权限(NSAppTransportSecurity),iOS 14 之后新增的本地网络权限说明等。GameMaker 的项目设置里其实有提供这些字段的入口,你直接在 Project Settings -> iOS -> Info 里添加键值对就行。
App Store Connect 后台还有一个隐私问卷和合规选项要填,包括是否使用 IDFA、是否收集用户数据等。如果游戏接入了广告,IDFA 的相关说明一定要如实填写。这个问卷不填或者填错,构建版本可能会被卡在 Processing 状态很长时间,甚至直接被拒。我见过不少开发者因为少了这一环,导致整个审核周期拉长好几天。
隐私政策页面也必须在 App Store Connect 的 App 信息里填上,否则在提审时会强制中断。GameMaker 项目本身不需要包含隐私政策文件,但外链的隐私政策 URL 一定要能正常访问。最简单的方式是直接挂一个 GitHub Pages 页面,把政策文本放上去,不需要花一分钱域名费。
6.2 TestFlight 测试:把 beta 版本送到真机验证
在上架 App Store 之前,先走 TestFlight 内测几乎是必须的。TestFlight 有两种测试方式。内部测试组最多能邀请 100 名成员,不需要过 Beta App Review,适合你自己和团队内部人员做真机测试。外部测试组也支持最多 10000 人,但首次需要提交 Beta App Review,Apple 会人工审核你的测试版本,审核通过后才能把链接发给外部测试者。
从 Windows 开发者的角度来看,TestFlight 最容易踩的坑是:你在 Windows 上改完代码后,构建出来的测试版本在 TestFlight 里显示的 Build Number 一直不变,导致你根本分不清哪一版是新包。这个问题的根源往往不是 GameMaker 的问题,而是项目的版本号设置。GameMaker 的项目设置里有一个 Version Number 字段,你需要确保每次上传前版本号递增,例如从 1.0.0 改成 1.0.1。如果版本号相同,App Store Connect 会把新上传的包当作旧包处理,可能直接拒绝,也可能覆盖显示,总之测试体验都会很混乱。
6.3 审核被退回的常见原因和我的规避经验
审核被拒的常见理由,绕不开这几点:功能描述与实际情况不符、界面出现明显的占位文本、未接入苹果登录却使用了第三方登录、游戏内没有提供账号注销入口。GameMaker 做的小游戏,如果涉及排行榜功能且需要登录,审核时大概率会被问数据的归属权和删除方式。不管成功与否,我的思路是第一时间先在 App Store Connect 后台把账号注销政策、数据删除说明写到醒目位置。
如果你做了内购,那么苹果对内购的审核要求非常多,包括价格展示、支付流程合理性、商品描述一致性。尤其注意:GameMaker 的 iOS 导出包里如果集成了支付系统,必须使用 StoreKit,绕过的唯一后果就是被拒绝,没有任何商量余地。
7. 个人踩坑清单和工作流建议,送给自己和读到这里的人
7.1 你最该记住的六条经验
第一,Mac 端永远保持最新稳定版 Xcode,不要为了迁就旧项目而降级。Xcode 更新后 GameMaker 的构建偶尔会有一两次失败,你不用急着排查,优先重启 GameMaker 的 Mac 编译器进程,多数问题会自动恢复。
第二,证书和描述文件到期前一个月就要规划续期。Apple 的推送会在即将到期前给开发者邮箱发通知,但那个邮件很容易被忽略。我吃了亏之后,把证书续期直接写进了日历提醒。
第三,GameMaker 的版本升级别冲太快,尤其不要在生产项目进行到一半时大版本升级。GameMaker 2024 大版本的 iOS 导出机制和 2023 系列有变化,升级后需要重新校验远程构建链路。我建议在发版之前至少留出一周版本观察期。
第四,每次准备提交审核前,清理掉项目里所有调试输出和演示资源。不止是 GameMaker 项目,很多审核拒绝都源于一个不起眼的调试日志或多余的 Demo 角色在正式构建里出现。
第五,Windows 端不要安装任何代理工具或网络流量改动软件。GameMaker 的远程构建通信很敏感,一旦网络栈有改动,构建会卡在连接阶段或传输阶段,而排查这种网络问题的成本极高。
第六,如果你经常用云 Mac,每次连接前检查云 Mac 的磁盘状况。云服务商默认镜像的磁盘剩余空间并不保证充足,一次大项目构建直接占掉十几 GB 很常见。
7.2 一条稳定可靠的上线工作流
我实践下来的完整工作流大概是这样的。拿到一款可以在 Windows 上流畅运行的游戏版本之后,先在 GameMaker 里把 Bundle ID、版本号、图标、启动屏一次性配置到位。然后启动 Mac 端编译器,执行一次远程构建,用 TestFlight 内部测试账号安装到真机上,走一遍完整的游戏流程,重点看启动闪退、存档读取、网络请求、权限弹窗这四类问题。
确认没有重大问题后,用 GameMaker 的 Package 功能产出正式发布的 .ipa,通过 Transporter 上传,然后去 App Store Connect 检查构建状态。等构建处理完成后,先提交一轮 TestFlight 外部测试,让至少两三个朋友用不同型号的设备试玩,收集崩溃日志,确认无异常后再正式提交审核。
从 Windows 一路走到 App Store,中间的技术链路并不复杂,真正折磨人的是各种环境不一致和状态不对齐的问题。以上这些坑,我自己在肝了三个游戏版本之后才总结完整,分享出来,希望你能少走一些弯路,早点让自己做出来的游戏在 App Store 上被玩家看到。