Totalement d'accord avec la réponse de Dave DeLong. Je veux simplement ajouter que puisque je voulais simplement créer un fichier vCard (.vcf) et l'attacher à une action e-mail intégrée, j'ai créé une chaîne, puis un fichier temporaire, avec tous les champs vCard pour lesquels j'avais des données .
Dans mon cas, j'ai fait une méthode dans ma sous-classe NSManagedObject
pour retourner une chaîne -vCardRepresentation
.
Une catégorie Objective-c ou un cadre simple serait d'une grande aide - je pourrais le faire quand le temps.
La page Wikipedia et la spécification formelle pour vCard (3.0) aident vraiment.
MISE À JOUR 3: Si vous utilisez iOS 5 ou plus tard il y a maintenant une fonction ABPerson
qui peut renvoyer la représentation vCard des enregistrements personnels donnés:
CFDataRef ABPersonCreateVCardRepresentationWithPeople(CFArrayRef people);
MISE À JOUR 2: Je Je me suis précipité pour obtenir une application complète, mais parce que je voulais créer des données vCard et les ajouter comme pièces jointes aux messages de courrier électronique dans plusieurs applications, j'ai maintenant créé un contrôleur de classe distinct qui rend/cache les détails de la syntaxe vCard . Ensuite, j'ai juste une méthode qui retourne une version NSData de la chaîne vCard à ajouter directement à un message en pièce jointe. C'est une solution beaucoup plus propre, vous n'avez pas besoin de créer des fichiers, même s'ils étaient temporaires. De plus, vous n'avez pas vraiment besoin d'une représentation NSString des données, à moins que vous ne vouliez créer un fichier et l'utiliser plus d'une fois pour sauvegarder la recréation des données?
Ma classe de contrôleur a un nombre de -setXXXX
méthodes qui ajoutent des valeurs à un dictionnaire où les clés sont des chaînes avec les noms de champ vCard, comme FN, TEL et ADR. Ensuite, quand j'appelle -vCardRepresentation
, cela retourne maintenant un objet NSData (construit en analysant le dictionnaire) qui peut être utilisé directement dans la méthode -addAttachmentData:mimeType:fileName: de MFMailComposeViewController.
Si je peux ranger mon code, c'est assez générique, je le posterai plus tard.
MISE À JOUR: Voici mon code, il peut aider quelqu'un commencer:
- (NSString *)vCardRepresentation
{
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
[mutableArray addObject:@"BEGIN:VCARD"];
[mutableArray addObject:@"VERSION:3.0"];
[mutableArray addObject:[NSString stringWithFormat:@"FN:%@", self.name]];
[mutableArray addObject:[NSString stringWithFormat:@"ADR:;;%@",
[self addressWithSeparator:@";"]]];
if (self.phone != nil)
[mutableArray addObject:[NSString stringWithFormat:@"TEL:%@", self.phone]];
[mutableArray addObject:[NSString stringWithFormat:@"GEO:%g;%g",
self.latitudeValue, self.longitudeValue]];
[mutableArray addObject:[NSString stringWithFormat:@"URL:http://%@",
self.website]];
[mutableArray addObject:@"END:VCARD"];
NSString *string = [mutableArray componentsJoinedByString:@"\n"];
[mutableArray release];
return string;
}
Évidemment, je fais référence à des propriétés dans ma classe, en plus d'une méthode appelée -addressWithSeparator
à l'accumulation de données pour l'adresse, qui doit inclure le; séparateur même pour les champs d'adresse facultatifs.
Voir aussi: http://stackoverflow.com/questions/1552325 Cette question, malheureusement, n'a pas de réponse acceptée. –