AddressBook隐私设置未强制执行

时间:2014-12-11 22:16:30

标签: objective-c ios8 addressbook

我正在做一些工作,让应用程序与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

谢谢!

1 个答案:

答案 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);
    });
}