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