Voici un guide complet pour iOS 8+ (sans ALAssetLibrary):
Tout d'abord, nous devons fournir une description de l'utilisation car elle est maintenant requise par PHPhotoLibrary.
Pour ce faire, nous devons ouvrir le info.plist
fichier, trouver la clé Privacy - Photo Library Usage Description
et lui fournir une valeur. Si la clé n'existe pas, créez-la simplement.
Voici une image par exemple:
Assurez-vous également que la valeur de la clé Bundle name
n'est pas vide dans le info.plist
fichier.
Maintenant, lorsque nous avons une description, nous pouvons normalement demander une autorisation en appelant la requestAuthorization
méthode:
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusAuthorized:
NSLog(@"PHAuthorizationStatusAuthorized");
break;
case PHAuthorizationStatusDenied:
NSLog(@"PHAuthorizationStatusDenied");
break;
case PHAuthorizationStatusNotDetermined:
NSLog(@"PHAuthorizationStatusNotDetermined");
break;
case PHAuthorizationStatusRestricted:
NSLog(@"PHAuthorizationStatusRestricted");
break;
}
}];
REMARQUE 1: requestAuthorization
n'affiche pas d'alerte à chaque appel. Il s'affiche une fois tous les temps, enregistre la réponse de l'utilisateur et la renvoie à chaque fois au lieu d'afficher à nouveau l'alerte. Mais comme ce n'est pas ce dont nous avons besoin, voici un code utile qui affiche toujours une alerte chaque fois que nous avons besoin d'une autorisation (avec redirection vers les paramètres):
- (void)requestAuthorizationWithRedirectionToSettings {
dispatch_async(dispatch_get_main_queue(), ^{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized)
{
//We have permission. Do whatever is needed
}
else
{
//No permission. Trying to normally request it
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status != PHAuthorizationStatusAuthorized)
{
//User don't give us permission. Showing alert with redirection to settings
//Getting description string from info.plist file
NSString *accessDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSPhotoLibraryUsageDescription"];
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:accessDescription message:@"To give permissions tap on 'Change Settings' button" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:cancelAction];
UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:@"Change Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}];
[alertController addAction:settingsAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
}];
}
});
}
Problème courant 1: certains utilisateurs se plaignent que l'application n'affiche pas d'alerte après avoir effectué les modifications mentionnées ci-dessus dans le info.plist
fichier.
Solution: pour les tests, essayez de passer Bundle Identifier
du fichier projet à autre chose, nettoyez et reconstruisez l'application. Si cela a commencé à fonctionner, tout va bien, renommez-le.
Problème courant 2: il existe un cas spécifique lorsque les résultats de l'extraction ne sont pas mis à jour (et les vues qui utilisaient des images de ces demandes de récupération toujours vides en conséquence) lorsque l'application obtient des autorisations sur les photos, tout en s'exécutant comme promis dans la documentation.
En fait, cela se produit lorsque nous utilisons un mauvais code comme celui-ci:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
Dans ce cas, si l'utilisateur refuse d'accorder des autorisations, viewDidLoad
puis accède aux paramètres, est autorisé et revient à l'application, les vues ne seront pas actualisées car les [self reloadCollectionView]
demandes de récupération n'ont pas été envoyées.
Solution: nous devons simplement appeler [self reloadCollectionView]
et faire d'autres requêtes de récupération avant de demander une autorisation comme celle-ci:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}