2011-09-08 13 views
2

J'essaie de créer une représentation vCard dans l'iPhone. J'ai créé une représentation de chaîne pour la vCard. Je ne sais pas comment le convertir dans le formulaire NSData afin de l'envoyer en pièce jointe. Voilà ce que j'ai jusqu'à présent:Création d'une vCard dans l'iPhone

 NSString *vCardString = [vCard getVCFString]; // returns string representation for vCard 
     NSData *vCardData = [vCardString dataUsingEncoding:NSUTF8StringEncoding]; 
     [mailController addAttachmentData:vCardData mimeType:@"text/x-vcard" fileName:@"LocationInfo"]; 

Lorsque je clique sur la pièce jointe quand je fais un email de test, il va à la créer de nouveaux contacts/ajouter le contact comme existant. Est-ce correct puisque l'iPhone le reconnaît comme un contact? Je suppose que j'étais intéressé à obtenir les informations de localisation, mais cela ne semble pas apparaître dans ma pièce jointe. Le code pour créer ma représentation VCF est:

vcfString = [[NSMutableString allocWithZone:[self zone]] initWithCapacity:kDefaultStringSize]; 
    [vcfString appendString:@"BEGIN:VCARD\n"]; 
    [vcfString appendString:@"VERSION:3.0\n"]; 
    if (s) { 
     NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", s]; 
     [vcfString appendString:aString]; 
     [aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])]; 
     street = [[NSString allocWithZone:[self zone]] initWithString:aString]; 
     [aString release]; 
    } 
    if (c) { 
     NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", c]; 
     [vcfString appendString:aString]; 
     [aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])]; 
     city = [[NSString allocWithZone:[self zone]] initWithString:aString]; 
     [aString release]; 
    } 
    if (st) { 
     NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", st]; 
     [vcfString appendString:aString]; 
     [aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])]; 
     state = [[NSString allocWithZone:[self zone]] initWithString:aString]; 
     [aString release]; 
    } 
    // TODO: look up semicolon for VCard representation 
    if (z) { 
     NSString *aString = [[NSString alloc] initWithFormat:@"%@\n", z]; 
     [vcfString appendString:aString]; 
     zip = [[NSString allocWithZone:[self zone]] initWithString:aString]; 
     [aString release]; 
    } 
    [vcfString appendString:@"END:VCARD"]; 
+0

vous avez obtenu tous les contacts dans une carte de v? Si oui alors pls m'aider comment l'obtenir et faire une carte v. – parag

Répondre

1

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 les spécifications formelles pour vCard (3.0) sont vraiment utiles. MISE À JOUR 2: Je me dépêche d'obtenir une application complète, mais parce que je voulais créer des données vCard et les ajouter en pièces jointes aux messages de courrier intégré à plusieurs endroits, j'ai maintenant créé un contrôleur de classe distinct fait/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ôleurs a un certain nombre de méthodes -setXXXX 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. Puis, quand j'appelle sa -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 pour l'accumulation de données pour la adresse, qui doit inclure le; séparateur même pour les champs d'adresse facultatifs.

+0

bonjour nikunj avoir obtenir tous les contacts dans une carte v ??? si oui alors pls m'aider comment l'obtenir et faire une carte v. – parag