Improve QR scanner: prefer built-in camera, add rectOfInterest, fallback metadata types

This commit is contained in:
yumoqing 2026-06-24 19:24:25 +08:00
parent 8236b586c5
commit f220800262

View File

@ -99,8 +99,17 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
// 在后台线程初始化摄像头
private func setupCaptureOnBackground(previewHost: NSView) {
let session = AVCaptureSession()
session.sessionPreset = .high
guard let device = AVCaptureDevice.default(for: .video) else {
// 优先选内置摄像头,避免 Continuity Camera 不支持 metadata
var device: AVCaptureDevice?
if let builtIn = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .unspecified) {
device = builtIn
} else {
device = AVCaptureDevice.default(for: .video)
}
guard let device = device else {
DispatchQueue.main.async { [weak self] in
self?.showError("No camera available")
}
@ -125,11 +134,18 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
// 检查摄像头是否支持 QR 码识别
if output.availableMetadataObjectTypes.contains(.qr) {
output.metadataObjectTypes = [.qr]
output.rectOfInterest = CGRect(x: 0.1, y: 0.1, width: 0.8, height: 0.8)
} else {
DispatchQueue.main.async { [weak self] in
self?.showError("Camera does not support QR code scanning")
// fallback: 支持什么就用什么
let types = output.availableMetadataObjectTypes.filter { $0 == .qr || $0 == .ean13 || $0 == .ean8 || $0 == .code128 }
if !types.isEmpty {
output.metadataObjectTypes = types
} else {
DispatchQueue.main.async { [weak self] in
self?.showError("Camera does not support QR code scanning")
}
return
}
return
}
}