Создайте vCard из AddressBook.framework

Я использую AddressBook.framework в своем приложении для iPhone, и я хотел бы воспроизвести что-то в соответствии с возможностями share в Contacts.app. Это в основном прикрепляет специальные контакты vCard к электронному письму. Насколько я знаю, в документации нет ничего, что упоминает о создании vCard.

Является ли это случаем генерации одного? Или есть что-то доступное, которое может мне помочь?

Ответы

Ответ 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 для создания данных для адреса, который должен включать; разделитель даже для дополнительных полей адреса.

Ответ 2

Для этого не существует общедоступного кода. Mac-версия AddressBook.framework имеет ABPersonCopyVCardRepresentation(), но на iPhone нет эквивалента.

Вероятно, лучшим вариантом было бы взять существующий парсер/строитель (например, PEAR builder и парсер) и перевести их на Objective-C.

Другим вариантом может быть создание собственного построителя. Грамматика для vCards не сложна.

Ответ 3

Здесь вы можете загрузить код, который генерирует vCard.