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); }
- ABAddressBookCopyArrayOfAllPeople和ABAddressBookGetPersonCount返回不同的大小
- iOS 6地址簿空kABPersonPhoneProperty
- 是否有可能find也有苹果设备的用户的联系人?
- 在联系页面中添加地址簿
- ABRecordCopyValue()EXC_BAD_ACCESS错误
- 用ABPersonCopyImageData获取iOS联系人图像
- 访问核心数据模型/联系人数据库的间歇性错误
- iOS – 如何使用ABSourceType |search“可search的”ABSource kABSourceTypeSearchableMask
- 如何sortingiPhone通讯录?