-3

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

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 授予对地址簿的所有访问权限

4

1 回答 1

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 的方式。

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

于 2013-05-15T17:23:47.337 回答