Comment créer un file vCard / vcf à utiliser dans une feuille de partage?

Je suis novice et les methods que je trouve sont obsolètes en ce qui concerne mon problème. Je construis une application d'annuaire et je tire des données de contact d'une API, pas du carnet d'adresses du téléphone.

Dans iOS, si vous accédez à votre carnet d'adresses, vous pouvez sélectionner un contact et choisir "Partager le contact", ce qui permet d'afficher une feuille de partage. Je veux cette fonctionnalité exacte dans mon application.

Je pense que Share Sheets a compris, et voici mon code pour ça:

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

Je veux changer le "text" as NSSsortingng pour être une vCard, car c'est l'object que iOS partage du carnet d'adresses, non? En supposant que j'ai raison, je veux créer une vCard à partir de l'object de contact de ma propre application afin de la partager avec les applications appropriées (email, sms, etc.).

Comment puis-je y parvenir dans Swift? Si je me trompe, corrigez-moi et montrez-moi ce que je dois faire. Merci.

EDIT: Ok, voici mes changements.

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

et

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

Cependant, lorsque je clique sur le button de partage et qu'il affiche ma feuille de partage, je sélectionne l'application à laquelle je souhaite partager et elle n'ajoute / ne joint pas datatables de contact comme prévu. Comment puis-je accomplir cela?

L'astuce ici est de sauvegarder le contact dans un file VCard (.vcf) en utilisant CNContactVCardSerialization.dataWithContacts , puis de passer l'URL du file à UIActivityViewController . Le controller de vue d'activité détecte le format VCard à partir de l'extension de file et affiche les applications où le format est pris en charge (par exemple, messages, courrier, notes, largage, etc.)

Exemple:

 @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().UUIDSsortingng // Create a human friendly file name if sharing a single contact. if let contact = contacts.first where contacts.count == 1 { if let fullname = CNContactFormatter().ssortingngFromContact(contact) { filename = fullname.componentsSeparatedBySsortingng(" ").joinWithSeparator("") } } let fileURL = directoryURL .URLByAppendingPathComponent(filename) .URLByAppendingPathExtension("vcf") let data = try CNContactVCardSerialization.dataWithContacts(contacts) print("filename: \(filename)") print("contact: \(Ssortingng(data: data, encoding: NSUTF8SsortingngEncoding))") 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:"[email protected]") let workEmail = CNLabeledValue(label:CNLabelWork, value:"[email protected]") contact.emailAddresses = [homeEmail, workEmail] contact.phoneNumbers = [CNLabeledValue( label:CNLabelPhoneNumberiPhone, value:CNPhoneNumber(ssortingngValue:"(408) 555-0126"))] return contact } 

Contrôleur de vue d'activité affichant les applications prenant en charge le format VCard

Le contact VCard apparaît dans l'application Messages

Vous pouvez utiliser un CNContact (nécessite iOS 9):

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

Il est très simple de créer un contact à partir de votre application iOS et de partager sur les applications externes.

D'abord vous devez créer l' action de button de partage comme ci-dessous: –

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

Que vous pouvez appeler la fonction ci-dessous qui va returnner le path de la carte de contact dans l'événement button ci-dessus.

 - (NSSsortingng *)saveContactDetailsToDocDir:(CNContact *)contact { NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentsDirectory = [paths objectAtIndex:0]; NSSsortingng * contactCardPath = [documentsDirectory ssortingngByAppendingSsortingng:@"/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; }