2010-05-08 5 views
13

J'utilise le AddressBook.framework dans mon application iPhone, et je voudrais reproduire quelque chose dans le sens de la fonctionnalité de partage dans Contacts.app. Cela correspond essentiellement à une vCard de contacts spécifique à un email. Pour autant que je sache, il n'y a rien dans la documentation qui mentionne la génération d'une vCard.Générer vCard à partir AddressBook.framework

Est-ce un cas de générer moi-même? Ou y a-t-il quelque chose de disponible qui peut m'aider?

+2

Voir aussi: http://stackoverflow.com/questions/1552325 Cette question, malheureusement, n'a pas de réponse acceptée. –

Répondre

18

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.

+0

Merci beaucoup! On dirait un début génial. – Oliver

+0

Vous ne l'avez pas testé complètement, mais il semble que le champ GEO n'est pas utilisé dans l'application AddressBook du Mac, lors de l'importation du fichier vCard? Il a ajouté quelque chose comme le suivant au champ de note dans AddressBook: "GEO: 51.34i8rtt". – petert

+1

Ceci est une aide précieuse. Quel type MIME avez-vous utilisé lors de la connexion du NSData? Wikipédia dit "Note: Le texte/vcard du type de média Internet a été utilisé (incorrectement) dans certains documents SyncML pour faire référence à vCard 3.0, et l'exemple a été suivi dans diverses implémentations.". – Oliver

5

Il ne semble pas y avoir de code publié pour cela. La version Mac de AddressBook.framework a un ABPersonCopyVCardRepresentation(), mais il n'y a pas d'équivalent sur l'iPhone. Il est probablement préférable de prendre un analyseur/générateur existant (tel que PEAR builder et parser) et de les traduire en Objective-C.

Une autre option pourrait être d'écrire votre propre constructeur. La grammaire des vCards n'est pas difficile.

5

Here Vous pouvez télécharger du code qui génère une vCard.

+0

Veuillez fournir un exemple d'application en utilisant ce code. Merci d'avance. –

Questions connexes