SwiftUI中Swift调用扫描仪报错“Scanner Device has not yet become ready”求指引
SwiftUI中调用扫描仪扫描文档的指南及"Scanner Device has not yet become ready"错误解决
基础扫描功能实现示例
由于ImageKit框架基于AppKit,在SwiftUI中需要通过NSViewRepresentable桥接实现扫描功能,以下是核心代码示例:
import SwiftUI import ImageKit struct ScannerView: NSViewRepresentable { typealias NSViewType = IKScannerDeviceView func makeNSView(context: Context) -> IKScannerDeviceView { let scannerView = IKScannerDeviceView() scannerView.delegate = context.coordinator // 指定扫描类型为文档 scannerView.scannerDevice?.setDeviceType(IKScannerDeviceType.document) return scannerView } func updateNSView(_ nsView: IKScannerDeviceView, context: Context) {} func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, IKScannerDeviceViewDelegate { var parent: ScannerView init(_ parent: ScannerView) { self.parent = parent } // 扫描完成回调 func scannerDeviceView(_ scannerDeviceView: IKScannerDeviceView, didScanTo urls: [URL]) { print("扫描文件路径:\(urls)") // 此处可添加文件处理逻辑 } // 错误回调 func scannerDeviceView(_ scannerDeviceView: IKScannerDeviceView, didEncounterError error: Error) { print("扫描错误:\(error.localizedDescription)") } } } // SwiftUI主视图中使用扫描组件 struct ContentView: View { var body: some View { ScannerView() .frame(minWidth: 400, minHeight: 300) .padding() } }
"Scanner Device has not yet become ready"错误排查与解决
针对你遇到的报错,可按以下步骤排查:
严格检查设备就绪状态
调用扫描接口前,必须确保设备处于IKScannerDeviceStatusReady状态,不能在会话刚开启时立即触发扫描。可通过状态判断或延迟等待:// 调用扫描前的状态校验 func triggerScan(_ scannerView: IKScannerDeviceView) { guard let device = scannerView.scannerDevice else { return } if device.status == .ready { try? scannerView.requestScan() } else { // 等待设备初始化,或监听状态变化 DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { triggerScan(scannerView) } } }重新绑定设备实例
若设备浏览成功但状态异常,可尝试重新获取设备并初始化:// 设备浏览器代理方法中重新绑定设备 func deviceBrowser(_ browser: IKDeviceBrowser, didAdd device: IKDevice) { guard let scannerDevice = device as? IKScannerDevice else { return } let scannerView = IKScannerDeviceView() scannerView.scannerDevice = scannerDevice scannerView.delegate = self // 延迟确保设备完成初始化 DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { if scannerDevice.status == .ready { try? scannerView.requestScan() } } }检查权限与硬件状态
- 确认应用已获得扫描权限:在
Info.plist中添加NSAppleEventsUsageDescription说明权限用途,或在系统偏好设置→安全性与隐私中确认应用权限。 - 检查扫描仪硬件:确保设备通电、纸张放置正确、无卡纸等硬件故障。
- 确认应用已获得扫描权限:在
避免重复触发扫描
确保扫描操作串行执行,前一次扫描未完成时不要调用新的扫描请求,可通过标记位控制扫描状态。
内容的提问来源于stack exchange,提问作者Moshiur Rahman
相关产品推荐
相关产品推荐

