解决方法
尝试这样做适用于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;
Further Reference Read Apple Docs
更新:
您需要添加关于为什么需要访问您的Apps-Info.plist中的联系人的说明
隐私 – 联系人使用说明
要么
<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中已被弃用,并被新的和改进的Contacts Framework替代