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