swift VNDetectBarcodes请求在iOS16上不起作用

ogq8wdun  于 2023-01-19  发布在  Swift
关注(0)|答案(3)|浏览(257)

我在iOS 16上使用VNDetectBarcodesRequest时遇到问题。我的代码在iOS 15上按预期工作,但在iOS 16上未在图像中找到任何条形码。
我把代码放到了一个操场上,现在遇到了同样的问题,在Xcode 13.4.1的操场上运行下面的代码,得到了如下结果:
“谷歌链接:可选(“https://www.google.com“)
在Xcode 14上运行相同的代码,我得到了nil的结果。在iOS15模拟器中用Xcode 14运行这个给出了积极的结果,只是在iOS16和操场上它不是在阅读QR码。
要添加到它,也不会抛出异常。
有没有人经历过同样的事情并设法解决了这个问题?
这是我的游戏规则:

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的链接:

yqkkidmi

yqkkidmi1#

我想我已经找到问题了。当在Xcode 14和iOS 16上运行请求时,请求版本在VNDetectBarcodesRequestRevision3上运行(VNDetectBarcodesRequest页面上还没有记录)。但是,使用VNDetectBarcodesRequestRevision1VNDetectBarcodesRequestRevision2可以工作。
在执行任务对我起作用之前添加了以下内容:

request.revision = VNDetectBarcodesRequestRevision1
a14dhokn

a14dhokn2#

在详细阐述@Paul Peelen的解决方案时,为了确保仅在需要时使用变通方案(Xcode 14 + iOS 16 +模拟器),我们使用了:

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

zvms9eto3#

在为iOS 15或16编译时,我发现扫描带边框的条形码和不带边框的条形码时,VNDetectedBarcodesRequest的行为有所不同。该边框似乎会触发扫描代码何时开始。
带边框:它正确地扫描黑背景图像和白背景图像。
无边界:它可以正确扫描显示器上黑色背景的条形码图像,但当图像打印在白色上并扫描时,它会失败。无边框=无条形码。
新问题:当扫描该单个边界条形码时,返回了一个由17个相同条形码观察结果组成的阵列。

相关问题