From f22080026230983a6745381716cbbb9b25e48fc7 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 24 Jun 2026 19:24:25 +0800 Subject: [PATCH] Improve QR scanner: prefer built-in camera, add rectOfInterest, fallback metadata types --- Sources/QRScannerView.swift | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Sources/QRScannerView.swift b/Sources/QRScannerView.swift index 432da78..c39bd57 100644 --- a/Sources/QRScannerView.swift +++ b/Sources/QRScannerView.swift @@ -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 } }