前言
最近客服跟我反馈说,有一个用户打开老项目的iOS App闪退,我回顾了下这项目上次发布改了啥,发现就改了一些文本和链接,这就很奇怪。到后台查了下这个用户的设备信息和应用版本,用的是手机型号是iPhone X,系统版本是iOS 11.2,以及最新版的应用。
很长时间都忙着Flutter开发,这个项目确实没什么大改动的,最近最大的变化就是升级了Xcode 14,用关键词"Xcode 14 闪退"搜索,果然不是只有我遇到了这个问题。Xcode 14打出来的包在低版本系统运行时会崩溃,报错信息是Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib
,在苹果开发者论坛搜索报错信息,可以看到会闪退的最高版本是iOS 12.1。
苹果员工回复截图:
那么这篇文章要讨论的问题来了,上述报错的解决方案网上一搜一大堆,但是手头却没有这么低系统版本的真机或模拟器来测试。真机刷低版本系统是不可行的,苹果早就关闭了这么低版本的刷机验证,模拟器目前Xcode 14能下载的最低版本是iOS 12.4,真是巧妇难为无米之炊。不得不说,果子的做法我是举双手赞成的,是个开发者都不想兼容那么多老版本,对吧?但是买了手机后从不升级系统的大有人在,就问你能怎么办?
2022/12/10更新:Xcode 14.1版本已经修复了这个崩溃问题(Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib
),自测通过Xcode 14.1打包的应用在iOS 12.0上正常运行不崩溃。如果你正准备处理这个问题则可以通过升级Xcode版本解决,对于已经处理过的可以移除之前的处理方法。具体请看苹果开发者论坛或苹果员工新回复截图。
苹果员工新回复截图:
开发环境
- macOS: 12.6
- Xcode: 14.0.1
问题描述
Xcode 14无法安装低版本iOS模拟器,目前只支持iOS 12.4及以上。
问题分析
选一个Xcode 14目前能下的模拟器安装,你就会发现下载安装后的模拟器是放在这个路径的/Library/Developer/CoreSimulator/Profiles/Runtimes
,是.simruntime
后缀的文件。那么我们找到低版本的模拟器文件放在这文件夹是不是就能实现安装低版本iOS模拟器了?
现在首先要找到iOS 11或iOS 12甚至更老的iOS 10的模拟器文件,我网上找了找并没有发现好的下载源(当然可能是我偷懒了没细找),这东西就连苹果开发者官方下载(需要登录)都是不提供的。那看来得换种方式下载,我们都知道(假装你也知道)Xcode升级后会逐渐移除老版本的模拟器,那我们装一个老版本的Xcode不就可以通过正常途径下载低版本的模拟器文件。
Xcode版本和iOS版本名称大概差2,所以如果想要下载iOS 11.2模拟器,那大概要装一个Xcode 9.4.1。至于为什么不是9.0,那是因为我试过,9.0版本能下载的最高版本是iOS 10.3.1,9.4.1版本能下载的最高版本是iOS 11.3,还得是实践出真知。Xcode历史版本苹果官方提供下载,速度还是可以的,直接从苹果开发者官方下载(需要登录)搜索下载一个Xcode 9.4.1就好了,不过下载完成的xip文件解压后安装会提示不兼容:
这可麻烦了,总不能去装个低版本的macOS吧。还好我家底殷实(并没有),翻箱倒柜找到了一个六七年前买的mac mini,还好还没二手出掉,装的还是macOS 10.13.6,这不巧了嘛,隔空投送安装包过去安装,完美运行!Xcode 9.4.1能装下面这些版本的iOS模拟器:
先下载安装一个iOS 11.2模拟器,安装完成后找到/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 11.2.simruntime
文件隔空投送到开发用的电脑上,同时放到相同的位置。打开Xcode可以看到iOS 11.2确实出现了,但是创建模拟器的时候却无法选择,这是怎么回事呢?
原来苹果还留了一手,在其他地方限制了版本,具体详情请看这篇文章在Xcode 12執行低版本的iOS模擬器。按这篇文章写的方法,修改Info.plist
文件中的CFBundleIdentifier
属性值(建议复制一份修改后再复制回去),重新打开Xcode后,已经能正常创建iOS 11.2的模拟器啦🎉!
可是问题到这真的解决了吗?实测iOS 11.2的模拟器创建以后能正常跑起来,但是进到系统以后界面是卡死的,无法进行任何操作,更谈不上调试应用了。这应该又是受到限制了,既然iOS 11.2不行,那继续尝试iOS 11.4,结果还是不行,看来只能下载安装Xcode 10.1试试iOS 12版本的模拟器。Xcode 10.1版本能下载的最高版本是iOS 12.0,如果iOS 12.0还不行,Xcode版本再升就要升级macOS了😣。
最终实测iOS 12.0模拟器能正常运行和调试,由此推测iOS 12.0后续的小版本应该也是支持的。
2023/01/07更新:注意,Xcode 14目前最低只能正常安装使用iOS 12.0版本的模拟器,iOS 11相关版本的模拟器虽然能安装但是无法正常使用。
解决方案
1. 模拟器文件
目前已上传的模拟器文件:
最后更新日期:2024/10/29
- iOS 10.3
- iOS 11.4
- iOS 12.0 / iOS 12.4
- iOS 13.0 / iOS 13.4 / iOS 13.5 / iOS 13.6 / iOS 13.7
- iOS 14.0 / iOS 14.5
- iOS 15.0 / iOS 15.5
- iOS 16.0 / iOS 16.4
- iOS 17.0 / iOS 17.2 / iOS 17.4 / iOS 17.5
- iOS 18.0 / iOS 18.1
2023/10/12更新:从Xcode 15开始不再自带iOS模拟器,需要手动安装。不过,iOS模拟器经常下载失败,还没有断点续传,每次失败都要重新开始,为了方便大家,新增iOS 17.0模拟器文件下载。当然,你也可以通过官方网站下载,需要登录的同时下载也还算稳定。从官方网站下载的是.dmg
文件,可以通过执行命令安装或手动打开文件将里面的xxx.simruntime
文件复制到/Library/Developer/CoreSimulator/Profiles/Runtimes/
目录下。
2024/01/18更新:iOS 17.0模拟器文件已替换为iOS 17.0.1,同时新增iOS 17.2模拟器文件下载。
2024/03/12更新:新增iOS 17.4模拟器文件下载。
2024/05/15更新:新增iOS 17.5模拟器文件下载。
2024/09/17更新:新增iOS 18.0模拟器文件下载。
2024/10/29更新:新增iOS 18.1模拟器文件下载。
如果某个版本有补丁版本,那上传的模拟器文件是这个版本的最后一个补丁版本。例如iOS 14.0模拟器文件实际是iOS 14.0.1版本,这不是我特意改的名称,而是原版文件名称就是如此。在Xcode可供下载的模拟器列表中显示的是iOS 14.0.1版本,实际下载下来的文件名称是iOS 14,像这种有补丁版本的,能下载的都是最后一个补丁版本。
注意:为了绕开Xcode限制,iOS 10.3/11.4/12.0这三个版本的模拟器文件已经修改了Info.plist
文件中的CFBundleIdentifier
属性值,在原有值的后面加上了"-1",无需再修改。其他后面更新的都是原版未修改文件,如果随着Xcode的升级不再支持这些版本,请手动修改Info.plist
文件中的CFBundleIdentifier
属性值,从而绕过Xcode限制。
2. 分享链接
如果有其他版本需要或分享链接失效,欢迎留言告诉我。
3. 使用方法
下载后的文件解压后复制到/Library/Developer/CoreSimulator/Profiles/Runtimes/
目录下。
注意:下载解压后建议先使用xattr -d com.apple.quarantine 模拟器文件路径
命令删除文件扩展属性com.apple.quarantine
,这能有效避免出现以下所列的第二个问题。
使用过程中可能会遇到以下问题(使用前必看):
- 不存在
Profiles
目录及Runtimes
子目录
这是因为你没有用Xcode下载安装过其他版本的模拟器,解决方法很简单,手动创建Profiles
目录及Runtimes
子目录即可。
- 出现弹框提示[无法打开“iOS xx.x.simruntime”,因为无法验证开发者]或[“iOS xx.x.simruntime”已损坏,无法打开]
在[系统偏好设置] -> [安全性与隐私]出现提示[已阻止使用“iOS xx.x.simruntime”,因为来自身份不明的开发者]。从macOS 13开始,[系统偏好设置] 改为了[系统设置],[安全性与隐私]改为了[隐私与安全性]。
这时候点这个[仍要打开]是没有用的,要执行命令允许安装任何来源软件(需要输入密码):
sudo spctl --master-disable
为了安全起见,建议模拟器安装成功不弹框后,将允许[任何来源]改回[App Store"或"App Store和被认可的开发者]。
除了上面的方法,个人更推荐先尝试使用xattr -d com.apple.quarantine 模拟器文件路径
命令删除文件扩展属性com.apple.quarantine
,这个能有效避免安装受到限制。
查询文件扩展属性的命令是xattr 文件路径
,删除文件全部扩展属性的命令是xattr -c 文件路径
。
- 出现弹框一直提示[正在验证“iOS xx.x.simruntime”]无法关闭
这个问题不用在意,电脑重启后会消失,就算是Xcode 14支持的模拟器版本我也遇到过这个问题。
- 创建模拟器设备后运行时找不到
会导致这个问题的原因有两个,请逐一排查解决:
- 最低部署目标(
Minimum Deployments
)版本高于模拟器版本
请降低最低部署目标版本或使用更高的模拟器版本。
- 只支持x86_64架构的模拟器被默认隐藏
如果你用的是M系列芯片的Mac,Xcode可能默认只显示了支持arm架构的模拟器。请按这个步骤[Xcode菜单栏] -> [Product] -> [Destination] -> [Destination Architectures] -> [Show Both]操作,显示全部iOS模拟器。
如果你的Xcode版本已经升至Xcode 15,遇到问题请先看这篇文章iOS问题记录 - Xcode 15安装低版本iOS模拟器(持续更新)。欢迎留言告诉我你遇到的问题,我会不断完善这篇文章,让更多人受益。
总结
为了解决这个问题,我下载了Xcode 9/9.4.1/10.1/12.5.1多个版本,一开始想着Xcode 12.5.1应该还可以下载iOS 11的模拟器,结果因为macOS系统的原因已经无法安装Xcode 12.5.1了。既然都已经装上Xcode 14,我猜你的系统版本应该也不低,不然也不会遇到这个问题。
最后
如果这篇文章对你有所帮助,点赞👍收藏🌟支持一下吧,谢谢~
本篇文章由@crasowas发布于CSDN。