Hier ist eine vollständige Anleitung für iOS 8 und höher (ohne ALAssetLibrary):
Zuerst müssen wir eine Verwendungsbeschreibung bereitstellen, wie sie jetzt von PHPhotoLibrary benötigt wird.
Dazu müssen wir die info.plist
Datei öffnen , den Schlüssel finden Privacy - Photo Library Usage Description
und einen Wert dafür bereitstellen. Wenn der Schlüssel nicht vorhanden ist, erstellen Sie ihn einfach.
Hier ist ein Bild zum Beispiel:
Stellen Sie außerdem sicher, dass der Wert des Schlüssels Bundle name
in nicht leer istinfo.plist
Datei ist.
Wenn wir nun eine Beschreibung haben, können wir normalerweise eine Autorisierung anfordern, indem wir die requestAuthorization
Methode aufrufen :
[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;
}
}];
HINWEIS 1: requestAuthorization
Tatsächlich wird nicht bei jedem Anruf eine Warnung angezeigt. Es wird einmal pro Zeit angezeigt, speichert die Antwort des Benutzers und gibt sie jedes Mal zurück, anstatt erneut eine Warnung anzuzeigen. Da dies jedoch nicht erforderlich ist, finden Sie hier einen nützlichen Code, der jedes Mal, wenn wir eine Berechtigung benötigen (mit Umleitung zu Einstellungen), eine Warnung anzeigt:
- (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];
}
}];
}
});
}
Häufiges Problem 1: Einige Benutzer beschweren sich dass die App nach den oben genannten Änderungen in der info.plist
Datei keine Warnung anzeigt.
Lösung: Versuchen Sie zum Testen, Bundle Identifier
von der Projektdatei zu einer anderen zu wechseln , bereinigen Sie die App und erstellen Sie sie neu. Wenn es funktioniert hat, ist alles in Ordnung, benennen Sie es wieder um.
Häufiges Problem 2: Es gibt einen bestimmten Fall, in dem die Abrufergebnisse nicht aktualisiert werden (und die Ansichten, in denen Bilder aus diesen Abrufanforderungen verwendet wurden, immer noch entsprechend leer sind), wenn die App Berechtigungen für Fotos erhält, während sie wie in der Dokumentation versprochen ausgeführt wird.
Eigentlich passiert es, wenn wir FALSCHEN Code wie folgt verwenden:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
In diesem Fall werden viewDidLoad
Ansichten nicht aktualisiert, wenn der Benutzer die Erteilung von Berechtigungen verweigert und dann zu den Einstellungen gesprungen, zugelassen und zur App zurückgesprungen ist, da keine Abrufanforderungen [self reloadCollectionView]
gesendet wurden.
Lösung: Wir müssen nur anrufen [self reloadCollectionView]
und andere Abrufanforderungen ausführen, bevor wir eine Autorisierung wie diese benötigen:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}