检查权限而不被系统询问

Check for permissions without being asked by the system

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

这是我正在使用的代码:

- (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);
    }
}

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

有人有解决办法吗?

谢谢

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

  1. 您已获得访问权限。
  2. 您已被拒绝访问。
  3. 尚未询问该用户。

第一次打开应用程序并尝试访问需要权限的内容时,它会询问。没有办法解决这个问题。

如果您获得许可,它将永远不会再询问并且会正常工作。

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

每个系统只会询问用户一次。这就是它必须工作的方式。

在这种情况下,它处于状态 3。因此它既没有也没有没有权限。因此检查无法完成。它必须落入状态 1 或 2 才能计算出应用程序是否具有权限。

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

来自 doc:

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

所以检查状态是否为 kABAuthorizationStatusAuthorized 并且你确定你有权限,在所有其他情况下你没有权限,要么是因为用户没有接受,要么是因为你还没有请求权限