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.
Siehe auch: http://stackoverflow.com/questions/1552325 Diese Frage hat leider keine akzeptierte Antwort. –