2011-09-08 6 views
2

iPhone에서 vCard 표현을 만들려고합니다. vCard의 문자열 표현을 만들었습니다. 첨부 파일로 메일을 보내기 위해 NSData 형식으로 변환하는 방법을 모르겠습니다. 내가 테스트 이메일을 할 때 첨부 파일을 클릭하면iPhone에서 vCard 만들기

 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"]; 
+0

당신은 하나의 v 카드에 모든 접촉을 얻었습니까? 만약 그렇다면 pls가 그것을 얻고 v 카드를 만드는 방법을 알려줍니다. – parag

답변

1

Dave DeLong의 답변에 완전히 동의합니다. 단지 vCard 파일 (.vcf)을 만들고 app-in 전자 메일 작업에 첨부하기 만했기 때문에 추가하고 싶습니다. 내가 한 것은 vCard 필드가있는 문자열과 임시 파일을 만드는 것입니다. .

내 경우에는 NSManagedObject 하위 클래스에서 -vCardRepresentation 문자열을 반환하는 메서드를 만들었습니다.

Objective-c 카테고리 또는 간단한 프레임 워크가 큰 도움이 될 것입니다. 시간이 지나면 할 수 있습니다.

Wikipedia 페이지 및 vCard (3.0)의 공식 사양이 실제로 도움이됩니다.

업데이트 2 : 앱 완성을 서두르지 만, vCard 데이터를 만들고 여러 곳의 인앱 메일 메시지에 첨부 파일로 추가하려고 했으므로 이제는 별도의 클래스 컨트롤러를 만들었습니다. vCard 구문의 세부 정보를 만들고 숨 깁니다. 그런 다음 첨부 파일로 메일 메시지에 직접 추가 할 vCard 문자열 NSData 버전을 반환하는 메서드가 있습니다. 이것은 훨씬 깨끗한 솔루션이므로 임시 파일 일지라도 파일을 만들 필요가 없습니다. 또한 파일을 만들고 다시 작성하여 데이터를 다시 저장하지 않으려는 경우가 아니라면 NSString 표현을 사용하지 않아도됩니다.

내 컨트롤러 클래스에는 키가 vCard 필드 이름 (예 : FN, TEL 및 ADR) 인 사전에 값을 추가하는 여러 -setXXXX 메서드가 있습니다. 그런 다음 -vCardRepresentation을 호출하면 MFMailComposeViewController의 -addAttachmentData:mimeType:fileName: 메서드에서 직접 사용할 수있는 NSData 개체 (사전 검색을 통해 작성)가 반환됩니다.

내 코드를 정리할 수 있다면 충분히 일반적인 코드이므로 나중에 게시하겠습니다.

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 : 여기 내 코드는 누군가가 시작 도움이 될 수 있어요 주소를 포함해야합니다; 선택적 주소 필드에 대해서도 구분 기호.

+0

안녕하세요 nikunj 한 v 카드에 모든 접촉을 얻었습니까 ??? 그렇다면 pls 어떻게 도와주고 v 카드를 만드는 데 도움이됩니다. – parag

관련 문제