我有一个视图控制器,我试图在viewDidLoad上访问用户的地址簿。当用户登陆视图控制器时,我想弹出一个警告窗口,询问他们是否可以访问他们的地址簿中的联系人,然后他们可以选择“确定”或“不允许”。
奇怪的是我的印象是我的代码设置正确才能做到这一点。但是,每当我在iPhone上运行应用程序并访问此视图控制器时,它甚至不会向我请求权限,只是自动访问我的联系人。我甚至尝试从我的iPhone中删除应用程序及其所有数据,然后在xcode和iPhone上重新运行。
我不确定这是不是故障,因为我是开发人员,或者我的代码有问题。
以下是我用于访问viewDidLoad中的地址簿的代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//Asks for access to Address Book.
ABAddressBookRef m_addressbook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookCopyArrayOfAllPeople(m_addressbook);
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@autoreleasepool {
// Write your code here...
// Fetch data from SQLite DB
}
});
ABAddressBookRequestAccessWithCompletion(m_addressbook, ^(bool granted, CFErrorRef error)
{
accessGranted = granted;
NSLog(@"Has access been granted?: %hhd", accessGranted);
NSLog(@"Has there been an error? %@", error);
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else { // we're on iOS 5 or older
accessGranted = YES;
NSLog(@"Address book access has been granted.");
}
if (accessGranted) {
NSArray *allContacts = (__bridge_transfer NSArray
*)ABAddressBookCopyArrayOfAllPeople(m_addressbook);
然后基本上如果授予访问权限,我会开始将所有名称和电话号码加载到视图控制器的UITableView中。
我真的需要弄清楚为什么会出现这种情况,并且还想添加一个警告视图,询问用户是否允许访问地址簿联系人。
实际上是不是因为我的代码错了而要求访问?因为它知道我是开发人员?就像我说的那样,在我从iPhone上删除应用程序及其所有数据后,我正在运行它。
更新:如果有所不同,我正在使用iOS 7.0.4。
答案 0 :(得分:2)
我在你的代码中看到的一个错误就是你有这个错误:
if (ABAddressBookRequestAccessWithCompletion != NULL) {
这应该是:
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
原始代码的问题在于ABAddressBookRequestAccessWithCompletion
不是任何内容:它需要参数,就像您稍后在同一if
语句中使用的那样。我很惊讶你没有从Xcode收到错误。 ABAddressBookGetAuthorizationStatus
是iOS 6中的新功能。
此外,您应该在获得许可后创建地址簿参考,而不是之前。
也可能因为应用程序在某个时刻出现在您的iPhone上,它会记得您允许该应用程序使用您的联系人。在iOS模拟器中,有一个“重置内容和设置”选项。这使模拟器忘记了您为应用提供的任何权限设置。我发现你不太可能想重置你的iPhone,对吗?
答案 1 :(得分:2)
我终于弄明白了。删除应用程序和“所有数据”是iPhone提供的误导性对话。关于使用隐私设置进行测试,您必须转到设置>一般>重置>重置位置&隐私。通过这样做,您将获得一个真正“新鲜”的环境,允许您测试“隐私访问”代码。请注意,这将删除您为所有其他应用设置的位置和隐私设置。
答案 2 :(得分:0)
使用此代码.....
if (ABAddressBookGetAuthorizationStatus == ABAuthorizationStatusNotDetermined){
而不是......
if (ABAddressBookRequestAccessWithCompletion != NULL) {