iOS 6的地址簿不起作用?

我从地址簿中以编程方式检索电子邮件地址的方法似乎不再适用于iOS 6设备。 它在iOS 5中工作,奇怪,仍然在iOS 6模拟器中工作。 有没有一种新的方式来从用户的地址簿中编程检索联系人?

ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); self.contacts = [[NSMutableArray alloc] init]; int contactIndex = 0; for (int i = 0; i < nPeople; i++) { // Get the next address book record. ABRecordRef record = CFArrayGetValueAtIndex(allPeople, i); // Get array of email addresses from address book record. ABMultiValueRef emailMultiValue = ABRecordCopyValue(record, kABPersonEmailProperty); NSArray *emailArray = (__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue); [self.contacts addObject:emailArray]; } 

为了澄清,上面不会崩溃,它只是返回没有结果。 ABAddressBookCopyArrayOfAllPeople为空。 谢谢!

可能与iOS 6以上的新隐私控制有关,在设备上,应用程序无法在未经其许可的情况下访问用户的联系人。 从文档:

在iOS 6.0及更高版本中,如果调用方无法访问“地址簿”数据库:

•对于与iOS 6.0及更高版本链接的应用程序,此函数返回NULL。

•对于与以前版本的iOS链接的应用程序,此函数返回一个空的只读数据库。

如果你没有看到权限提示出现(“SomeApp想要访问你的联系人”),那么直接地址簿API可能只是假设他们没有访问权限而且自动失败; 你可能不得不从AddressBookUI框架中显示一些东西来触发它。

我创build了一个帮助类AddressBookHelper来处理向后兼容性。 这是胆量:

 -(BOOL)isABAddressBookCreateWithOptionsAvailable { return &ABAddressBookCreateWithOptions != NULL; } -(void)loadContacts { ABAddressBookRef addressBook; if ([self isABAddressBookCreateWithOptionsAvailable]) { CFErrorRef error = nil; addressBook = ABAddressBookCreateWithOptions(NULL,&error); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { // callback can occur in background, address book must be accessed on thread it was created on dispatch_async(dispatch_get_main_queue(), ^{ if (error) { [self.delegate addressBookHelperError:self]; } else if (!granted) { [self.delegate addressBookHelperDeniedAcess:self]; } else { // access granted AddressBookUpdated(addressBook, nil, self); CFRelease(addressBook); } }); }); } else { // iOS 4/5 addressBook = ABAddressBookCreate(); AddressBookUpdated(addressBook, NULL, self); CFRelease(addressBook); } } void AddressBookUpdated(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) { AddressBookHelper *helper = (AddressBookHelper *)context; ABAddressBookRevert(addressBook); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); // process the contacts to return NSArray *contacts = ... [[helper delegate] addressBookHelper:helper finishedLoading:contacts]; }; 

试试这个: 必须授予对地址簿的访问权限,才能以编程方式访问。 这是我最终做的。

  #import <AddressBookUI/AddressBookUI.h> // Request authorization to Address Book ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { // First time access has been granted, add the contact [self _addContactToAddressBook]; }); } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { // The user has previously given access, add the contact [self _addContactToAddressBook]; } else { // The user has previously denied access // Send an alert telling user to change privacy setting in settings app } 

可能与设备上的iOS 6新隐私控制有关,应用程序无法在未经他们许可的情况下访问用户的联系人。

码:

 -(void)addressBookValidation { NSUserDefaults *prefs=[NSUserDefaults standardUserDefaults]; ABAddressBookRef addressbook = ABAddressBookCreate(); __block BOOL accessGranted = NO; if (ABAddressBookRequestAccessWithCompletion != NULL) { if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 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 if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { accessGranted = YES; } else if (ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusDenied) { accessGranted = NO; } else if (ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusRestricted){ accessGranted = NO; } else { accessGranted = YES; } } else { accessGranted = YES; } [prefs setBool:accessGranted forKey:@"addressBook"]; NSLog(@"[prefs boolForKey:@'addressBook']--->%d",[prefs boolForKey:@"addressBook"]); [prefs synchronize]; CFRelease(addressbook); }