M1芯片MacOS13下带相机权限获取相机列表致UI卡顿问题求解
解决方案:M1 macOS 13下x86_64架构App枚举相机卡顿问题
核心原因
在M1设备上通过Rosetta 2转译运行x86_64架构的macOS App时,AVCaptureDevice devicesWithMediaType:枚举相机的系统调用存在性能瓶颈,导致主线程阻塞、UI长时间卡顿。
具体解决办法
优先使用原生arm64架构
放弃x86_64编译目标,直接针对arm64架构编译App:- 打开Xcode的Build Settings
- 将
Architectures设置为arm64 - 清空
Valid Architectures或仅保留arm64
原生架构下相机枚举操作耗时会降至毫秒级,完全消除UI卡顿问题,这也是最彻底的解决方案。
异步执行相机枚举(必须保留x86_64时)
禁止在主线程调用相机枚举方法,将其放到后台队列执行,避免阻塞UI:dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSArray *devicesIOS = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; // 处理相机列表数据 dispatch_async(dispatch_get_main_queue(), ^{ // 切回主线程更新UI或执行后续逻辑 }); });即使枚举仍耗时4秒,主线程也能保持响应,不会出现长时间卡顿。
延迟相机枚举时机
不要在App启动阶段执行相机枚举,等到用户主动触发相机功能(比如点击“开启相机”按钮)时再调用devicesWithMediaType:,将性能开销延后到实际需要的时机,避免影响启动体验。优化权限请求时机
避免在启动时同时触发相机权限请求和相机枚举操作,将权限请求延迟到用户首次进入相机相关功能页面时再发起,减少启动时的系统调用并发量。
补充验证
Zoom、ClassIn等应用的卡顿问题同样源于Rosetta 2转译,若使用这些应用的原生arm64版本,启动时的卡顿现象会消失。
内容的提问来源于stack exchange,提问作者xp19870106
相关产品推荐
相关产品推荐

