在iOS中检索所有联系人电话号码

到目前为止,我看到了方法来获取多个电话号码,如果我显示一个select器,以便用户可以select人,然后获得电话号码。 我想要的是检索所有联系人的号码。 这甚至有可能吗?

试试这适用于iOS 6以及iOS 5.0或更高版本

示例项目演示

首先添加链接二进制库与以下框架

  • AddressBookUI.framework
  • AddressBook.framework

然后导入

#import <AddressBook/ABAddressBook.h> #import <AddressBookUI/AddressBookUI.h> 

然后使用下面的代码

请求访问地址簿的权限

 ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); __block BOOL accessGranted = NO; if (&ABAddressBookRequestAccessWithCompletion != NULL) { // We are on iOS 6 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { accessGranted = granted; dispatch_semaphore_signal(semaphore); }); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_release(semaphore); } else { // We are on iOS 5 or Older accessGranted = YES; [self getContactsWithAddressBook:addressBook]; } if (accessGranted) { [self getContactsWithAddressBook:addressBook]; } 

从地址簿中检索联系人

 // Get the contacts. - (void)getContactsWithAddressBook:(ABAddressBookRef )addressBook { contactList = [[NSMutableArray alloc] init]; CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); for (int i=0;i < nPeople;i++) { NSMutableDictionary *dOfPerson=[NSMutableDictionary dictionary]; ABRecordRef ref = CFArrayGetValueAtIndex(allPeople,i); //For username and surname ABMultiValueRef phones =(__bridge ABMultiValueRef)((__bridge NSString*)ABRecordCopyValue(ref, kABPersonPhoneProperty)); CFStringRef firstName, lastName; firstName = ABRecordCopyValue(ref, kABPersonFirstNameProperty); lastName = ABRecordCopyValue(ref, kABPersonLastNameProperty); [dOfPerson setObject:[NSString stringWithFormat:@"%@ %@", firstName, lastName] forKey:@"name"]; //For Email ids ABMutableMultiValueRef eMail = ABRecordCopyValue(ref, kABPersonEmailProperty); if(ABMultiValueGetCount(eMail) > 0) { [dOfPerson setObject:(__bridge NSString *)ABMultiValueCopyValueAtIndex(eMail, 0) forKey:@"email"]; } //For Phone number NSString* mobileLabel; for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) { mobileLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(phones, j); if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) { [dOfPerson setObject:(__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, j) forKey:@"phone"]; } else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { [dOfPerson setObject:(__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, j) forKey:@"phone"]; break ; } } [contactList addObject:dOfPerson]; } NSLog(@"Contacts = %@",contactList); } 

回顾其他信息

 // All Personal Information Properties kABPersonFirstNameProperty; // First name - kABStringPropertyType kABPersonLastNameProperty; // Last name - kABStringPropertyType kABPersonMiddleNameProperty; // Middle name - kABStringPropertyType kABPersonPrefixProperty; // Prefix ("Sir" "Duke" "General") - kABStringPropertyType kABPersonSuffixProperty; // Suffix ("Jr." "Sr." "III") - kABStringPropertyType kABPersonNicknameProperty; // Nickname - kABStringPropertyType kABPersonFirstNamePhoneticProperty; // First name Phonetic - kABStringPropertyType kABPersonLastNamePhoneticProperty; // Last name Phonetic - kABStringPropertyType kABPersonMiddleNamePhoneticProperty; // Middle name Phonetic - kABStringPropertyType kABPersonOrganizationProperty; // Company name - kABStringPropertyType kABPersonJobTitleProperty; // Job Title - kABStringPropertyType kABPersonDepartmentProperty; // Department name - kABStringPropertyType kABPersonEmailProperty; // Email(s) - kABMultiStringPropertyType kABPersonBirthdayProperty; // Birthday associated with this person - kABDateTimePropertyType kABPersonNoteProperty; // Note - kABStringPropertyType kABPersonCreationDateProperty; // Creation Date (when first saved) kABPersonModificationDateProperty; // Last saved date // All Address Information Properties kABPersonAddressProperty; // Street address - kABMultiDictionaryPropertyType kABPersonAddressStreetKey; kABPersonAddressCityKey; kABPersonAddressStateKey; kABPersonAddressZIPKey; kABPersonAddressCountryKey; kABPersonAddressCountryCodeKey; 

更多参考阅读Apple Docs

更新:您需要添加关于为什么您需要访问您的Apps-Info.plist的联系人的描述

Privacy - Contacts Usage Description

要么

 <key>NSContactsUsageDescription</key> <string>Write the reason why your app needs the contact.</string> 

获取用户图像。

 UIImage *contactImage; if(ABPersonHasImageData(ref)){ contactImage = [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageData(ref)]; } 

注意:

AddressBook框架在iOS 9被弃用,并被新的和改进的联系人框架取代

  • AddressBookUI.framework
  • AddressBook.framework

    这两个框架在iOS 9中不推荐使用

    —>苹果介绍

  • 联系框架
  • ContactUI框架

这里是上传代码使用最新的框架。

获取地址簿的权限或通知用户需要更改其设置中的权限。

 CGFloat iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if(iOSVersion >= 6.0) { // Request authorization to Address Book addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { //start importing contacts if(addressBookRef) CFRelease(addressBookRef); }); } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { // The user has previously given access, add the contact //start importing contacts if(addressBookRef) CFRelease(addressBookRef); } else { // The user has previously denied access // Send an alert telling user to change privacy setting in settings app UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unable to Access" message:@"Grant us access now!" delegate:self cancelButtonTitle:@"Not Now" otherButtonTitles:@"I'll Do It!", nil]; [alert show]; if(addressBookRef) CFRelease(addressBookRef); } } else { addressBookRef = ABAddressBookCreate(); //start importing contacts if(addressBookRef) CFRelease(addressBookRef); } 

获取logging

 CFArrayRef records = ABAddressBookCopyArrayOfAllPeople(addressBook); NSArray *contacts = (__bridge NSArray*)records; CFRelease(records); for(int i = 0; i < contacts.count; i++) { ABRecordRef record = (__bridge ABRecordRef)[contacts objectAtIndex:i]; } 

获取电话号码

  ABMultiValueRef phonesRef = ABRecordCopyValue(recordRef, kABPersonPhoneProperty); if(phonesRef) { count = ABMultiValueGetCount(phonesRef); for(int ix = 0; ix < count; ix++){ CFStringRef typeTmp = ABMultiValueCopyLabelAtIndex(phonesRef, ix); CFStringRef numberRef = ABMultiValueCopyValueAtIndex(phonesRef, ix); CFStringRef typeRef = ABAddressBookCopyLocalizedLabel(typeTmp); NSString *phoneNumber = (__bridge NSString *)numberRef; NSString *phoneType = (__bridge NSString *)typeRef; if(typeTmp) CFRelease(typeTmp); if(numberRef) CFRelease(numberRef); if(typeRef) CFRelease(typeRef); } CFRelease(phonesRef); } 

请记住,有些人在手机上有2万个联系人。 如果您打算这样做,您可能需要multithreading处理。

你当然可以。 首先,您需要获得用户的许可。 如果你不会用户将不得不从设置手动授权您的应用程序。 这里有一个很好的例子来说明如何检索所有电话号码,姓名,地址等。