You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:07:41