IOS地址簿不是从联系人列表中获取所有的电话号码

我在我的iOS应用程序中使用Addressbook来获取联系人姓名和号码,但是一个奇怪的事情发生,它显示了一些联系人的电话号码。

我希望它会显示与电话号码的所有联系人列表。

所以这里是我的代码来获取电话号码:

 -(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是空白的一些联系人我不知道为什么发生。

试试这个电话号码。

  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]; } } 

你必须在使用之前分配你的数组。 在viewDidLoad方法中写入alloc数组

  numbersArray=[[NSMutableArray alloc] init]; 

我正在使用此代码来访问我的地址簿中的手机号码,并正常工作。

 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]; } } 

你可以试试这个

这是@Samir的答案Swift版本为我工作。

 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)