NSString *mediaType = AVMediaTypeVideo; // Or AVMediaTypeAudio AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType]; // This status is normally not visible—the AVCaptureDevice class methods for discovering devices do not return devices the user is restricted from accessing. if(authStatus == AVAuthorizationStatusRestricted){ NSLog(@"Restricted"); } // The user has explicitly denied permission for media capture. else if(authStatus == AVAuthorizationStatusDenied){ NSLog(@"Denied"); } // The user has explicitly granted permission for media capture, or explicit user permission is not necessary for the media type in question. else if(authStatus == AVAuthorizationStatusAuthorized){ NSLog(@"Authorized"); } // Explicit user permission is required for media capture, but the user has not yet granted or denied such permission. else if(authStatus == AVAuthorizationStatusNotDetermined){ [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) { // Make sure we execute our code on the main thread so we can update the UI immediately. // // See documentation for ABAddressBookRequestAccessWithCompletion where it says // "The completion handler is called on an arbitrary queue." // // Though there is no similar mention for requestAccessForMediaType, it appears it does // the same thing. // dispatch_async(dispatch_get_main_queue(), ^{ if(granted){ // UI updates as needed NSLog(@"Granted access to %@", mediaType); } else { // UI updates as needed NSLog(@"Not granted access to %@", mediaType); } }); }]; } else { NSLog(@"Unknown authorization status"); }