如何检测隐私权限更改(例如相机访问)
How to detect privacy permission changes (Camera access for example)
我们都去过那里。你想在你的应用程序中拍照,或访问照片、麦克风、联系人等...但首先 iOS 必须提示用户获得许可。在许多情况下,用户会拒绝访问。
如果您的应用检测到用户已拒绝访问,您可以使用以下方法将用户导航至应用的隐私设置:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
方便。然而....
我注意到,如果您说服用户打开开关,应用程序不会检测到更改。
考虑这段代码。系统会立即提示用户访问相机的权限(这仅显示该应用程序第一次为 运行)。假设用户拒绝许可。接下来,他们决定毕竟要启用摄像头访问权限。没问题。用户点击调出隐私面板的按钮。用户更改开关以允许访问。然后用户切换回应用程序。该块为 UIApplicationDidBecomeActiveNotification 触发,它再次读取权限。但是,它不反映用户的更改(仍显示为拒绝)。
如果从内存中清除应用程序并再次 运行,它将正确读取状态。
并非所有权限都是这样。例如 CoreLocation 似乎检测到用户的更改。我还找到了一种检测通知更改的方法。但对于通讯录、日历、相机、麦克风、Core Motion(以及更多),直到应用程序终止并再次 运行 时才会检测到更改。
有什么想法吗?
#import "ViewController.h"
@import AVFoundation;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
[self printPermission];
}];
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
[self printPermission];
}];
}
-(void)printPermission{
dispatch_async(dispatch_get_main_queue(), ^{
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if(status == AVAuthorizationStatusNotDetermined){
NSLog(@"VWWPermissionStatusNotDetermined");
self.view.backgroundColor = [UIColor whiteColor];
} else if(status == AVAuthorizationStatusAuthorized){
NSLog(@"VWWPermissionStatusAuthorized");
self.view.backgroundColor = [UIColor greenColor];
} else if(status == AVAuthorizationStatusDenied) {
NSLog(@"VWWPermissionStatusDenied");
self.view.backgroundColor = [UIColor redColor];
} else if(status == AVAuthorizationStatusRestricted) {
NSLog(@"VWWPermissionStatusRestricted");
self.view.backgroundColor = [UIColor redColor];
}
});
}
- (IBAction)buttonAction:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
@end
所以,这原来是一个与 iOS 9b1 相关的错误。
权限检测在 iOS 8 上工作正常。
我了解到您需要检查主队列的权限。如果您这样做,它将反映更新。
我们都去过那里。你想在你的应用程序中拍照,或访问照片、麦克风、联系人等...但首先 iOS 必须提示用户获得许可。在许多情况下,用户会拒绝访问。
如果您的应用检测到用户已拒绝访问,您可以使用以下方法将用户导航至应用的隐私设置:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
方便。然而....
我注意到,如果您说服用户打开开关,应用程序不会检测到更改。
考虑这段代码。系统会立即提示用户访问相机的权限(这仅显示该应用程序第一次为 运行)。假设用户拒绝许可。接下来,他们决定毕竟要启用摄像头访问权限。没问题。用户点击调出隐私面板的按钮。用户更改开关以允许访问。然后用户切换回应用程序。该块为 UIApplicationDidBecomeActiveNotification 触发,它再次读取权限。但是,它不反映用户的更改(仍显示为拒绝)。
如果从内存中清除应用程序并再次 运行,它将正确读取状态。
并非所有权限都是这样。例如 CoreLocation 似乎检测到用户的更改。我还找到了一种检测通知更改的方法。但对于通讯录、日历、相机、麦克风、Core Motion(以及更多),直到应用程序终止并再次 运行 时才会检测到更改。
有什么想法吗?
#import "ViewController.h"
@import AVFoundation;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
[self printPermission];
}];
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
[self printPermission];
}];
}
-(void)printPermission{
dispatch_async(dispatch_get_main_queue(), ^{
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if(status == AVAuthorizationStatusNotDetermined){
NSLog(@"VWWPermissionStatusNotDetermined");
self.view.backgroundColor = [UIColor whiteColor];
} else if(status == AVAuthorizationStatusAuthorized){
NSLog(@"VWWPermissionStatusAuthorized");
self.view.backgroundColor = [UIColor greenColor];
} else if(status == AVAuthorizationStatusDenied) {
NSLog(@"VWWPermissionStatusDenied");
self.view.backgroundColor = [UIColor redColor];
} else if(status == AVAuthorizationStatusRestricted) {
NSLog(@"VWWPermissionStatusRestricted");
self.view.backgroundColor = [UIColor redColor];
}
});
}
- (IBAction)buttonAction:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
@end
所以,这原来是一个与 iOS 9b1 相关的错误。
权限检测在 iOS 8 上工作正常。
我了解到您需要检查主队列的权限。如果您这样做,它将反映更新。