我正在做一些工作,让应用程序与iOS 8中的新隐私设置保持一致。我已经完成了相机访问的满意要求,现在我来看看如何这个应用程序访问地址簿。我是新手使用地址簿API所以这些问题可能有明显的答案。
与相机访问一样,我认为访问联系人的行为与授予应用程序的隐私设置的状态相似。到目前为止,无论ABAuthorizationStatus的价值是什么 - kABAuthorizationStatusNotDetermined或kABAuthorizationStatusDenied - 始终允许访问。
此外,当状态为kABAuthorizationStatusNotDetermined时,' Okay / Don不允许'对话框永远不会显示给用户(我已经删除了手机和树脂屏幕应用程序以确认)。此外,该应用程序永远不会出现在隐私设置下。我认为这是因为状态始终是kABAuthorizationStatusNotDetermined。
以下是启动联系人访问权限的代码。控制器显示(只读)和联系人'可以获得信息。委托代码未显示。
// Debug - Value is always denied or not determined.
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
// Existing code since iOS 7 - always works despite status.
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentViewController:picker animated:YES completion:nil];
很棒的是,一切似乎都在起作用,但我喜欢什么,如果有的话,我做错了。
iPhone 6, iOS 8.0.2, Xcode 6
谢谢!
答案 0 :(得分:0)
从我发现的(我可能是错的)处理更新代码库以正确处理iOS 8中的新隐私设置时,这些设置在功能上不一致。例如,如果不更改地址的隐私设置,则无法访问CLLocationManager。根据应用程序的不同,这可能会对用户显示,好像什么也没发生或者可能出现错误消息。但是,如果没有对地址簿隐私设置进行此类更改,则始终授予访问权限。
在找到Apple发布的一些非常有用的示例代码后,我发现了我的错误。下面是我添加/修改的代码,以便在我工作的应用程序中正确地遵守隐私设置。当我找到代码示例的链接时,我会发布它。
-(void) presentAddressBookPicker {
switch (ABAddressBookGetAuthorizationStatus()) {
case kABAuthorizationStatusAuthorized:
[self accessGrantedForAddressBook];
break;
case kABAuthorizationStatusNotDetermined:
[self requestAccessToAddressBook];
break;
case kABAuthorizationStatusRestricted:
case kABAuthorizationStatusDenied:
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"Unable to access address book"
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
break;
default:
// Unlikely but log it anyway.
DLog(@"Unknown address book status.");
break;
}
}
-(void) accessGrantedForAddressBook {
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentViewController:picker animated:YES completion:nil];
}
-(void) requestAccessToAddressBook {
__weak MyWebViewController* weakSelf = self;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf accessGrantedForAddressBook];
});
}
CFRelease(addressBook);
});
}