Создание визитной карточки в iPhone - PullRequest
2 голосов
/ 08 сентября 2011

Я пытаюсь создать представление vCard в iPhone.Я создал строковое представление для vCard.Я не уверен, как преобразовать это в форму NSData для отправки по почте как приложение.Это то, что у меня есть до сих пор:

        NSString *vCardString = [vCard getVCFString]; // returns string representation for vCard
        NSData *vCardData = [vCardString dataUsingEncoding:NSUTF8StringEncoding];
        [mailController addAttachmentData:vCardData mimeType:@"text/x-vcard" fileName:@"LocationInfo"];

Когда я нажимаю на вложение, когда я пишу тестовое письмо, оно переходит к созданию нового контакта / добавлению в качестве существующего контакта.Это правильно, так как iPhone распознает его как контакт?Я предполагаю, что был заинтересован в том, чтобы получить информацию о местоположении из этого, но это, казалось, не показывалось в моем приложении.Код для создания моего представления VCF:

vcfString = [[NSMutableString allocWithZone:[self zone]] initWithCapacity:kDefaultStringSize];
    [vcfString appendString:@"BEGIN:VCARD\n"];
    [vcfString appendString:@"VERSION:3.0\n"];
    if (s) {
        NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", s];
        [vcfString appendString:aString];
        [aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])];
        street = [[NSString allocWithZone:[self zone]] initWithString:aString];
        [aString release];
    }
    if (c) {
        NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", c];
        [vcfString appendString:aString];
        [aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])];
        city = [[NSString allocWithZone:[self zone]] initWithString:aString];
        [aString release];
    }
    if (st) {
        NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"%@;", st];
        [vcfString appendString:aString];
        [aString replaceOccurrencesOfString:@";" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [aString length])];
        state = [[NSString allocWithZone:[self zone]] initWithString:aString];
        [aString release];
    }
    // TODO: look up semicolon for VCard representation
    if (z) {
        NSString *aString = [[NSString alloc] initWithFormat:@"%@\n", z];
        [vcfString appendString:aString];
        zip = [[NSString allocWithZone:[self zone]] initWithString:aString];
        [aString release];
    }
    [vcfString appendString:@"END:VCARD"];

1 Ответ

1 голос
/ 08 сентября 2011

Полностью согласен с ответом Дэйва ДеЛонга. Просто хочу добавить, что, поскольку я просто хотел создать файл 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 для создания данных для адреса, который должен включать в себя; разделитель даже для необязательных полей адреса.

...