Oto kompletny przewodnik dla iOS 8+ (bez ALAssetLibrary):
Najpierw musimy podać opis użycia, ponieważ teraz jest to wymagane przez PHPhotoLibrary.
Aby to zrobić, musimy otworzyć info.plist
plik, znaleźć klucz Privacy - Photo Library Usage Description
i podać mu wartość. Jeśli klucz nie istnieje, po prostu go utwórz.
Oto przykładowy obraz:
Upewnij się również, że wartość klucza Bundle name
nie jest pusta winfo.plist
pliku.
Teraz, gdy mamy opis, możemy normalnie zażądać autoryzacji przez wywołanie requestAuthorization
metody:
[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;
}
}];
UWAGA 1: w requestAuthorization
rzeczywistości nie wyświetla powiadomienia przy każdym połączeniu. Pokazuje się raz na jakiś czas, zapisuje odpowiedź użytkownika i zwraca ją za każdym razem, zamiast ponownie pokazywać alert. Ale ponieważ to nie jest to, czego potrzebujemy, oto przydatny kod, który zawsze wyświetla alert za każdym razem, gdy potrzebujemy pozwolenia (z przekierowaniem do ustawień):
- (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];
}
}];
}
});
}
Typowy problem 1: Niektórzy użytkownicy narzekają, że aplikacja nie wyświetla ostrzeżenia po wprowadzeniu wyżej wymienionych zmian w info.plist
pliku.
Rozwiązanie: W celu przetestowania spróbuj zmienić Bundle Identifier
plik projektu na inny, wyczyść i przebuduj aplikację. Jeśli zaczął działać, wszystko jest w porządku, zmień nazwę z powrotem.
Typowy problem 2: Jest pewien szczególny przypadek, gdy wyniki pobierania nie są aktualizowane (a widoki, które korzystały z obrazów z tych żądań pobierania, nadal są odpowiednio puste), gdy aplikacja uzyskuje uprawnienia do zdjęć, działając zgodnie z obietnicą w dokumentacji.
Właściwie to się dzieje, gdy używamy ZŁEGO kodu w ten sposób:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
W takim przypadku, jeśli użytkownik odmówił przyznania uprawnień, viewDidLoad
a następnie przeskoczył do ustawień, zezwolił i wrócił do aplikacji, widoki nie zostaną odświeżone, ponieważ [self reloadCollectionView]
i żądania pobierania nie zostały wysłane.
Rozwiązanie: musimy tylko zadzwonić [self reloadCollectionView]
i wykonać inne żądania pobierania, zanim zażądamy autoryzacji w następujący sposób:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}