如何阻止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
相关产品推荐
相关产品推荐

