Xcode 如何使用swift从VCard检索数据
我正在做二维码扫描。使用以下swift代码,可在控制台中打印QR代码中的数据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 =
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)