Unity 游戏在 Windows 上打 iOS 包并真机测试
Unity 在 Windows 上能导出 iOS 的 Xcode 工程,但编译、装机和出包通常要换到 Mac 上做。这篇讲怎么在同一台 Windows 电脑上接着把导出的工程编译成 App、装到 iPhone 上测试,最后打出 ipa。你需要 Apple 开发者账号、一台 iPhone 和数据线,并且已经安装 KXBuild。
切换到 iOS 平台
在 Unity 中打开项目,菜单「File → Build Profiles」(Unity 2022 及更早版本是「File → Build Settings」),左侧选 iOS,点「Switch Platform」。第一次切换要重新导入资源,项目大的话需要一些时间。
「Build And Run」要调用本机的 Xcode,在 Windows 上用不了,这篇只用「Build」。
设置 Player Settings
在 Build Profiles 窗口点「Player Settings」,或菜单「Edit → Project Settings → Player」,切到 iOS 页签。下面这些项和装机、上架直接相关。Unity 6 中要先勾选 Override Default Bundle Identifier 才能修改 Bundle Identifier。
| 位置 | 设置项 | 建议值 |
|---|---|---|
| Other Settings → Identification | Bundle Identifier | 和开发者后台注册的 App ID 一致,例如 com.example.mygame |
| Other Settings → Identification | Version | 商店显示的版本号,例如 1.0.0 |
| Other Settings → Identification | Build | 构建号,每次上传 App Store Connect 都要比上一次大 |
| Other Settings → Identification | Signing Team ID | 开发者账号的 Team ID |
| Other Settings → Configuration | Scripting Backend | IL2CPP,iOS 只支持这一种 |
| Other Settings → Configuration | Architecture | ARM64 |
| Other Settings → Configuration | Target SDK | Device SDK,选 Simulator SDK 导出的工程装不到真机上 |
| Other Settings → Configuration | Target minimum iOS Version | 按要支持的最低系统填写,保持默认也可以 |
| Other Settings → Configuration | Camera Usage Description | 用到摄像头时必填 |
| Other Settings → Configuration | Microphone Usage Description | 用到麦克风时必填 |
| Other Settings → Configuration | Location Usage Description | 用到定位时必填 |
权限说明会写进导出工程的 Info.plist。用到了相机、麦克风或定位却没填说明,App 调用时会直接闪退,审核也会被拒。
签名用的 .p12 证书和 .mobileprovision 描述文件放进证书目录,开发阶段用 Apple Development 证书和包含这部 iPhone UDID 的 Development 描述文件,获取和放置方法见证书与签名。
导出 Xcode 工程
在 Build Profiles 窗口点「Build」,选一个空目录,例如 D:\u\mygame。导出目录要用短路径,Unity 导出的工程文件层级很深,放得太深在 Windows 上容易遇到路径过长的错误。
测试阶段可以勾选「Development Build」,出错时日志更完整,也能连 Unity Profiler。正式出包前记得取消。
导出完成后,目录里有 Unity-iPhone.xcodeproj。项目用了 Firebase、Google Mobile Ads 这类带 iOS 依赖的插件时,目录里还会有 Podfile,在导出目录执行一次 pod install,之后会生成 Unity-iPhone.xcworkspace。
1cd D:\u\mygame
2pod install
CocoaPods 的更多用法见 CocoaPods。
在 VS Code 中打开并体检
在 VS Code 中「文件 → 打开文件夹」打开导出目录 D:\u\mygame,KXBuild 视图会列出其中的工程和 target。应用 target 叫 Unity-iPhone,另一个 UnityFramework 是它依赖的框架,构建时会一起编译。
第一次打开先体检,它会检查编译需要的环境并修好缺的部分。以下两种做法任选其一。
- VS Code 插件。在 KXBuild 视图标题栏「···」中运行「体检并修复开发环境」。
- 命令行。在导出目录执行下面的命令。
1kxbuild doctor .\Unity-iPhone.xcodeproj
装到 iPhone 上测试
用数据线连上 iPhone,解锁后点「信任此电脑」,并在「设置 → 隐私与安全性 → 开发者模式」中打开开发者模式,手机会重启一次。驱动和手机设置见设备准备。
在 KXBuild 视图中选中这台 iPhone,按 F5。KXBuild 会依次构建、签名、安装、启动游戏并附加调试器。第一次编译 IL2CPP 生成的 C++ 代码会比较久,之后是增量编译。第一次调试某个 iOS 版本时还会自动下载对应的符号库,有几个 GB,只需一次。
游戏运行后,Debug.Log 等输出显示在 VS Code「输出」面板的 KXBuild Console 通道,构建日志在 KXBuild 通道。输出面板用 Ctrl+Shift+U 打开,右上角下拉框切换。
两种代码各用各的调试器。
- 原生代码(导出目录里的 Objective-C 插件代码)在 VS Code 中下断点,用法见运行与调试。
- C# 脚本用 Unity 自己的调试器,在 Unity 中照常编写,改完重新导出。
只想重新装一次、不重新编译时,用 KXBuild 视图标题栏的「运行」,它会直接安装上一次的构建产物并启动。
改完 C# 后重新导出
改了 C# 脚本、场景或资源,都要在 Unity 中重新 Build 到同一个目录。目录已存在时 Unity 会问 Append 还是 Replace。
| 选择 | 适合的情况 |
|---|---|
| Append | 日常迭代。更新 Unity 生成的内容,保留你在导出工程里做的修改 |
| Replace | 升级了 Unity 版本,或者导出工程出现无法解释的编译错误时。整个目录重新生成,手动修改会丢失 |
选了 Replace 之后,有 Podfile 的要重新执行 pod install,再运行一次体检。导出后回到 VS Code 按 F5,KXBuild 会重新编译变动的部分。
需要长期保留的原生改动,例如额外的 Info.plist 键或构建设置,建议用 Unity 的 PostProcessBuild 脚本在导出时写入,这样 Replace 也不会丢。临时改动可以直接用属性列表编辑器和工程设置编辑器修改导出工程。
看性能
真机上的帧率、CPU 和内存用 kxdevice 采样,数据才接近玩家手里的情况,测之前先装 Release 包。
1kxbuild build .\Unity-iPhone.xcodeproj -c Release -t Unity-iPhone --install
2kxdevice instruments sysmon -i 1
sysmon 持续输出 CPU 占用。掉帧、内存增长、热点函数分别用 fluidity、allocations、stackshot 排查,对照表和用法见性能分析。Unity 自带的 Profiler 适合看脚本和渲染层面的耗时,两者可以配合使用。
打出 Release ipa
上架前确认 Player Settings 里的 Build 比上一次上传的大,证书目录里有 Apple Distribution 证书和 App Store 类型的描述文件。改过 Player Settings 就重新导出一次。
以下两种做法任选其一。
- VS Code 插件。在 KXBuild 视图的「构建配置」节点切到 Release,命令面板运行
KXBuild: 构建。 - 命令行。target 固定为 Unity-iPhone,按导出目录的情况执行其中一条。
没有 Podfile 的导出目录执行下面这条。
1kxbuild build .\Unity-iPhone.xcodeproj -c Release -t Unity-iPhone
有 Podfile、已经执行过 pod install 的导出目录执行下面这条。
1kxbuild build .\Unity-iPhone.xcworkspace -c Release -t Unity-iPhone
工程的 Release 配置没有指定发布证书时,命令行加 -D CODE_SIGN_IDENTITY="Apple Distribution" 临时覆盖。
构建完成后导出目录的 build 文件夹下会生成 .ipa。在 Windows 上用 Appuploader 上传到 App Store Connect,处理完成后出现在 TestFlight 页,先发给测试员验证再提交审核,详见发布与上架。
常见问题
报 scheme 或 target not found。 Unity 导出工程的应用 target 叫 Unity-iPhone,命令行要写 -t Unity-iPhone。
报文件名过长或找不到文件。 把导出目录换到 D:\u\mygame 这类短路径,重新 Build。
编译报找不到 Firebase 等依赖。 在导出目录执行 pod install,并构建 Unity-iPhone.xcworkspace。
装上后一启动就退出。 先检查权限说明有没有填,再看设备日志和崩溃报告,方法见运行与调试和排错与 FAQ。