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

标签 ios avfoundation uiimagepickercontroller eventkit photokit

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

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

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

方便。然而……

我注意到,如果您说服用户打开开关,应用程序不会检测到更改。

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

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

并不是所有的权限都是这样的。例如 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 上工作正常。

我确实了解到您需要检查主队列的权限。如果您这样做,它将反射(reflect)更新。

关于ios - 如何检测隐私权限更改(例如相机访问),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30814706/

相关文章:

ios - 从 iOS 中捕获的视频中获取慢动作元数据

iphone - 如何在iPad中使用UIImagePickerController?

ios - NSDate 到 Tick 的转换

ios - 在后台计数(NSTimer超过3分钟)

ios - 为什么在 MacBook 上查看时我的背景图像会变形?

ios - 是否可以在不先下载整个文件的情况下开始播放大型 .aac 文件?

ios - 无法使用 AVFoundation AVAudioPlayer 构建

ios 8 UIIMagePickerController 在 iPhone 6 中交替显示黑色预览屏幕

ios - 如何将 uiimage 保存在给定 nsurl 的目录中?

c# - 检测用户是否正在从另一个应用程序播放音乐