Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何使用swift从VCard检索数据_Xcode_Swift3_Qr Code_Vcf Vcard - Fatal编程技术网

Xcode 如何使用swift从VCard检索数据

Xcode 如何使用swift从VCard检索数据,xcode,swift3,qr-code,vcf-vcard,Xcode,Swift3,Qr Code,Vcf Vcard,我正在做二维码扫描。使用以下swift代码,可在控制台中打印QR代码中的数据 import UIKit import AVFoundation class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { let session = AVCaptureSession() @IBOutlet weak var square: UIImageView! var video =

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

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、手机号码等。之前也有人问过类似的问题,但在objective-c中。我不知道该怎么做。提前感谢。

这里是我使用的游乐场的示例代码。这不是最好的,但你会想到:

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
()的数组

在这里,您可以查看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)
    }
  }
}

查看一下(macOS 10.11+,iOS 9+)检查了它,但找不到相关的解决方案。类中只有两个方法(除了
descriptorForRequiredKeys
),一个用于编码,一个用于解码。这就像
JSONSerialization
,但要简单得多。我明白了。太酷了。如何在联系人中保存vcard。实际上,我正在开发QRCode读取工具,并获取相同格式的vcard数据。我必须添加此联系人。请帮忙……谢谢。不知何故,他设法得到了所有的数据。唯一的问题是,我用这段代码来获取地址“print(contact?.postalAddresses[0].value??String()”,它显示的地址是这样的“你能告诉我如何分别获取国家名称、州等吗?postalAddresses是一个CpostalAddress对象数组。请检查文档,这里有专门用于此的属性。我无法发布代码,因为我在手机上呆了一段时间。下面是另一个更新:
str.data(使用:.utf8)
将永远不会失败。您还可以使用非可选的
数据(str.utf8)