¿Cómo crear un file vCard / vcf para usar en la hoja de resources compartidos?

Soy nuevo en rapidez y los methods que encuentro están en desuso con respecto a mi problema. Estoy creando una aplicación de directory y estoy obteniendo datos de contacto de una API, no de la libreta de direcciones del teléfono.

En iOS, si va a su libreta de direcciones, puede seleccionar un contacto y elegir "Compartir contacto" que muestra una hoja de acciones. Quiero esta funcionalidad exacta en mi aplicación.

Creo que tengo Hojas de cálculo descubiertas, y aquí está mi código para eso:

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

Quiero cambiar "text" as NSString para ser una vCard, ya que ese es el object que iOS comparte desde la libreta de direcciones, ¿verdad? Suponiendo que tengo razón, quiero crear una vCard desde el object de contacto de mi propia aplicación para compartirla en las aplicaciones apropiadas (correo electrónico, sms, etc.).

¿Cómo puedo lograr eso en Swift? Si me equivoco, corrígeme y muéstrame lo que necesito hacer. Gracias.

EDIT: Bien, aquí están mis cambios.

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

y

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

Sin embargo, cuando hago clic en el button Compartir y muestra mi hoja de acciones, selecciono la aplicación que quiero compartir y no agrega / adjunta los datos de contacto según lo previsto. ¿Cómo logro esto?

El truco aquí es save el contacto en un file VCard (.vcf) utilizando CNContactVCardSerialization.dataWithContacts , luego pasar la URL del file al UIActivityViewController . El controller de vista de actividad detecta el formatting de VCard desde la extensión de file y muestra las aplicaciones donde se admite el formatting (por ejemplo, Mensajes, Correo, Notas, Airdrop, etc.)

Ejemplo:

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

Controlador de vista de actividad que muestra aplicaciones compatibles con formato VCard

Contacto de VCard que aparece en la aplicación Mensajes

Puede usar un CNContact (requiere iOS 9):

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

Es muy simple crear contactos desde su aplicación de iOS y compartirlos sobre las aplicaciones externas.

Primero debes crear la Acción del button Compartir como a continuación:

 -(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]; } 

De que puede llamar a la function a continuación que devolverá la ruta de la tarjeta de contacto en el evento del button anterior.

 - (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; }