Swift:无法检测线性条形码

标签 swift barcode-scanner

我正在编写条码阅读器应用程序,但我无法检测线性条码,即代码 128。我对 Qr 码、EAN13 类型和 ISBN 类型没有任何问题。我的代码非常简单:

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {

        if metadataObjects.count != 0 {
            if let object = metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
                if object.type == AVMetadataObject.ObjectType.qr {
                    if let text = object.stringValue {
                        print(text)

                        session.stopRunning()

                        let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: UIAlertControllerStyle.alert)
                        alertVC.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
                            self.session.startRunning()
                        }))
                        present(alertVC, animated: true, completion: nil)
                    }
                } else {
                    if let text = object.stringValue {
                        print("Other code detected: ", text)
                    }
                }
            }
        }

我用了this免费的在线条形码生成器来测试我的应用程序。我能够检测大多数其他条形码,线性代码除外。有没有人遇到过这样的问题?

最佳答案

确保包含 AVMetadataObjectTypeCode128Code [.code128]设置 AVCaptureMetadataOutput 时对象类型 metadataObjectTypes .

metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]

如果您想允许所有可用的元数据对象类型,您可以使用 AVCaptureMetadataOutput属性(property)availableMetadataObjectTypes返回所有可用类型:

metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes

如果您希望允许除第一个面以外的所有内容,您可以删除可用元数据对象类型的第一个元素。请注意,Apple 可能会在不久的将来更改元数据元素的顺序,因此最好手动选择您的应用所需的条码类型:

metadataOutput.metadataObjectTypes =  Array(metadataOutput.availableMetadataObjectTypes.dropFirst())

只是对您的实际代码的一些注释。您不应该检查元素计数是否等于零来检查它是否为空。 Array 有一个名为 isEmpty 的属性,正是为了 if !metadataObjects.isEmpty { //...。 .另一种选择是,如果只使用数组的第一个元素,我建议使用数组 .first而不是下标 [0]它返回一个可选元素 AVMetadataObject?AVMetadataObject.ObjectType在你的比较中是多余的:

if let object = metadataObjects.first as? AVMetadataMachineReadableCodeObject {
    if object.type == .qr {
        if let text = object.stringValue {
            print(text)
            session.stopRunning()
            let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: .alert)
            alertVC.addAction(UIAlertAction(title: "Ok", style: .default) { _ in
                self.session.startRunning()
            })
            present(alertVC, animated: true)
        }
    }
    else
    if let text = object.stringValue {
        print("Other code detected: ", text)
    }
}

关于Swift:无法检测线性条形码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726619/

相关文章:

ios - Pinterest 身份验证失败 : -canOpenURL: failed for URL: "pinterestsdk. v1://oauth

android - 从条形码扫描器捕获键盘输入

cordova - 在cordova-2.0.0中未定义window.plugins

android - 将 Zxing 条码扫描器与我的 Android 应用程序集成 - 自定义操作名称问题

swift - 循环和范围运算符的基准

ios - 如何快速清除和重绘 UIView 的内容(存在于 View Controller 中)?

json - Swift 解码具有混合类型和可能的子结构的 JSON

macos - 在 OS X 应用程序中嵌入推荐代码的创意解决方案

android - Android 上的 ZXing - 解码性能极慢

android - ML Kit 条码扫描未检测到显示器屏幕照片中的二维码