我正在做一些工作,以使一个应用程序与iOS 8中的新隐私设置保持一致。我已经令人满意地满足了相机访问的要求,现在,我来看看该应用程序如何访问通讯录。我是接触地址簿API的新手,所以这些问题可能有明显的答案。
与使用摄像头访问一样,我认为访问联系人在授予该应用程序的隐私设置状态方面将具有相似的行为。到目前为止,无论ABAuthorizationStatus的值是-kABAuthorizationStatusNotDetermined还是kABAuthorizationStatusDenied,始终是允许的。
另外,当状态为kABAuthorizationStatusNotDetermined时,永远不会向用户显示“确定/不允许”对话框(我已经擦除了手机并重新安装了该应用程序以进行确认)。此外,该应用程序永远不会在隐私设置下显示。我认为这是因为状态始终为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
谢谢!
从我发现(我可能是错误的)而处理更新代码库以正确处理iOS 8中的新隐私设置的发现是,这些设置在各个功能中并未得到统一尊重。例如,如果不更改位置的地址隐私设置,则对CLLocationManager的访问将无法进行。根据应用程序的不同,这可能对用户而言似乎是什么也没有发生,或者可能会出现错误消息。但是,如果未对通讯簿隐私设置进行任何此类更改,则始终会授予访问权限。
在绊倒苹果发布的一些非常有用的示例代码后,我发现了自己的错误。下面是我添加/修改的代码,以便在我处理的应用中正确尊重隐私设置。当我找到代码示例的链接时,我将其发布。
-(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);
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句