본문 바로가기
1_ 맛있는프로그래밍/Objective C

[Objective C] 주소록에서 전화번호 가져오기

by 준환이형님 2011. 5. 26.

카카오톡에서 번호를 자동으로 등록시키는 걸 보고  API가 있을꺼라고 생각했었죠

이걸 찾느라 얼마나 고생했는데.. 정말 최고의 펌포스팅이라고 자신합니다.. ㅠ


출처 : messace님 블로그 http://messace.tistory.com/56

아이폰의 주소록에는 이름, 이미지, 전화번호, 기념일, 주소, 기타등이 있으며 이는 구조체 형식으로 추출하여
사용할 수 있습니다.
아래 코드는 이중 전화번호와 라벨출력을 하는것이며 나머지 다른것에 관한것도 이와 같은 방법입니다.

아이폰의 주소록의 데이터를 사용하기 위해서는 우선 Frameworks를 추가해야 합니다.
AddressBook.framework를 추가 하시고 AddressBook.h 헤더파일을 import합니다.


// 주소록 프레임웍 헤더파일.
#import <AddressBook/AddressBook.h>
 
 
 
//===================================================//
// 주소록의 모든 정보를 구조체에 저장을 합니다.
//===================================================//
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
 
 
//===================================================//
// 저장된 구조체를 돌면서 해당 데이터를 추출해 옵니다.
//===================================================//
for (int i = 0; i < nPeople ; i++) {
    ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
    CFStringRef firstName = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
    CFStringRef lastName = ABRecordCopyValue(ref, kABPersonLastNameProperty);
    NSNumber *recordId = [NSNumber numberWithInteger: ABRecordGetRecordID(ref)];
     
    NSLog(@"Name : %d-%@ %@", recordId, (firstName != nil) ? (NSString *)firstName : @"",
        (lastName != nil) ? (NSString *)lastName : @"");
     
    if (firstName != nil)
        CFRelease(firstName);
    if (lastName != nil)
        CFRelease(lastName);
 
 
        // 사진이미지는 여기에 넘어옵니다.
    if (ABPersonHasImageData(ref)) {
        // UIImage* image = [UIImage imageWithData:
                //        (NSData *)ABPersonCopyImageData(ref)];
        // image를 저장하는 펑션은 여기에 작성하시면 됩니다.
    }
 
 
    //========================================================//
    // 전화번호 구조체 및 카테고리 저장/추출
    // 전화번호 구조체에는 전화번호와 집전화, 핸드폰 이런 카테고리 구분이 있으며
    // 이것은 Label로 구별합니다.
    // Label : kABHomeLabel, kABPersonPhoneIPhoneLabel 등등...
    //=======================================================//
    ABMultiValueRef phoneNums =
    (ABMultiValueRef)ABRecordCopyValue(ref, kABPersonPhoneProperty);
    for (CFIndex j = 0; j < ABMultiValueGetCount(phoneNums); j++) {
         CFStringRef label = ABMultiValueCopyLabelAtIndex(phoneNums, j);
         CFStringRef tempRef = (CFStringRef)ABMultiValueCopyValueAtIndex(phoneNums, j);
         
        // 전화번호의 형태라벨별로 추출. 다른 형식도 이렇게 추출이 됩니다.
        if (CFStringCompare(label, kABPersonPhoneMobileLabel, 0) ==
                        kCFCompareEqualTo) {
            if (tempRef != nil)
                NSLog(@"Mobile: %@-%d", (NSString *)tempRef,i);
         } else if (CFStringCompare(label, kABPersonPhoneIPhoneLabel, 0) ==
                        kCFCompareEqualTo) {
            if (tempRef != nil)
                NSLog(@"iPhone: %@-%d", (NSString *)tempRef,i);
        } else if (CFStringCompare(label, kABHomeLabel, 0) ==
                        kCFCompareEqualTo) {
            if (tempRef != nil)
                NSLog(@"Home:  %@-%d", (NSString *)tempRef,i);
        }
         
        CFRelease(label);
        CFRelease(tempRef);
    }
}
CFRelease(allPeople);