我希望我的应用检查是否有权使用设备联系人。
这是我使用的代码:
- (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);
}
}
但是使用此代码我会自动被问到是否要授予权限。我不想被问到,我只是想知道它是否有权限。
任何人都有解决方案吗?
由于
答案 0 :(得分:1)
基于权限的访问有三种状态。
首次打开应用并尝试访问需要权限的内容时,它会询问。没办法解决这个问题。
如果你获得了许可,那么它将永远不会再问,它会起作用。
如果您被拒绝访问,那么它也将永远不再询问,请求将失败。
每个系统只会询问用户一次。这就是它必须如何运作。
在这种情况下它处于状态3.所以它既没有权限也没有。所以支票无法完成。它必须属于状态1或2才能在应用程序获得许可的情况下解决问题。
即。一切似乎都在这里正常工作。
答案 1 :(得分:0)
来自doc:
typedef CF_ENUM (CFIndex, ABAuthorizationStatus ) {
kABAuthorizationStatusNotDetermined = 0,
kABAuthorizationStatusRestricted,
kABAuthorizationStatusDenied,
kABAuthorizationStatusAuthorized
};
因此请检查状态是否为kABAuthorizationStatusAuthorized
并且您确信您拥有该权限,在所有其他情况下您都没有权限,因为该用户未接受或您尚未请求权限