我有一个问题,我不知道是什么原因引起的。所以我希望能够使用相机扫描二维码,但我立即将数据设置为捕获会话应用程序关闭,甚至手机被锁定。除了
Output
之外,奇怪的XPC connection interrupted
中没有任何报道。没有找到我遇到的问题与此输出之间的相关性。
值得一提的是,在我为测试目的创建的全新项目中,相同的代码基本上是复制粘贴的。所以相机和二维码扫描工作。
我的假设是项目配置出了问题,我不知道是什么。
代码如下:
guard let videoCaptureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else {
print("Camera access failed")
return
}
do {
let videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
captureSession.addInput(videoInput)
} catch {
failed()
return
}
let metadataOutput = AVCaptureMetadataOutput()
captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
guard metadataOutput.availableMetadataObjectTypes.contains(.qr) else {return}
metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.frame = view.layer.bounds
previewLayer.videoGravity = .resizeAspectFill
view.layer.addSublayer(previewLayer)
startScanner()
}
// View Did Load ends here
func startScanner() {
// Check camera usage permission
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized:
print("Scan View Controller || Permission to use camera granted")
DispatchQueue.global().async {
self.captureSession.startRunning()
}
case .notDetermined:
print("Scan View Controller || Permission to use camera not determined")
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
DispatchQueue.global().async {
self.captureSession.startRunning()
}
}
}
case .denied:
print("Scan View Controller || Permission to use camera denied")
return
case .restricted:
return
@unknown default:
return
}
}
但是立即启动屏幕结果是下图:
或查看 Reddit 问题中的视频: https://www.reddit.com/r/iOSProgramming/comments/11l6tht/xpc_connection_interrupted_capture_session/
不幸的是,没有完整的堆栈跟踪,很难说出问题是什么。
一般来说,改变 AVCaptureSession 或任何 它的输入、输出或同时来自多个线程的连接 时间。
我建议创建您自己的队列,并使用它而不是使用 AVFoundation 为所有操作获取全局队列:
let sessionQueue = DispatchQueue(label: "com.name.AVFoundation", attributes: [], autoreleaseFrequency: .workItem)
sessionQueue.async {
}
我还注意到您的会话配置不完全正确:
您应该在更改会话的之前调用 beginConfiguration 方法 inputs or outputs, make后调用commitConfiguration方法 变化。