【问题标题】:AddressBook privacy settings not enforced未强制执行通讯簿隐私设置
【发布时间】:2014-12-11 22:16:30
【问题描述】:

我正在做一些工作,让应用程序与 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 7 中得到尊重(在 iPhone 5、iOS 7.1 上测试)。 iOS 8(8.0.2、8.1)似乎不尊重这些设置。

标签: objective-c ios8 addressbook


【解决方案1】:

在处理更新代码库以正确处理 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);
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多