2010-05-08 7 views
13

Ich verwende das AddressBook.framework in meiner iPhone App, und ich möchte etwas in der Art der Freigabefunktion in Contacts.app replizieren. Dies ist im Grunde eine bestimmte Kontakte vCard an eine E-Mail anhängen. Soweit ich weiß, gibt es in der Dokumentation nichts, was die Erstellung einer vCard erwähnt.vCard aus AddressBook.framework generieren

Ist dies ein Fall der Generierung eines selbst? Oder gibt es etwas, das mir helfen kann?

+2

Siehe auch: http://stackoverflow.com/questions/1552325 Diese Frage hat leider keine akzeptierte Antwort. –

Antwort

18

Stimmen Sie völlig mit der Antwort von Dave DeLong überein. Ich möchte nur hinzufügen, dass, da ich einfach eine vCard-Datei (.vcf) erstellen und an eine In-App-E-Mail-Aktion anhängen wollte, was ich getan habe, eine Zeichenfolge, dann eine temporäre Datei mit allen vCard-Feldern, für die ich Daten hatte .

In meinem Fall habe ich eine Methode in meiner Unterklasse, um eine -vCardRepresentation Zeichenfolge zurückgegeben.

Eine Objective-C-Kategorie oder ein einfaches Framework wäre eine große Hilfe - ich könnte es tun, wenn es Zeit ist. Die Wikipedia Seite und die formale Spezifikation für vCard (3.0) helfen wirklich.

UPDATE 3: Wenn Sie mit iOS 5 oder höher gibt es jetzt eine Funktion in ABPerson, das die vCard-Darstellung der gegebenen Person Datensätze zurückgeben kann:

CFDataRef ABPersonCreateVCardRepresentationWithPeople(CFArrayRef people); 

UPDATE 2: Ich Ich wollte, dass eine App fertig ist, aber weil ich vCard-Daten erstellen und sie als Anhänge an In-App-E-Mail-Nachrichten an mehreren Stellen hinzufügen wollte, habe ich jetzt einen separaten Klassencontroller eingerichtet, der die Details der vCard-Syntax ein-/ausblendet . Dann habe ich nur eine Methode, die eine NSData-Version der vCard-Zeichenfolge zurückgibt, um eine E-Mail-Nachricht direkt als Anhang hinzuzufügen. Dies ist eine viel sauberere Lösung, Sie müssen keine Dateien erstellen, auch wenn sie nur temporär waren. Außerdem benötigen Sie keine NSString-Darstellung der Daten, es sei denn, Sie wollten eine Datei erstellen und mehrfach verwenden, um die erneute Erstellung der Daten zu speichern.

Meine Controller-Klasse verfügt über eine Reihe von -setXXXX Methoden, die Werte zu einem Wörterbuch hinzufügen, in dem die Schlüssel Zeichenfolgen mit den vCard-Feldnamen wie FN, TEL und ADR sind. Dann, wenn ich seine -vCardRepresentation aufrufen, gibt dies jetzt ein NSData-Objekt (durch das Scannen des Wörterbuchs erstellt) zurück, das direkt in MFMailComposeViewControllers -addAttachmentData:mimeType:fileName:-Methode verwendet werden kann.

Wenn ich meinen Code aufräumen kann, so ist es generisch genug, werde ich es später veröffentlichen.

UPDATE: Hier ist mein Code, es könnte jemand den Einstieg erleichtern:

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

Offensichtlich zu Immobilien in meiner Klasse Ich mache Referenz, sowie ein Verfahren -addressWithSeparator zum Aufbau der Daten gefordert die Adresse, die die einschließen muss; Trennzeichen auch für optionale Adressfelder.

+0

Vielen Dank! Sieht nach einem tollen Start aus. – Oliver

+0

Haben Sie das nicht vollständig getestet, aber sieht so aus, als ob das GEO-Feld nicht in der AddressBook-App des Mac verwendet wird, wenn Sie die vCard-Datei importieren? Es fügte dem Notizfeld in AddressBook wie folgt Folgendes hinzu: "GEO: 51.34i8rtt". – petert

+1

Das ist eine große Hilfe. Welchen MIME-Typ haben Sie beim Anhängen der NSData verwendet? Wikipedia sagt "Hinweis: Der Internet-Medientyp text/vcard wurde (inkorrekt) in einigen SyncML-Dokumentationen verwendet, um auf vCard 3.0 zu verweisen, und das Beispiel wurde in verschiedenen Implementierungen verfolgt." – Oliver

5

Es scheint keinen öffentlich geposteten Code dafür zu geben. Die Mac-Version von AddressBook.framework hat eine ABPersonCopyVCardRepresentation(), aber es gibt keine Entsprechung auf dem iPhone.

Wahrscheinlich wäre Ihre beste Wette, einen vorhandenen Parser/Builder (wie die PEAR builder und parser) zu nehmen und sie in Objective-C zu übersetzen.

Eine andere Möglichkeit könnte sein, einen eigenen Builder zu schreiben. Die Grammatik für vCards ist nicht schwierig.

5

Here können Sie Code herunterladen, der vCard generiert.

+0

Bitte geben Sie eine Beispielanwendung mit diesem Code an. Danke im Voraus. –