如何检测隐私权限更改(例如,相机访问权限)

时间:2015-06-13 03:12:14

标签: ios avfoundation uiimagepickercontroller eventkit photokit

我们都去过那里。你想在你的应用程序中拍照,或访问照片,麦克风,联系人等...但首先iOS必须提示用户许可。在许多情况下,用户将拒绝访问。

如果您的应用检测到用户已拒绝访问,您可以将用户导航到应用的隐私设置:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

便利。然而....

我注意到,如果您确实说服用户将开关切换为开启状态,则应用程序不会检测到更改。

考虑这段代码。系统会立即提示用户访问摄像头的权限(这仅显示第一次运行该应用程序时)。假设用户拒绝了权限。接下来他们决定他们确实想要启用摄像头访问。没问题。用户点击按钮,调出隐私面板。用户将交换机更改为允许访问。然后用户切换回应用程序。该块将触发UIApplicationDidBecomeActiveNotification,再次读取权限。但是它并不反映用户的更改(仍然显示为拒绝)。

如果应用程序从内存中清除并再次运行,它将正确读取状态。

并非所有权限都以这种方式运行。例如,CoreLocation似乎检测到用户的更改。我还找到了一种检测通知更改的方法。但对于“联系人”,“日历”,“相机”,“麦克风”,“核心动作”(以及更多),在应用程序终止并再次运行之前,不会检测到更改。

有什么想法吗?

#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

1 个答案:

答案 0 :(得分:2)

所以,这是一个与iOS 9b1相关的错误。

在iOS 8上,权限检测正常。

我确实知道你需要检查主队列的权限。如果您这样做,它将反映更新。