如何创buildvCard / vcf文件以在共享表中使用?

我是新来的迅速和我发现的方法已被弃用关于我的问题。 我正在构build一个目录应用程序,我从API中获取联系人数据,而不是从手机的地址簿中获取联系人数据。

在iOS中,如果您访问您的通讯录,则可以select一个联系人,然后select“共享联系人”,以打开分享表。 我想在我的应用程序中确切的function。

我已经得到了股票表,这是我的代码:

@IBAction func actShare(sender: AnyObject) { let activityViewController = UIActivityViewController(activityItems: ["text" as NSString], applicationActivities: nil) presentViewController(activityViewController, animated: true, completion: {}) } 

我想把"text" as NSString改成vCard,就像iOS从地址簿中分享的对象一样,对吗? 假设我是正确的,我想从我自己的应用程序的联系人对象创build一个电子名片,以分享到适当的应用程序(电子邮件,短信等)。

我怎样才能在Swift中实现? 如果我错了,请纠正我,告诉我我需要做什么。 谢谢。

编辑:好的,这是我的变化。

 @IBAction func actShare(sender: AnyObject) { do { var contactData = NSData() try contactData = CNContactVCardSerialization.dataWithContacts([createContact()]) let activityViewController = UIActivityViewController(activityItems: [contactData as NSData], applicationActivities: nil) presentViewController(activityViewController, animated: true, completion: {}) } catch { print("CNContactVCardSerialization cannot save address") } 

 func createContact() -> CNMutableContact { let contactCard = CNMutableContact() contactCard.givenName = "John" contactCard.familyName = "Doe" contactCard.emailAddresses = [ CNLabeledValue(label: CNLabelWork, value: "john.doe@email.com") ] return contactCard } 

然而,当我点击分享button,它popup我的分享表,我select我想要分享的应用程序,它不会按预期添加/附加联系人数据。 我如何做到这一点?

这里的技巧是使用CNContactVCardSerialization.dataWithContacts将联系人保存到VCard(.vcf)文件,然后将文件URL传递给UIActivityViewController 。 活动视图控制器从文件扩展名中检测VCard格式,并显示支持该格式的应用程序(例如消息,邮件,备注,Airdrop等)

例:

 @IBAction func buttonTapped(button: UIButton) { let contact = createContact() do { try shareContacts([contact]) } catch { // Handle error } } func shareContacts(contacts: [CNContact]) throws { guard let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask).first else { return } var filename = NSUUID().UUIDString // Create a human friendly file name if sharing a single contact. if let contact = contacts.first where contacts.count == 1 { if let fullname = CNContactFormatter().stringFromContact(contact) { filename = fullname.componentsSeparatedByString(" ").joinWithSeparator("") } } let fileURL = directoryURL .URLByAppendingPathComponent(filename) .URLByAppendingPathExtension("vcf") let data = try CNContactVCardSerialization.dataWithContacts(contacts) print("filename: \(filename)") print("contact: \(String(data: data, encoding: NSUTF8StringEncoding))") try data.writeToURL(fileURL, options: [.AtomicWrite]) let activityViewController = UIActivityViewController( activityItems: [fileURL], applicationActivities: nil ) presentViewController(activityViewController, animated: true, completion: {}) } func createContact() -> CNContact { // Creating a mutable object to add to the contact let contact = CNMutableContact() contact.imageData = NSData() // The profile picture as a NSData object contact.givenName = "John" contact.familyName = "Appleseed" let homeEmail = CNLabeledValue(label:CNLabelHome, value:"john@example.com") let workEmail = CNLabeledValue(label:CNLabelWork, value:"j.appleseed@icloud.com") contact.emailAddresses = [homeEmail, workEmail] contact.phoneNumbers = [CNLabeledValue( label:CNLabelPhoneNumberiPhone, value:CNPhoneNumber(stringValue:"(408) 555-0126"))] return contact } 

活动视图控制器显示支持VCard格式的应用程序

在消息应用程序中出现VCard联系人

您可以使用CNContact(需要iOS 9):

 let contact = CNMutableContact() contact.givenName = "John" contact.familyName = "Doe" contact.emailAddresses = [ CNLabeledValue(label: CNLabelWork, value: "john.doe@email.com") ] 

从iOS应用程序创build联系人并共享外部应用程序非常简单。

首先,您需要创build如下所示的Share Button Action

 -(void)shareContactAction:(UIButton*)sender { CNMutableContact *selectedCon = [[CNMutableContact alloc] init]; selectedCon.givenName = @"ABC"; selectedCon.familyName = @"XYZ"; NSString *phoneNum = @"+91-XXXXXXXXXXX" CNLabeledValue *contactNum1 = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:[CNPhoneNumber phoneNumberWithStringValue:phoneNum]]; selectedCon.phoneNumbers = @[contactNum1]; NSString *url=[self saveContactDetailsToDocDir:selectedCon]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[@"Contact", [NSURL fileURLWithPath:url]] applicationActivities:nil]; [self presentViewController:activityViewController animated:YES completion:nil]; } 

在上面的button事件中,您可以调用下面将返回联系人卡片path的function。

 - (NSString *)saveContactDetailsToDocDir:(CNContact *)contact { NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString * contactCardPath = [documentsDirectory stringByAppendingString:@"/vCardName.vcf"]; NSArray *array = [[NSArray alloc] initWithObjects:contact, nil]; NSError *error; NSData *data = [CNContactVCardSerialization dataWithContacts:array error:&error]; [data writeToFile:contactCardPath atomically:YES]; return contactCardPath; }