2012-01-12 3 views
2

XCode 4.2를 사용하여 응용 프로그램을 개발 중이며 initWithVCardRepresentation 및/또는 ABPersonCreatePeopleInSourceWithVCardRepresentation을 사용하여 ABPerson을 만들려고하고 있지만 작동 예제를 찾을 수 없습니다. 누군가 도울 수 있습니까?VCard 표현을 사용하여 사람을 만들 수 없습니다.

내가있는 NSString 형식으로 vCard를 얻을 ....

감사

답변

1

내가 포럼에 어딘가에 발견이 코드를 사용하고 있습니다 :

// Assuming your vCard is stored in vCardString as an NSString 
CFDataRef vCardData = (__bridge CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding]; 
ABAddressBookRef book = ABAddressBookCreate(); 
ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book); 
CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData); 
CFIndex index = 0; 
ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index); 
2

을 이것은 가득 예를 들어 완벽하게 작동하면 최신 iOS 8을 기반으로합니다.

먼저 권한 부여 상태를 확인하고 그렇지 않은 경우 액세스 권한을 요청한 다음 vcard를 저장하고 r 아래 eview 코드 :

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){ 
     NSLog(@"Authorized"); 
     [self addVcardsIntoAddressBook:vcard]; 
    } else{ 
     NSLog(@"Not determined"); 
     ABAddressBookRequestAccessWithCompletion(ABAddressBookCreateWithOptions(NULL, nil), ^(bool granted, CFErrorRef error) { 
      if (!granted){ 
       NSLog(@"Just denied"); 
       return; 
      } 
      NSLog(@"Just authorized"); 
      [self addVcardsIntoAddressBook:vcard]; 
     }); 
    } 

이 vCard를 추가하는 방법입니다 :

- (void)addVcardsIntoAddressBook:(NSData *)vcard { 
    CFDataRef vCardData = CFDataCreate(NULL, [vcard bytes], [vcard length]); 
    ABAddressBookRef book = ABAddressBookCreate(); 
    ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book); 
    CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData); 
    for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) { 
     ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index); 
     ABAddressBookAddRecord(book, person, NULL); 
     CFRelease(person); 
    } 
    ABAddressBookSave(book, NULL); 

} 여기

2

acoustic의 대답 스위프트 버전입니다;

 let vCard : NSData // vcard 

     let addressBook: ABAddressBook? = ABAddressBookCreateWithOptions(nil, nil)?.takeRetainedValue() 

       ABAddressBookRequestAccessWithCompletion(addressBook) { 
         granted, error in 

         if !granted { 
          return 
         } 

        let vCardData = CFDataCreate(nil, UnsafePointer<UInt8>(vCard.bytes), vCard.length) 
        let defaultSource = ABAddressBookCopyDefaultSource(addressBook) 
        let vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource.takeUnretainedValue(), vCardData).takeRetainedValue() as NSArray 

        for person in vCardPeople { 

         ABAddressBookAddRecord(addressBook, person, nil) 

        } 

        let isSaved = ABAddressBookSave(addressBook, nil) 
        if isSaved{ 
         //succesfully saved 
        } 
        else{ 
         //not saved 
        } 
     } 
+0

은 addrressBook이어야합니까? 나는 또한 내장 된 오류 '변수'의 vCard가 '하자 점점 오전 vCard를 :있는 NSData는 // vCard를 vCard를 = 코드 '형식의 값 'NSData'' 에 유형'문자열 '의 값을 할당 할 수 없습니다 어떻게 내가 readableObject 캐스팅 .stringValue를 readableObject NSData에 ?? – alex

+0

문자열을 스캔하여 NSData로 변환해야합니다. func foundCode (code : String) { print ("스캔 한 vCard 정보 \ (코드)") // 시작 vCard : NSData // vcard vCard = 코드 let addressBook : ABAddressBook? = ABAddressBookCreateWithOptions (nil, nil)?. takeRetainedValue()' – alex

+0

[링크] (http://stackoverflow.com/questions/901357/how-do-i-convert-an-nsstring-value- to-nsdata) 나는 지금 내 자신의 질문을 게시합니다 – alex

0

나는 그것을 사용하고 있으며 vCard를 2.1으로 잘 작동하고 3.0

있는 NSString * 파일 이름 =되어 [[NSBundle mainBundle] pathForResource : @ "연락처"ofType을 : @ "VCF를"]; NSLog (@ "열린 파일 % @", 파일 이름); NSData * stringData = [NSData dataWithContentsOfFile : filename]; NSString * vCardString = [[NSString alloc] initWithData : stringData 인코딩 : NSUTF8StringEncoding];

CFDataRef vCardData = (__bridge CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding]; 

ABAddressBookRef book = ABAddressBookCreate(); 
ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book); 
CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData); 
for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) { 
    ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index); 
    ABAddressBookAddRecord(book, person, NULL); 
} 

CFRelease(vCardPeople); 
CFRelease(defaultSource); 
ABAddressBookSave(book, NULL); 
CFRelease(book); 
관련 문제