2017-08-03 58 views
0

我正在进行QR码扫描。使用以下swift代码,QR代码中的数据将被打印到控制台中。如何使用swift从VCard检索数据

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. 
    } 
} 

OUTPUT:

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:[email protected] 
URL:www.facebook.com 
ADR;WORK:;;423 ofce sales Center;Newark;DE;3243;USA 
ORG:xxx Private limited 
END:VCARD 

现在,我要的是,如何具体检索vCard格式的数据,喜欢把自己的名字,姓氏,电子邮件ID,手机号码等。以前有人问过类似的问题,但它是在Objective-C中。我不知道如何做到这一点3.预先感谢。

+0

看看[CNContactVCardSerialization(https://developer.apple.com/documentation/contacts/cncontactvcardserialization)(MacOS的10.11+ ,iOS 9+) – vadian

+0

检查了它,但找不到相关解决方案。 – Tester

+0

该类中只有两个方法(除了'descriptorForRequiredKeys'),一个用于编码解码。这就像'JSONSerialization',但要简单得多。 – vadian

回答

5

下面是我使用的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:[email protected] \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)输出是CNContactreference)阵列。

+0

谢谢。以某种方式设法获取所有数据。唯一的一点是,我使用此代码获取地址“print(contact?.postalAddresses [0] .value ?? String())”,并显示如下地址:“ “你能告诉我如何分别获取国家名称,州名等。 – Tester

+0

postalAddresses是一个CNPostalAddress对象数组https://developer.apple.com/documentation/contacts/cnpostaladdress。请检查文档,这是属性。自从我在手机上一段时间后,我无法发布代码。 –

+0

这很酷。谢谢。 – Tester

-1

在这里,您可以检查更新的答案Mateusz Szlosek雨燕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:[email protected] \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) 
    } 
    } 
} 
+1

这是另一个*更新*:'str.data(使用:.utf8)'永远不会失败。你也可以使用非可选的'Data(str.utf8)' – vadian

相关问题