Depuis IOS14, les droits d'accès aux appareils photos et à la photothèque ont été renforcés. L'usage sous IOS est de demander l'autorisation de l'utilisateur à la première utilisation.
Pour la caméra, on :
- désactive le bouton de notre interface par défaut,
- s'il y a au moins une caméra de disponible,
- on vérifie le statut de l'accès aux caméras,
- si le statut est indéterminé, on demande l'autorisation,
- si le statut est déterminé, on active le bouton si on y est autorisé,
- dans le handler de la demande d'autorisation, si on y est autorisé, on active le bouton.
// Demande l'authorisation pour l'usage de la caméra (s'il y a une camera)
button_camera.enabled = NO;
if( [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear] ||
[UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]) {
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if(status==AVAuthorizationStatusNotDetermined) {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
dispatch_async(dispatch_get_main_queue(), ^{ self->button_camera.enabled = YES; });
}];
} else {
button_camera.enabled = (status==AVAuthorizationStatusAuthorized);
}
}
On remarquera qu'il faut activer le bouton dans le thread principal (dispatcher_async), et que donc la demande se fait sur un thread secondaire.
Le fait de vérifier s'il y a une caméra permet normalement d'utiliser le code pour des appareils sans caméra disponible, comme l'AppleWatch ou VisionPro (qui a pleins de caméra mais pas pour prendre des photos).
Évidemment, on est pas obligé d'être si pointilleux, et on peut faire la demande d'autorisation à chaque fois. C'est plus concis, cela fonctionne, mais c'est sans doute un peu moins "propre", tout en étant bien plus lisible :
button_camera.enabled = NO;
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
dispatch_async(dispatch_get_main_queue(), ^{
self->button_camera.enabled = YES;
});
}];
<key>NSCameraUsageDescription</key>
<string>Permet de prendre des photos pour les fiches des enfants</string>
Commentaires