2017-08-03 12 views
0

QRコードスキャンを行っています。以下のスウィフトコードを使用すると、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 

今私は、どのようにA等の姓、名、電子メールID、携帯電話番号を、得るようなものは、具体的にvCard形式でデータを取得している何をしたいですこれに先立って同様の質問がされていますが、それは客観的なものでした。私はこの迅速な方法を知らない3.事前に感謝します。

+0

用に更新答えを確認することができます[CNContactVCardSerialization](https://developer.apple.com/documentation/contacts/cncontactvcardserialization)を見てみましょう(MacOSの10.11+ 、iOS 9+) – vadian

+0

これを確認しましたが、関連する解決策が見つかりませんでした。 – Tester

+0

クラスには2つのメソッド( 'descriptorForRequiredKeys'以外)があります.1つはデコード用にエンコードするメソッドです。これは 'JSONSerialization'に似ていますが、はるかに単純です。 – vadian

答えて

5

ここに私が使用したプレイグラウンドのサンプルコードがあります。それは最高ではないですが、あなたはアイデアを得るでしょう:CNContactVCardSerialization.contacts(with: data)から

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))") 
} 

出力はCNContactreference)の配列です。ここで

+0

ありがとう。何とかすべてのデータを取得することができました。 " Tester

+0

postalAddressesは、CNPostalAddressオブジェクトの配列です(https://developer.apple.com/documentation/contacts/cnpostaladdress)。ドキュメントを確認してください。これだけのプロパティがあります。私はしばらくの間モバイルにいるのでコードを投稿できません。 –

+0

それはクールです。ありがとうございました。 – Tester

-1

あなたはSWIFTは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(using:.utf8)'は決して失敗しません。また、オプションの 'Data(str.utf8)'を使うこともできます。 – vadian

関連する問題