İşte iOS 8+ için eksiksiz bir kılavuz (ALAssetLibrary olmadan):
Öncelikle şimdi PHPhotoLibrary tarafından gerekli olduğu gibi kullanım açıklamasını sağlamalıyız.
Bunu yapmak için dosyayı açmalı , anahtarı bulmalı ve ona değer vermeliyiz . Anahtar yoksa, sadece oluşturun.
Örneğin bir resim: Dosyada
anahtar değerinin boş olmadığından da emin olun .
info.plist
Privacy - Photo Library Usage Description
Bundle name
info.plist
Artık açıklamamız olduğunda, normalde requestAuthorization
yöntemi çağırarak yetkilendirme isteyebiliriz :
[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;
}
}];
NOT 1: requestAuthorization
aslında her aramada uyarı göstermez. Her seferinde bir kez gösterir, kullanıcının cevabını kaydeder ve tekrar uyarı göstermek yerine her seferinde geri verir. Ancak ihtiyacımız olan şey bu olmadığından, her izne ihtiyacımız olduğunda her zaman uyarı gösteren yararlı bir kod burada (ayarlara yönlendirmeyle):
- (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];
}
}];
}
});
}
Yaygın sorun 1: Bazı kullanıcılar , dosyada yukarıda belirtilen değişiklikleri yaptıktan sonra uygulamanın uyarı göstermediğinden şikayetçiinfo.plist
.
Çözüm: Test Bundle Identifier
için proje dosyasından başka bir şeye geçmeyi deneyin , uygulamayı temizleyin ve yeniden oluşturun. Çalışmaya başladıysa, her şey yolunda, yeniden adlandırın.
Yaygın Sorun 2: Uygulama belgelerde vaat edildiği gibi çalışırken fotoğraflara izinler aldığında getirme sonuçlarının güncellenmediği (ve bu getirme isteklerinden gelen görüntüleri kullanan görünümler buna göre boş olduğu) bazı özel durumlar vardır .
Aslında şu şekilde YANLIŞ kod kullandığımızda olur :
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
Bu durumda, kullanıcı izin vermeyi reddetmiş ve viewDidLoad
ardından ayarlara geçmiş, izin vermiş ve uygulamaya geri dönmüşse, görünümler yenilenmeyecektir çünkü [self reloadCollectionView]
ve getirme istekleri gönderilmemiştir.
Çözüm: Bunun [self reloadCollectionView]
gibi yetkilendirme gerektirmeden önce başka getirme isteklerini aramalı ve yapmalıyız:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}