我正在编写条形码阅读器应用程序,但无法检测线性类型的条形码,即代码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) } } } }
我使用了这个免费的在线条形码生成器来测试我的应用。除线性代码外,我还能检测到其他大多数条形码。有人也遇到过这样的问题吗?
[.code128]设置AVCaptureMetadataOutput对象类型时,请确保包括AVMetadataObjectTypeCode128Code metadataObjectTypes。
[.code128]
AVCaptureMetadataOutput
metadataObjectTypes
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]
如果要允许所有可用的元数据对象类型,则可以使用 AVCaptureMetadataOutput属性availableMetadataObjectTypes,该属性返回所有可用的类型:
availableMetadataObjectTypes
metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes
如果要允许除第一个面之外的所有面,则可以删除availableMetadataObjectTypes的第一个元素。请注意,Apple可能会在不久的将来更改元数据元素的顺序,因此最好仅手动选择应用程序所需的条形码类型:
metadataOutput.metadataObjectTypes = Array(metadataOutput.availableMetadataObjectTypes.dropFirst())
关于实际代码的几点说明。您不应该检查元素计数是否等于零来检查其是否为空。Array恰好具有一个名为isEmpty的属性if !metadataObjects.isEmpty { //...。另一个选择是,如果仅使用数组的第一个元素,我建议使用Array .first而不是使用下标[0],它返回一个可选元素,AVMetadataObject?并且AVMetadataObject.ObjectType在您的比较中是多余的:
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) } }