如何在 IOS 上获得 Photo/Camera 的授权状态?

How can I get the authorization status to Photo/Camera on IOS?

我正在使用 UIImagePickerController。我需要引导我的用户到 Setting -> Privacy 来解锁 camera/photo 访问权限,如果他们首先拒绝它的话。

默认情况下,UIImagePickerController会显示:

但是我想要在呈现 UIImagePickerController 之前收到消息怎么样?我怎样才能得到我是否有访问权限的消息?

我想声明这不是一个绝对重复的问题。 AVCaptureDevice本题detect permission of camera on ios只修复了访问camera,但是访问'photo album'还是检测不到

问题detect permission of camera on ios提到了classAVCaptureDevice,可以修复Camera Usage的授权。

我找到了'photo'授权的解决方法。在 IOS8 和 class PHPhotoLibrary.

中有一个名为 Photos 的新框架

此方法可以发出警报:

PHPhotoLibrary.requestAuthorization({(status: PHAuthorizationStatus)in
    switch status{
    case .denied:
        break
    case .authorized:
        break
    default:
        break
    }
})

就像UIImagePickerController第一次出现的时候一样。

class func authorizationStatus() -> PHAuthorizationStatus可以return'photo album'

的当前授权状态

AVCaptureDevice为此提供API。

        if (![[AVCaptureDevice  class] respondsToSelector:@selector(authorizationStatusForMediaType:)])
        {
            //Do something…
            break;
        }

        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
        switch (authStatus)
        {
            case AVAuthorizationStatusAuthorized:
            case AVAuthorizationStatusRestricted:
            {
                //Do something…
                break;
            }
            case AVAuthorizationStatusDenied:
            {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"App name" message:@"Appname does not have access to your camera. To enable access, go to iPhone Settings > AppName and turn on Camera." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [alert show];

                //Do something…
                break;
            }
            case AVAuthorizationStatusNotDetermined:
            {
                // not determined?!
                [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
                 {
                     if(granted)
                     {
                         dispatch_async(dispatch_get_main_queue(), ^
                         {
                             //Do something…
                         });
                     }
                     else
                     {
                         dispatch_async(dispatch_get_main_queue(), ^
                         {
                             //Do something…
                         });
                     }
                 }];
                break;
            }
            default:
                break;
        }