Полностью согласен с ответом Дэйва ДеЛонга. Просто хочу добавить, что, поскольку я просто хотел создать файл vCard (.vcf) и прикрепить его к действию электронной почты в приложении, я создал строку, а затем временный файл со всеми полями vCard, для которых у меня были данные .
В моем случае я создал метод в своем подклассе NSManagedObject для возврата строки -vCardRepresentation.
Была бы полезна категория Objective-c или простая структура - я мог бы сделать это, когда время.
Страница Википедии и официальная спецификация для vCard (3.0) действительно помогают.
ОБНОВЛЕНИЕ 2: Я спешу завершить приложение, но поскольку я действительно хотел создать данные vCard и добавить их в качестве вложений в почтовые сообщения в приложении в нескольких местах, я теперь создал отдельный контроллер класса, который делает / скрывает детали синтаксиса vCard. Тогда у меня просто есть метод, который возвращает NSData-версию строки vCard для добавления непосредственно к почтовому сообщению в качестве вложения. Это гораздо более чистое решение, вам не нужно создавать какие-либо файлы, даже если они были только временными. Кроме того, вам все равно не нужно представление данных NSString, если только вы не хотите создать файл и использовать его более одного раза, чтобы сохранить повторное создание данных?
В моем классе контроллеров есть несколько методов -setXXXX, которые добавляют значения в словарь, где ключами являются строки с именами полей vCard, например, FN, TEL и ADR. Затем, когда я вызываю его -vCardRepresentation, он теперь возвращает объект NSData (созданный путем сканирования словаря), который можно использовать непосредственно в методе MFMailComposeViewController -addAttachmentData: mimeType: fileName: .
Если я смогу привести в порядок свой код, поэтому он достаточно универсален, я опубликую его позже.
ОБНОВЛЕНИЕ: Вот мой код, он может помочь кому-то начать:
- (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;
}
Очевидно, что я делаю ссылку на свойства в моем классе, плюс метод с именем -addressWithSeparator для создания данных для адреса, который должен включать в себя; разделитель даже для необязательных полей адреса.