【问题标题】:How to retrieve data from VCard using swift如何使用 swift 从 VCard 中检索数据
【发布时间】:2017-08-03 06:25:51
【问题描述】:

我正在处理 QR 码扫描。使用以下 swift 代码,二维码中的数据正在控制台中打印。

import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate
{
    let session = AVCaptureSession()
    @IBOutlet weak var square: UIImageView!
    var video = AVCaptureVideoPreviewLayer()

    override func viewDidLoad()
    {

        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.


    }

    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {

        if metadataObjects != nil && metadataObjects.count != 0
        {
            if let object = metadataObjects[0] as? AVMetadataMachineReadableCodeObject
            {
                if object.type == AVMetadataObjectTypeQRCode
                {
                    print(object.stringValue)

                    let alert = UIAlertController(title: "QR Code", message: object.stringValue, preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "Okey", style: .default, handler: nil))
                   /* alert.addAction(UIAlertAction(title: "Copy", style: .default, handler: { (nil) in
                        UIPasteboard.general.string = object.stringValue
                    }))
                */
                    present(alert, animated: true, completion: nil)

                    if metadataObjects.count > 0
                    {
                        print("-------------------------------------------------")
                        self.session.stopRunning()

                    }

                }
            }
        }
    }

    @IBAction func startButton(_ sender: Any)
    {
        // Creating session
       // let session = AVCaptureSession()

        // Define capture device
        let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

        do {
            let input = try AVCaptureDeviceInput(device: captureDevice)
            session.addInput(input)
        } catch {
            print("Error")
        }

        let output = AVCaptureMetadataOutput()
        session.addOutput(output)

        output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)

        output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]

        video = AVCaptureVideoPreviewLayer(session: session)
        video.frame = view.layer.bounds
        view.layer.addSublayer(video)
        self.view.bringSubview(toFront: square)
        session.startRunning()        
    }

    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

输出:

BEGIN:VCARD
VERSION:2.1
FN:John Peter
N:Peter;John
TITLE:Admin
TEL;CELL:+91 431 524 2345
TEL;WORK;VOICE:+91 436 542 8374
EMAIL;WORK;INTERNET:John@ommail.in
URL:www.facebook.com
ADR;WORK:;;423 ofce sales Center;Newark;DE;3243;USA
ORG:xxx Private limited
END:VCARD

现在我想要的是,如何具体检索 VCard 格式的数据,例如获取名字、姓氏、电子邮件 ID、手机号码等。之前提出过类似的问题,但这是客观的-C。我不知道如何快速执行此操作 3. 提前致谢。

【问题讨论】:

  • 看看CNContactVCardSerialization (macOS 10.11+, iOS 9+)
  • 查了,没找到相关的解决办法。
  • 类中只有两种方法(descriptorForRequiredKeys除外),一种用于编码,一种用于解码。类似于JSONSerialization,但要简单得多。
  • 我明白了。太酷了。
  • 如何在联系人中保存电子名片。实际上,我正在研究 QRCode 阅读工具并以相同格式获取 vcard 数据。我必须添加这个联系人。请帮忙..

标签: xcode swift3 qr-code vcf-vcard


【解决方案1】:

这是我使用的 Playground 的示例代码。这不是最好的,但你会明白的:

import UIKit
import Contacts

var str = "BEGIN:VCARD \n" +
"VERSION:2.1 \n" +
"FN:John Peter \n" +
"N:Peter;John \n" +
"TITLE:Admin \n" +
"TEL;CELL:+91 431 524 2345 \n" +
"TEL;WORK;VOICE:+91 436 542 8374 \n" +
"EMAIL;WORK;INTERNET:John@ommail.in \n" +
"URL:www.facebook.com \n" +
"ADR;WORK:;;423 ofce sales Center;Newark;DE;3243;USA \n" +
"ORG:xxx Private limited \n" +
"END:VCARD"

if let data = str.data(using: .utf8) {
    let contacts = try CNContactVCardSerialization.contacts(with: data)
    let contact = contacts.first
    print("\(String(describing: contact?.familyName))")
}

CNContactVCardSerialization.contacts(with: data) 的输出是 CNContact (reference) 的数组。

【讨论】:

  • 谢谢。不知何故设法获取所有数据。唯一的问题是,我使用此代码获取地址“print(contact?.postalAddresses[0].value ?? String())”并显示这样的地址“" 你能告诉我如何分别获取国家名称、州等吗?
  • postalAddresses 是一个 CNPostalAddress 对象数组 developer.apple.com/documentation/contacts/cnpostaladdress 。请检查文档,有专门用于此的属性。由于我有一段时间在移动设备上,所以我无法发布代码。
【解决方案2】:

在这里您可以查看 Mateusz Szlosek swift 4 的更新答案

 var str = "BEGIN:VCARD \n" +
  "VERSION:2.1 \n" +
  "FN:John Peter \n" +
  "N:Peter;John \n" +
  "TITLE:Admin \n" +
  "TEL;CELL:+91 431 524 2345 \n" +
  "TEL;WORK;VOICE:+91 436 542 8374 \n" +
  "EMAIL;WORK;INTERNET:John@ommail.in \n" +
  "URL:www.facebook.com \n" +
  "ADR;WORK:;;423 ofce sales Center;Newark;DE;3243;USA \n" +
  "ORG:xxx Private limited \n" +
"END:VCARD"

func fectchContact(){
  if let data = str.data(using: .utf8) {
    do{
      let contacts = try CNContactVCardSerialization.contacts(with: data)
      let contact = contacts.first
      print("\(String(describing: contact?.familyName))")
    }
    catch{
      // Error Handling
      print(error.localizedDescription)
    }
  }
}

【讨论】:

  • 这是另一个更新str.data(using: .utf8) 永远不会失败。你也可以使用非可选的Data(str.utf8)
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
相关资源
最近更新 更多