视觉扫描在iOS16上无法识别GS1条形码特殊字符。

9

我们正在使用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)
    }
}

提前感谢您。

GS1 Barcode example

2个回答

3
我们遇到了同样的问题,我们将测试设备升级到后,我们的应用程序无法正确读取二维码(QR Code和Data Matrix)。在iOS 15上,检测编码数据中的FNC1字符没有问题,该字符用于读取不同的GS1元素。更新后,应用程序无法正确检测FNC1字符以及其他问题导致工作流程被中断。
今天,我们安装了iOS 16.1 beta 3,我确认应用程序正常运行,并且扫描仪能够成功检测到FNC1字符。一切都恢复正常了。
您可以加入Apple Beta软件计划以获取最新的公共测试版,例如我们测试的。 注册链接: https://beta.apple.com/sp/betaprogram/enroll#ios

2
是的,看起来像是苹果的问题。看起来他们已经解决了,感谢您的报告!:)) - AresProductions

1
提供的图像中的内部QR码编码无效。
其中包含的消息被编码为[ECI][BYTE]{GS}10BF40001A{GS}21003032{GS}1122012722VD020,其中[ECI]是ECI模式指示器,[BYTE]引入字节模式段,{GS}是组分隔符字符(ASCII 29)。
图像信号ECI,立即切换到字节模式,然后编码文字GS。这不是包含GS1应用标识符语法数据的QR码符号的编码方式:
  • (10) BF40001A
  • (21) 003032
  • (11) 220127
  • (22) VD020
GS1 QR码比特流必须以显式FNC1模式指示器开头,该指示器在消息中信号“FNC1位于第一位”。这与给定图像中存在的 ECI模式指示器不兼容。
编码的其余部分在技术上是正确的,但非常不寻常,因为它使用了字节模式编码,而不是典型的字母数字模式。
请注意,用于终止未预定义为固定长度的AIs的规范分隔符是FNC1非数据字符,而不是GS数据字符,尽管GS仍然可行。当FNC1模式生效时,在字母数字模式中,FNC1分隔符字符被编码为“%”(并且文字“%”数据字符被转义为“%%”),在字节模式中则被编码为GS字符。
由于指示的符号无法成功解码,因此应该修复图像编码器。
库对以下正确编码的符号有何看法?

GS1 QR Code

上述符号的内部编码为 [FNC1] [ALPHA] 10BF40001A%21003032%1122012722VD020 ,其中 [FNC1] 是FNC1模式指示器, [ALPHA] 引入了一个字母数字模式段。 (请注意,来自原始符号的GS数据字符已正确编码为“%”,表示FNC1非数据字符。)

1
感谢您澄清有关条形码的问题。不幸的是,这是Vision的问题。因为它无法在iOS 16上识别组分隔符字符。您发布的QR码图像仍存在此问题。在另一个GitHub讨论中,一些人说在iOS 16.1 Beta Dev.2上它又可以工作了。 - AresProductions
@AresProductions 为了其他人的利益,请您能够提供您所指的 GitHub 讨论的链接吗?发现无效信息会令人沮丧。 - Terry Burton
@AresProductions 另外,要严谨一些,扫描下面正确编码的符号时实际输出是什么?QR Code 的传输协议规定 FNC1 分隔符字符(除了第一个 FNC1)必须作为 GS 进行传输。在这种情况下,视觉库是否也会剥离代理 FNC1 的 GS 字符?(回答这个问题可以避免后来者发现模糊不清的信息:“太好了,我想我找到了一个经历过我的问题的人,但他们尝试了什么?!”) - Terry Burton
1
抱歉,如果之前我表达不够清楚。这是GitHub讨论页面:https://github.com/xremix/SwiftGS1Barcode/issues/24在iOS 15上,两种条形码(我的和你的)都按预期工作,它们包括GS字符。在iOS 16上(使用相同的代码),两种条形码都被删除了其GS字符。 - AresProductions
1
我们已经升级到iOS 16.0.2 (20A380),但问题仍然存在。无法检测到FNC1分隔符。 - Robin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接