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

如何阻止DataScannerViewController将条码转换为EAN-13格式

解决条码扫描被自动转换为EAN-13格式的问题

核心问题是DataScannerViewController会自动将部分条码类型(如UPC-E)转换为EAN-13格式(补全前缀和校验位),而你需要的是扫描到的原始条码数字。要获取原始数据,不能直接使用payloadStringValue,而是要读取条码的原始字节数据并根据条码类型解析。

解决方案步骤

1. 指定具体的食品类条码类型

创建DataScannerViewController时,明确指定食品常用的条码类型(而非默认的所有类型),提升识别精准度:

let viewController = DataScannerViewController(
    recognizedDataTypes: [.barcode(symbologies: [.upce, .ean13, .ean8, .upca])],
    qualityLevel: .accurate,
    recognizesMultipleItems: false,
    isHighFrameRateTrackingEnabled: false,
    isHighlightingEnabled: true)

2. 读取原始条码数据

在扫描回调中,根据条码的symbology(类型)从rawValue提取原始字符串,避免自动格式转换:

func dataScanner(_ dataScanner: DataScannerViewController, didAdd addedItems: [RecognizedItem], allItems: [RecognizedItem]) {
    guard let item = addedItems.first else { return }
    
    if case .barcode(let barcode) = item {
        Task {
            let rawBarcodeString: String?
            
            switch barcode.symbology {
            case .upce:
                // UPC-E原始为8位,payloadStringValue会自动转换为EAN-13,直接解析rawValue
                rawBarcodeString = barcode.rawValue.map { String(format: "%c", $0) }.joined()
            case .ean8:
                // EAN-8为8位原始长度,直接从rawValue提取
                rawBarcodeString = barcode.rawValue.map { String(format: "%c", $0) }.joined()
            case .ean13, .upca:
                // 这两种类型本身为标准长度,可直接使用payloadStringValue或rawValue
                rawBarcodeString = barcode.payloadStringValue ?? barcode.rawValue.map { String(format: "%c", $0) }.joined()
            default:
                // 其他类型 fallback 到payloadStringValue
                rawBarcodeString = barcode.payloadStringValue
            }
            
            guard let barcodeID = rawBarcodeString,
                  let food = try? await foodService.getFoods(query: barcodeID).first
            else { return }
            
            // 此处处理原始条码ID
            print("原始条码:\(barcodeID)")
        }
    }
}

原理说明

payloadStringValue会按照行业标准对部分条码类型进行格式转换(比如UPC-E转EAN-13),而rawValue存储的是扫描到的原始字节数据,通过将字节转换为ASCII字符串,就能得到你需要的原始条码数字。

内容的提问来源于stack exchange,提问作者timmypass17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:06:17