VNDetectBarcodesRequest 在 iOS16 上无法工作

3
我在iOS 16上使用VNDetectBarcodesRequest遇到了问题。我的代码在iOS 15上正常工作,但在iOS 16上无法在图像中找到任何条形码。
我将代码分离到playground中,并在此处遇到相同的问题。在Xcode 13.4.1的playground上运行下面的代码,我得到以下结果:

"Google link: Optional("https://www.google.com")"

在Xcode 14上运行相同的代码时,我得到一个nil结果。在带有Xcode 14的iOS 15模拟器中运行此代码会得到一个肯定的结果,但仅在iOS 16和playground中才无法读取QR码。
另外,也没有抛出任何异常。
有人经历过相同的问题并成功解决吗?
这是我的playground代码:
import UIKit
import Vision

extension UIImage {
    func qrCodeLink(completion: @escaping (String?) -> Void) {
        guard let ciImage = CIImage(image: self) else {
            completion(nil)
            return
        }
        let imageRequestHandler = VNImageRequestHandler(ciImage: ciImage,
                                                        orientation: .up,
                                                        options: [:])       
        let request = VNDetectBarcodesRequest { (request,error) in
            guard error == nil else {
                completion(nil)
                return
            }
            
            guard let observations = request.results as? [VNDetectedObjectObservation] else {
                completion(nil)
                return
            }
            
            let result = (observations.first as? VNBarcodeObservation)?.payloadStringValue
            completion(result)
        }
        try? imageRequestHandler.perform([request])
    }
}

if let google = UIImage(named: "google") {
    google.qrCodeLink { link in
        debugPrint("Google link: \(link)")
    }
} else {
    debugPrint("No google image")
}

使用上述代码,我正在使用此图像,它仅是指向https://www.google.com的链接: Google

3个回答

5

谢谢!我们已经注意到了同样的问题,并且解决了它。有一个澄清:1)在iOS 15模拟器中,默认使用Revision2进行请求,成功。 2)在iOS 16模拟器中,默认使用Revision3进行请求,失败。 3)在iOS 16模拟器中,如果您手动指定Revision2,它也会失败。只有通过指定Revision1才能在iOS 16模拟器中正常工作(至少在Xcode 14.1 beta中)。 - Wes Campaigne
感谢您的澄清。在Xcode 14(不是14.1 beta)中,似乎对于我们两个版本1和2都可以工作。同样适用于我上面发布的playground代码。我不确定是否打算发布版本3,因为在我看来,它应该继续与版本3一起工作,但苹果没有做出记录。也许这是iOS 16或iOS 16模拟器中的错误?我已经提交了FB11543049。 - Paul Peelen

5

延续@Paul Peelen的解决方案,以确保只在需要的地方使用解决方法(Xcode 14 + iOS 16 + 模拟器),我们使用了:

#if targetEnvironment(simulator) && compiler(>=5.7)
if #available(iOS 16, *) {
    request.revision = VNDetectBarcodesRequestRevision1
}
#endif

1
鉴于这种方法更具可持续性,我已经接受了您的答案作为正确的答案。干得好!然而,我在想我们是否应该使用这个修订,因为它并没有在VNDetectBarcodesRequest页面上正式记录。我已经向苹果提交了反馈票据。 - Paul Peelen

0

在编译iOS 15或16时,我发现在扫描带有边框条形码或不带边框条形码时,VNDetectedBarcodesRequest的行为存在差异。该边框似乎触发了扫描代码何时开始工作的问题。

有边框:它可以正确扫描黑色背景图像和白色背景图像的条形码。

没有边框:它可以正确扫描黑色背景上显示的条形码图像,但是当该图像被打印在白色纸张上并进行扫描时,则无法扫描出来。没有边框就没有条形码。

新问题:当扫描单个带边框条形码时,它返回了17个相同的条形码观察结果数组。


1
在“无边框”方面 - VNDetectedBarcodesRequest未能将整个条形码绘制到其矩形中以进行分析。在扫描时,如果略微倾斜,则会以可能切掉第一个或最后一个垂直条的方式放置矩形的四个点(对于没有边框的code39条形码)。在17个观察结果的“新问题”中...它们是17个相同的观察结果,可能是按概率降序排列的。建议:开发人员可以在将数组返回给应用程序之前丢弃任何相同的低概率猜测。 - Richard

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