Home FOI Leaks

06 Jun 2016
Accessing Camera and Photos in iOS

Accessing camera

Requesting access for media types

One can request access to the camera/microphone using AVCaptureDevice::requestAccessForMediaType:completionHandler:. Note however that completionHandler will be called in a background thread. If you want to do some UIKit operation, you need to dispatch to the main queue. One good approach is the following:

    void (^cb)(BOOL) = ^void(BOOL granted) {
        if (!granted) {
            dispatch_async(dispatch_get_main_queue(), ^{
                //show alert
            });
        }
    };
    
    
    AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    if (status == ALAuthorizationStatusNotDetermined) {
        [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:cb];
    } else {
        cb(status == AVAuthorizationStatusAuthorized);
    }

Accessing photos

Requesting access

Same process as with AV, we must check the Photos framework.

void (^cb)(PHAuthorizationStatus) = ^void(PHAuthorizationStatus status) {
        if (status == PHAuthorizationStatusDenied || status == PHAuthorizationStatusRestricted) {
   	   //handle denied access                     
        }
    };
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    if (status == PHAuthorizationStatusNotDetermined) {
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus newStatus) {
            cb(newStatus);
        }];
    } else {
        cb(status);
    }

In this case, requestAuthorization’s callback is called in the same thread. Note that, until the user has seen the permission prompt, calls to fetch images from the library will return empty objects, and attempting to write files into the library will fail.


PS: I know I am not supposed to tell you what to do, but, you know, you could always follow me on Twitter