我在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的所有访问权限
答案 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中的东西。
同样的问题在模拟器中不会出现,因为您被自动授予访问权限(相当不切实际 - 另一个仅在设备上测试这种事情的好理由)。