Berikut adalah panduan lengkap untuk iOS 8+ (tanpa ALAssetLibrary):
Pertama kita harus memberikan deskripsi penggunaan seperti yang sekarang dibutuhkan oleh PHPhotoLibrary.
Untuk melakukan ini kita harus membuka info.plist
file, menemukan kunci Privacy - Photo Library Usage Description
dan memberikan nilainya. Jika kunci tidak ada, buat saja.
Berikut adalah gambarnya misalnya:
Pastikan juga bahwa nilai key Bundle name
tidak kosonginfo.plist
file.
Sekarang ketika kami memiliki deskripsi, kami biasanya dapat meminta otorisasi dengan memanggil requestAuthorization
metode:
[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;
}
}];
CATATAN 1: requestAuthorization
sebenarnya tidak menunjukkan peringatan pada setiap panggilan. Ini ditampilkan sekali per beberapa waktu, menyimpan jawaban pengguna dan mengembalikannya setiap kali alih-alih menampilkan peringatan lagi. Tetapi karena bukan itu yang kita butuhkan, berikut adalah kode berguna yang selalu menunjukkan peringatan setiap kali kita membutuhkan izin (dengan pengalihan ke pengaturan):
- (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];
}
}];
}
});
}
Masalah umum 1: Beberapa pengguna mengeluh bahwa aplikasi tidak menunjukkan peringatan setelah melakukan perubahan info.plist
file yang disebutkan di atas .
Solusi: Untuk pengujian, coba ubah Bundle Identifier
dari file proyek ke yang lain, bersihkan dan bangun kembali aplikasi. Jika mulai berfungsi maka semuanya baik-baik saja, ganti namanya kembali.
Masalah Umum 2: Ada beberapa kasus khusus ketika hasil pengambilan tidak diperbarui (dan tampilan yang menggunakan gambar dari permintaan pengambilan tersebut masih kosong) saat aplikasi mendapat izin untuk foto, saat berjalan seperti yang dijanjikan dalam dokumentasi.
Sebenarnya itu terjadi ketika kita menggunakan kode SALAH seperti ini:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
Dalam kasus ini, jika pengguna menolak memberikan izin viewDidLoad
kemudian melompat ke pengaturan, diizinkan dan kembali ke aplikasi, tampilan tidak akan disegarkan karena [self reloadCollectionView]
dan permintaan pengambilan tidak dikirim.
Solusi: Kami hanya perlu menelepon [self reloadCollectionView]
dan melakukan permintaan pengambilan lainnya sebelum memerlukan otorisasi seperti ini:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}