Apple Silicon mac上创建 Mac虚拟机用于调试、测试等
创建虚拟机
虽然可以使用swift代码直接创建,但是建议直接使用第三方app实现。 这里使用免费开源的应用 UTM (github上下载是免费的,app store上下载是收费的。) 说明:UTM默认是创建的vm在 sandbox里面的,可以后面再移动位置。 创建Mac VM需要 ipsw ,在这里下载即可: https://ipsw.me/Macmini9,1 (已经存档了下好的macOS12的Universal ipsw)
感受:virtualization framework方式的Mac虚拟机虽然可定制化不高,但是非常流畅靠谱。
特别要注意的是: Apple Virtual Mac目前是不支持Apple Id登录的,至少我的情况是这样的,所有与之有关的功能都不能正常使用,比如 iCloud,App Store , TestFlight等等。
解决app签名问题
光有虚拟机是不行了,把在host上编译的app 拷贝到虚拟机上会报签名错误:(控制台里面可以看到)
Provisioning Profile Validation: profile '...' is not provisioned for this device (<private>)
按下面两个步骤解决签名问题。
注册设备
https://developer.apple.com/account/resources/devices/add
注册界面的device name随便你起,比如: VirtualMac_macOS12_UTM ,后面可以修改。 UDID填写 system report里面的 Provisioning UDID,一定不要搞错了。
Model Name: Apple Virtual Machine 1
Model Identifier: VirtualMac2,1
Chip: Apple M2 Pro (Virtual)
Total Number of Cores: 4
Memory: 4 GB
System Firmware Version: 7459.141.1
OS Loader Version: 7459.141.1
Serial Number (system): ...
Hardware UUID: ...
Provisioning UDID: ...
Activation Lock Status: Disabled
Update ProvisioningProfile
注册设备之后,需要更新Provisioning Profile后,把重新编译的应用copy到目标设备上运行时才会通过签名校验。
点击 Xcode Managed Profile旁边的 info icon,弹出窗口的里面文件图标拖到 Terminal 里面可以看到路径,直接删除该文件Xcode就会自动更新Profile。
其他:
如何拷贝文件到 VirtualMac? VirtualMac开启 FileSharing(就是smb)就行。 文件共享方式需要vm是macOS13。
如何测试x86_64应用? 使用rosetta 就行了:
$ arch -arch x86_64 ...
xcode也可以直接编译运行到rosetta目标。
编译出来的x86_64 app直接拷贝到 Virtual mac上以rosetta运行。