ABAddressBookCopyArrayOfAllPeople在设备上返回空数组

时间:2013-05-15 12:58:31

标签: ios objective-c ios6 abaddressbook

我在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是空的......为什么会这样? 附:授予对AddressBook的所有访问权限

1 个答案:

答案 0 :(得分:8)

首先,这里以适当的形式重写您的代码作为起点。

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来确保访问权限。请注意,此调用是异步的,因此您需要从单独的调用或完成处理程序中获取人员数组。

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

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

同样的问题在模拟器中不会出现,因为您被自动授予访问权限(相当不切实际 - 另一个仅在设备上测试这种事情的好理由)。