2013-05-17 1 views
4

내 IOS 응용 프로그램에서 Addressbook을 사용하여 연락처 이름과 번호를 가져 왔지만 일부 연락처의 전화 번호가 표시되는 이상한 일이 발생했습니다.IOS 주소록이 연락처 목록에서 모든 전화 번호를 가져 오지 않았습니다.

전화 번호가있는 모든 연락처 목록이 표시되기를 기대하고있었습니다.

-(void)getAddressbookData 
{ 
    #if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 
     ABAddressBookRef addressBook = ABAddressBookCreate(); 
    #else 
     CFErrorRef *error = nil; 
     ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); 
    #endif 
     NSArray * people; 
     BOOL accessGranted = [self __addressBookAccessStatus:addressBook]; 

     if (accessGranted) 
     { 
      people = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); 
      // Do whatever you need with thePeople... 
     } 
     CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 
     NSMutableArray *contactArray = [[NSMutableArray alloc] init]; 

     for (CFIndex i = 0; i < nPeople; i++) 
     { 
      ABRecordRef record = CFArrayGetValueAtIndex((__bridge CFArrayRef)(people), i); 
      NSString *firstName = (__bridge NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty); 
      NSString *lastName = (__bridge NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty); 
      NSString *fullName = nil; 

      if (ABPersonGetCompositeNameFormat() == kABPersonCompositeNameFormatFirstNameFirst) 
       fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName]; 
      else 
       fullName = [NSString stringWithFormat:@"%@, %@", lastName, firstName]; 

      [contactArray addObject:fullName]; 

      // 
      // Phone Numbers 
      // 
      ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(record, kABPersonPhoneProperty); 
      CFIndex phoneNumberCount = ABMultiValueGetCount(phoneNumbers); 

      NSMutableArray *numbersArray = [[NSMutableArray alloc] init]; 
      for (CFIndex k=0; k<phoneNumberCount; k++) 
      { 
       CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex(phoneNumbers, k); 
       CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex(phoneNumbers, k); 
       CFStringRef phoneNumberLocalizedLabel = ABAddressBookCopyLocalizedLabel(phoneNumberLabel); 
       // converts "_$!<Work>!$_" to "work" and "_$!<Mobile>!$_" to "mobile" 

       // Find the ones you want here 
       // 
       // NSLog(@"-----PHONE ENTRY -> name:%@ : %@ : %@", fullName, phoneNumberLocalizedLabel, phoneNumberValue); 
       [numbersArray addObject:CFBridgingRelease(phoneNumberValue)]; 

       CFRelease(phoneNumberLocalizedLabel); 
       CFRelease(phoneNumberLabel); 
       CFRelease(phoneNumberValue); 
      } 

      // NSLog(@"phone numbers %@", numbersArray); 
      [contactDictionary setObject:numbersArray forKey:fullName]; 

      CFRelease(record); 

     } 

     selectContacts = contactArray; 
     // NSLog(@"dictionary of array %@", contactDictionary); 

     //NSLog(@"contacts count %d", [selectContacts count]); 
    } 

    -(BOOL)__addressBookAccessStatus:(ABAddressBookRef) addressBook 
    { 
     __block BOOL accessGranted = NO; 

     if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6 
      dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

      ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
       accessGranted = granted; 
       dispatch_semaphore_signal(sema); 
      }); 

      dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
      // dispatch_release(sema); 
     } 
     else { // we're on iOS 5 or older 
      accessGranted = YES; 
     } 
     return accessGranted; 
    } 

그래서 numbersArray가 일어나고 왜 몰라 연락처 중 일부에 대한 비어 :

그래서 여기에 전화 번호를 가져 오기 위해 내 코드입니다.

답변

5

전화 번호를 사용해보십시오.

ABAddressBookRef addressBook = ABAddressBookCreate(); 
    NSArray *people = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); 
    for(id person in people){ 
    //fetch multiple phone nos. 
     ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty); 
     for (CFIndex j=0; j < ABMultiValueGetCount(multi); j++) { 
      NSString* phone = (NSString*)ABMultiValueCopyValueAtIndex(multi, j); 
      [numbersArray addObject:phone]; 
      [phone release]; 
     } 
    } 

및 사용하기 전에 배열을 할당해야합니다. 내 주소록과 그 작업을 잘에서 휴대 전화 번호를 액세스하기 위해이 코드를 사용하고

  numbersArray=[[NSMutableArray alloc] init]; 
+0

덕분에이 그것은 당신이'phone' 방출되는 좋은,하지만 당신은'multi' 또는'people' 또는'addressBook'을 방출하지 않는 ... –

+0

환영 친구를 도왔다. 정적 분석기를 통해이를 실행하면 누설이 지적됩니다. '(NSArray *)'와'(NSString *)'의 캐스트를'CFBridgingRelease'로 바꾸면 ARC가 이것을 처리합니다. (또는 OP와 마찬가지로'__bridging_transfer'를 사용하면 똑같은 일을 할 수 있습니다.) 말할 필요도없이 iOS 9에서는'Contacts' 프레임 워크가이 문제를 완전히 없애줍니다. –

+0

을 – Rob

1

있는 viewDidLoad 방법에 ALLOC 배열이 물품.

ABAddressBookRef addressBook = ABAddressBookCreate(); 
CFArrayRef allSources = ABAddressBookCopyArrayOfAllPeople(addressBook); 
for (CFIndex i = 0; i < ABAddressBookGetPersonCount(addressBook); i++) 
    { 
ABRecordRef aSource = CFArrayGetValueAtIndex(allSources,i);  
ABMultiValueRef phones =(NSString*)ABRecordCopyValue(aSource, kABPersonPhoneProperty); 
     NSString* mobileLabel; 

     for(CFIndex i = 0; i < ABMultiValueGetCount(phones); i++) { 

      mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i); 

      if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) 
      { 
       home_mobile = [(NSString*)ABMultiValueCopyValueAtIndex(phones, i) retain]; 

      } 

      if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) 
      { 
       basic_mobile = [(NSString*)ABMultiValueCopyValueAtIndex(phones, i)retain]; 


      } 
      if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMainLabel]) 
      { 
       work_mobile = [(NSString*)ABMultiValueCopyValueAtIndex(phones, i)retain]; 

      } 
     } 

시도해 볼 수 있습니다.

+0

일부 사용자의 전화 번호를받지 못한다고 불평하고 있으므로 전화 번호가 있는지 확인하십시오. 귀하의 주소록에있는 해당 연락처 –

+0

덕분에 그것은 잘 작동합니다. 여전히 ios 버전에 따라 변경해야합니다. –

1

나를 위해 일한 @ 사미르의 대답의 스위프트 버전이 있습니다.

var allNumbers: [AnyObject] = [] 
let adbk : ABAddressBook? = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue() 
let people = ABAddressBookCopyArrayOfAllPeople(adbk).takeRetainedValue() as NSArray as [ABRecord] 
for person in people { 
    var phones: ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue() 
    for j in 0..<ABMultiValueGetCount(phones) { 
     var phone: String = ABMultiValueCopyValueAtIndex(phones, j).takeRetainedValue() as String 
     allNumbers.append(phone) 
    } 
} 
println(allNumbers) 
+0

var adbk 무엇입니까? –