ABAddressBookCopyArrayOfAllPeople返回设备上的空数组

我在iOS 6上开发需要访问AddressBook的应用程序,我使用以下代码:

NSMutableArray *contacts = [[NSMutableArray alloc]init]; CFErrorRef *error = nil; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); if (error) {NSLog(@"ERROR!!!");} NSArray *arrayOfPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); 

但在真正的设备arrayOfPeople是空的…为什么发生这种情况? PS所有对AddressBook的访问都被授予

首先,以适当的forms重写代码作为起点。

 CFErrorRef error = nil; // no asterisk ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); // indirection if (!addressBook) // test the result, not the error { NSLog(@"ERROR!!!"); return; // bail } CFArrayRef arrayOfPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); NSLog(@"%@", arrayOfPeople); // let's see how we did 

其次,这是你的问题的真正原因:你没有访问权限。 在某些时候,您需要调用ABAddressBookRequestAccessWithCompletion来确保访问。 请注意,这个调用是asynchronous的,所以你需要从一个单独的调用或完成处理程序中获取人员数组。

文档似乎暗示,如果没有访问权限,您将获得NULL,但是如果访问权限未确定,则不是这种情况。 相反,你会得到一个无用的空只读地址数据库。 因此唯一确定你有权访问的方法是使用ABAddressBookGetAuthorizationStatus来明确地检查,唯一的办法就是调用ABAddressBookRequestAccessWithCompletion

这可能是新的iOS 6.1行为。 当然不是我从iOS 6.0中记住的东西。

同样的问题在模拟器中不会出现,因为您被授予了自动访问权限(相当不切实际 – 这是在设备上testing的另一个很好的理由)。