M1 Mac上iOS 14模拟器VNDetectFaceLandmarksRequest失效报未指定错误
M1 Mac原生iOS 14.3模拟器调用Vision框架报
unspecified error说明 已知验证场景
- 同一份视觉检测代码在Intel架构x86_64 Mac的对应模拟器上可正常返回检测结果
- M1 Mac上以x86转译模式运行的iPhone 11(iOS 13.7)模拟器可正常执行相同逻辑
- 仅在M1 Mac原生arm64模式下运行的iPhone 12(iOS 14.3)模拟器中,调用人脸关键点检测请求时,会在请求回调中抛出无具体描述的
unspecified error,该错误不会被handler.perform的外层catch块捕获
问题涉及的业务代码
let handler = VNImageRequestHandler(cgImage: image) let request = VNDetectFaceLandmarksRequest { request, error in guard error == nil else { // <-- 此处捕获到`unspecified error` finish() return } if let faceObservations = request.results as? [VNFaceObservation] { outputFaceImages = faceObservations.map { image.cropping(to: $0.boundingBox)! } } finish() } do { try handler.perform([request]) } catch { finish() }
问题根因
该报错属于M1芯片发布初期配套iOS 14.3原生模拟器镜像的适配缺陷,与业务代码逻辑无关:
- iOS 14.3的原生arm64模拟器镜像未完整编译Vision框架依赖的神经引擎加速适配模块,当检测请求尝试调用硬件加速通道时,会触发框架内部未捕获的路径异常,对外仅抛出无具体详情的通用错误
- 若将该iOS 14.3模拟器切换为Rosetta转译的x86_64模式运行,Vision框架会自动回退到通用CPU计算路径,即可避开该适配漏洞
可行解决方式
- 针对需要调试的iOS 14.3版本模拟器,在运行配置中勾选Rosetta转译启动选项,强制以转译模式加载镜像,保证Vision框架调用走兼容路径
- 将Xcode升级至12.4及以上版本,下载修正适配的iOS 14.4及更高版本模拟器镜像,官方已在后续镜像版本中补全M1原生模拟器的Vision框架依赖组件
- 调试阶段可优先使用验证通过的iOS 13.7模拟器完成Vision相关功能的逻辑校验
内容的提问来源于stack exchange,提问作者Ben Butterworth
相关产品推荐
相关产品推荐

