ABAddressBookCopyArrayOfAllPeople在设备上返回空数组

InV*_*iZz -2 objective-c abaddressbook ios ios6

我在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);
Run Code Online (Sandbox Code Playgroud)

但在实际设备上,ArrayOfPeople是空的......为什么会这样?PS授予对AddressBook的所有访问权限

mat*_*att 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
Run Code Online (Sandbox Code Playgroud)

其次,这是问题的真正原因:你无法访问.在某些时候,您需要调用ABAddressBookRequestAccessWithCompletion以确保访问.请注意,此调用是异步的,因此您需要从单独的调用或完成处理程序中获取人员数组.

文档似乎意味着如果没有访问权限,您将获得NULL,但如果访问权限未确定,则情况并非如此.相反,你得到一个无用的空只读地址数据库.因此,确保您具有访问权限的唯一方法是明确检查ABAddressBookGetAuthorizationStatus,并且唯一能够获得访问警报请求的方法是调用ABAddressBookRequestAccessWithCompletion.

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

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