gpt4 book ai didi

ios - swift 4 : Scanning QR codes with dictionary inputs

转载 作者:行者123 更新时间:2023-11-28 06:15:40 24 4
gpt4 key购买 nike

我正在尝试扫描我使用 Adding Multiple Key-Value Pairs to QR Code 生成的二维码作为指南。我可以生成二维码,但是当我尝试扫描它时,它会生成一个 metadataObj.stringValue 为 null。

这是我读取元数据输出的代码:

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
// Check if the metadataObjects array is not nil and it contains at least one object.
if metadataObjects == [] || metadataObjects.count == 0 {
qrCodeFrameView?.frame = CGRect.zero
print("No QR code is detected")
return
}

// Get the metadata object.
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject

if metadataObj.type == AVMetadataObject.ObjectType.qr {
// If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds
if let layer = previewLayer{
let barCodeObject = layer.transformedMetadataObject(for: metadataObj)
qrCodeFrameView?.frame = barCodeObject!.bounds
}


guard let inputData = metadataObj.stringValue?.data(using: String.Encoding.isoLatin1, allowLossyConversion: false),
let dictionary = NSKeyedUnarchiver.unarchiveObject(with: inputData) as? [String: NSData] else { return }

print(dictionary["firstName"] ?? "None")
}
}

如果元数据对象输出的字符串值为 null,我该如何解档数据?

最佳答案

我能够使用 Codable protocol 将 Swift 字典编码为 QR 码并从 metadataObject 输出对其进行解码。

以下是将数据编码为二维码的思路:

  1. 使您的数据类型(可以是字典,可以是您自己的结构)符合 Codable 协议(protocol)
  2. 通过 JSON 编码器将您的数据序列化为 JSON
  3. 将序列化数据放入生成二维码的 Core Image 过滤器

这是我用来将 swift 字典转换为二维码的代码:

func generateQRCode(from dictionary: [String:String]) -> UIImage? {
do {
let data = try JSONEncoder().encode(dictionary)
if let validData = String(data: data,encoding: .utf8){
print(validData)
}

if let filter = CIFilter(name: "CIQRCodeGenerator"){
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 10, y: 10)
if let output = filter.outputImage?.transformed(by: transform){
return UIImage(ciImage: output)
}
}
} catch {
print(error.localizedDescription)
}
return nil
}

以下是从 QR 码解码数据的思维过程:

  1. 检查以确保您的元数据对象确实是一个二维码
  2. 使用 utf-8 编码将您的元数据对象转换为数据对象
  3. 使用 JSON 解码器解码数据对象并指定要解码的数据类型

这是我编写的代码,用于使用 QR 委托(delegate)函数 metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) 将 QR 码解码回 Swift 字典。

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


if let metadataObject = metadataObjects.first{
if metadataObject.type == .qr{
let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject
do {
if let validData = readableObject?.stringValue?.data(using: .utf8){

let dict = try JSONDecoder().decode([String:String].self,from:validData)
//do stuff with dict
print(dict)
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
}
} catch {
print(error.localizedDescription)
}

}
}
navigationController?.popViewController(animated: true)
}

希望能帮助仍然停留在这个问题上的任何人。 Codable 非常方便将数据类型序列化为 JSON,这非常适合 IMO 的 QR 码。

关于ios - swift 4 : Scanning QR codes with dictionary inputs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45206947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com