iOS 18+Swift 6下AVCaptureDevice.requestAccess调用崩溃求助
iOS 18 + Swift 6 相机权限请求崩溃问题排查与解决思路
问题概述
- 仅在iOS 18 + Swift 6环境下触发崩溃,iOS 17及更早版本运行正常
- Info.plist已配置
Privacy - Camera Usage Description权限描述键 - 崩溃场景:实现
UIViewControllerRepresentable的视图控制器包装器(位于按钮跳转的目标视图内)中请求相机权限时,有时弹窗后崩溃,有时无弹窗直接崩溃 - 无效尝试:在
requestAccess闭包内添加Task { @MainActor },甚至将闭包置空仍无法避免崩溃 - 崩溃堆栈核心信息:
_dispatch_assert_queue_fail
可能的解决思路
- 严格保证队列合规性:
_dispatch_assert_queue_fail提示队列断言失败,Swift 6对并发队列的检查比之前版本更严格。需确保相机权限请求的调用完全在主队列执行,可显式用DispatchQueue.main.async包裹请求代码:DispatchQueue.main.async { AVCaptureDevice.requestAccess(for: .video) { granted in // 处理权限结果 } } - 调整权限请求时机:避免在
UIViewControllerRepresentable的makeUIViewController或updateUIViewController阶段触发权限请求,建议将请求移至视图控制器的viewDidAppear方法中,确保视图控制器生命周期完全就绪后再发起请求。 - 检查Swift 6并发适配:Swift 6强化了Sendable协议和并发安全检查,确认代码中是否存在违反并发安全的情况,比如在非Sendable类型上执行异步操作,或不正确的上下文切换。
- 升级至最新Beta版本:iOS 18和Swift 6均处于Beta阶段,可能存在系统或Xcode的已知Bug,尝试更新到最新的Xcode Beta版本重新测试。
- 排查视图控制器生命周期冲突:检查
UIViewControllerRepresentable的包装逻辑,确保视图控制器的创建、更新与销毁流程符合SwiftUI与UIKit交互的规范,避免因生命周期异常导致的队列混乱。
内容的提问来源于stack exchange,提问作者Luciano Perez
相关产品推荐
相关产品推荐

