Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 地址簿隐私设置未强制执行_Objective C_Ios8_Addressbook - Fatal编程技术网

Objective c 地址簿隐私设置未强制执行

Objective c 地址簿隐私设置未强制执行,objective-c,ios8,addressbook,Objective C,Ios8,Addressbook,我正在做一些工作,让一个应用程序符合iOS 8中的新隐私设置。我已经圆满完成了摄像头访问的要求,现在我来看看这个应用程序是如何访问地址簿的。我不熟悉使用通讯录API,所以这些问题可能有明显的答案 与摄像头访问一样,我认为访问联系人的行为与授予应用程序的隐私设置的状态类似。问题是,到目前为止,无论authorizationStatus的值是-kABAuthorizationStatusNotDetermined还是kABAuthorizationStatusDenied-访问总是被允许的 此外,当

我正在做一些工作,让一个应用程序符合iOS 8中的新隐私设置。我已经圆满完成了摄像头访问的要求,现在我来看看这个应用程序是如何访问地址簿的。我不熟悉使用通讯录API,所以这些问题可能有明显的答案

与摄像头访问一样,我认为访问联系人的行为与授予应用程序的隐私设置的状态类似。问题是,到目前为止,无论authorizationStatus的值是-kABAuthorizationStatusNotDetermined还是kABAuthorizationStatusDenied-访问总是被允许的

此外,当状态为kABAuthorizationStatusNotDetermined时,“确定/不允许”对话框永远不会向用户显示(我已擦除手机并重新安装应用程序以确认)。此外,该应用程序从未在隐私设置下显示。我认为这是因为状态始终是KABARGorizationStatusNotDetermined

开始访问联系人的代码如下所示。显示控制器(只读),可以获取联系人信息。未显示委托代码

// 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];
一切似乎都在运转,这很好,但我想知道我做错了什么

iPhone6, 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);
    });
}

您应该尝试的一件事是设置->常规->重置->隐私和位置。重新安装应用程序实际上不会重置权限。我没有注意到该选项。请不要让我擦除手机,谢谢。经过一些测试后,iOS 7(在iPhone 5、iOS 7.1上测试)尊重隐私设置。iOS8(8.0.2,8.1)似乎不尊重这些设置。