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的所有访问权限
首先,这里以适当的形式重写您的代码作为起点.
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中的东西.
模拟器中不会出现同样的问题,因为您被自动授予访问权限(相当不切实际 - 另一个仅在设备上测试这种事情的好理由).
| 归档时间: |
|
| 查看次数: |
4905 次 |
| 最近记录: |