Vision 扫描无法识别 iOS16 上的 GS1 条码特殊字符

问题描述 投票:0回答:2

我们正在使用 Vision 库扫描 GS1 条形码。

库无法识别iOS 16版本中的特殊字符“GS”

"GS" --> 组分隔符 (ASCII 29)

我们在旧版本上不会遇到这样的问题。例如 iOS 15.6 或更低版本。我在下面上传了一个 GS1 条形码示例图片。

扫描后我们应该得到:{GS}10BF50001A{GS}21003032{GS}1122012722VD020

我们在 iOS 16 上得到的是:10BF50001A210030321122012722VD020

我还发布了一个关于我们如何使用该库的示例代码。我们没有更改代码,该错误仅出现在 iOS 16 版本中。我们想知道是否引入了错误。

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
        return
    }

    let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .right)

    do {
        try imageRequestHandler.perform([detectBarcodeRequest])
    } catch {
        logger.error(tag: TAG, "barcode error: \(error)")
    }
}

private lazy var detectBarcodeRequest = VNDetectBarcodesRequest { [weak self] request, error in
    guard error == nil else {
        self?.logger.error(tag: self?.TAG, "barcode error: \(error)")
        return
    }
    self?.processVNRequest(request)
}

private func processVNRequest(_ request: VNRequest) {
    guard let barcodes = request.results else {
        return
    }

    for barcode in barcodes {
        guard let potentialBarcode = barcode as? VNBarcodeObservation else {
            return
        }

        guard let payload = potentialBarcode.payloadStringValue else {
            return
        }

        prepareToNotifyDetectionEvent(payload)
    }
}

提前谢谢你。

ios swift barcode ios16 gs1-qr-code
2个回答
3
投票

我们遇到了同样的问题,在我们将测试设备更新到 iOS 16.0.2 之后,我们的应用程序停止正确读取二维条码(二维码和数据矩阵)。在 iOS 15 上,检测编码数据中用于读取不同 GS1 元素的 FNC1 字符没有问题。更新后,应用程序无法正确检测FNC1字符以及其他问题,导致工作流程中断。

今天,我们安装了iOS 16.1 beta 3,我确认该应用程序按预期正常运行,并且扫描仪能够成功检测到FNC1字符。一切恢复正常。

您可以在 Apple Beta 软件计划中注册您的设备以获取最新的公开测试版,例如我们测试过的 iOS 16.1 beta 3。

报名链接:

https://beta.apple.com/sp/betaprogram/enroll#ios


1
投票

所提供图像中消息的内部二维码编码无效。

其中包含的消息编码为

[ECI][BYTE]{GS}10BF40001A{GS}21003032{GS}1122012722VD020
,其中
[ECI]
是ECI Mode指示符,
[BYTE]
引入了一个Byte Mode段,
{GS}
是Group Separator character (ASCII 29)。

图像发出 ECI 信号,立即切换到字节模式,然后编码文字 GS 字符。这根本不是如何编码包含 GS1 应用程序标识符语法数据的 QR 码符号:

  • (10) BF40001A
  • (21) 003032
  • (11) 220127
  • (22) VD020

GS1 QR 代码比特流必须以明确的 FNC1 模式指示符开头,该指示符在消息中表示“FNC1 位于第一位”。这与给定图像中存在的ECI 模式指示器不兼容。

编码的其余部分在技术上是正确的,但非常不寻常,因为它使用字节模式编码而不是典型的字母数字模式。

还请注意,用于终止未预定义为固定长度的 AI 的规范分隔符是 FNC1 非数据字符而不是 GS 数据字符,尽管 GS 仍然是允许的。当 FNC1 模式生效时,FNC1 分隔符在字母数字模式下被编码为“%”(文字“%”数据字符被转义为“%%”),在字节模式下被编码为 GS 字符。

图像编码器应该是固定的,因为不会期望对指示的符号成功解码。

图书馆如何理解以下正确编码的符号?

上述符号的内部编码为

[FNC1][ALPHA]10BF40001A%21003032%1122012722VD020
,其中
[FNC1]
为FNC1模式指示符,
[ALPHA]
引入字母数字模式段。 (请注意,原始符号中的 GS 数据字符已正确编码为“%”,代表 FNC1 非数据字符。)

© www.soinside.com 2019 - 2024. All rights reserved.