在没有系统询问的情况下检查权限

时间:2015-01-18 13:48:29

标签: ios objective-c contacts

我希望我的应用检查是否有权使用设备联系人。

这是我使用的代码:

- (void)isContactsAutherizedWithCompletion:(void(^)(BOOL granted))completion {
    self.addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);

    ABAddressBookRegisterExternalChangeCallback(self.addressBookRef, MyAddressBookExternalChangeCallback, (__bridge_retained  void *)self);
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
        ABAddressBookRequestAccessWithCompletion(self.addressBookRef, ^(bool granted, CFErrorRef error) {
            if (granted) {
                completion(YES);
            } else {
                completion(NO);
            }
        });
    } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
        completion(YES);
    } else {
        completion(NO);
    }
}

但是使用此代码我会自动被问到是否要授予权限。我不想被问到,我只是想知道它是否有权限。

任何人都有解决方案吗?

由于

2 个答案:

答案 0 :(得分:1)

基于权限的访问有三种状态。

  1. 您已被授予访问权限。
  2. 您被拒绝访问。
  3. 尚未询问用户。
  4. 首次打开应用并尝试访问需要权限的内容时,它会询问。没办法解决这个问题。

    如果你获得了许可,那么它将永远不会再问,它会起作用。

    如果您被拒绝访问,那么它也将永远不再询问,请求将失败。

    每个系统只会询问用户一次。这就是它必须如何运作。

    在这种情况下它处于状态3.所以它既没有权限也没有。所以支票无法完成。它必须属于状态1或2才能在应用程序获得许可的情况下解决问题。

    即。一切似乎都在这里正常工作。

答案 1 :(得分:0)

来自doc

typedef CF_ENUM (CFIndex, ABAuthorizationStatus ) {
   kABAuthorizationStatusNotDetermined = 0,
   kABAuthorizationStatusRestricted,
   kABAuthorizationStatusDenied,
   kABAuthorizationStatusAuthorized 
};

因此请检查状态是否为kABAuthorizationStatusAuthorized 并且您确信您拥有该权限,在所有其他情况下您都没有权限,因为该用户未接受或您尚未请求权限