นี่คือคำแนะนำฉบับสมบูรณ์สำหรับ iOS 8+ (ไม่มี ALAssetLibrary):
ประการแรกเราต้องให้รายละเอียดการใช้งานในขณะนี้ก็ต้องโดย PHPhotoLibrary
ในการดำเนินการนี้เราต้องเปิดinfo.plist
ไฟล์ค้นหาคีย์Privacy - Photo Library Usage Description
และระบุมูลค่าของมัน หากไม่มีคีย์ให้สร้างขึ้น
นี่คือภาพตัวอย่าง:
ตรวจสอบให้แน่ใจด้วยว่าค่าของคีย์Bundle name
ไม่ว่างเปล่าในinfo.plist
ไฟล์
ตอนนี้เมื่อเรามีคำอธิบายแล้วเราสามารถขอการอนุญาตได้โดยrequestAuthorization
ใช้วิธีการโทร:
[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
}
}]
หมายเหตุ 1: requestAuthorization
ไม่แสดงการแจ้งเตือนทุกครั้งที่โทร แสดงครั้งต่อครั้งบันทึกคำตอบของผู้ใช้และส่งกลับทุกครั้งแทนที่จะแสดงการแจ้งเตือนอีกครั้ง แต่เนื่องจากไม่ใช่สิ่งที่เราต้องการนี่คือรหัสที่มีประโยชน์ซึ่งจะแสดงการแจ้งเตือนทุกครั้งที่เราต้องการการอนุญาต (พร้อมการเปลี่ยนเส้นทางไปยังการตั้งค่า)
- (void)requestAuthorizationWithRedirectionToSettings {
dispatch_async(dispatch_get_main_queue(), ^{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized)
{
}
else
{
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status != PHAuthorizationStatusAuthorized)
{
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];
}
}];
}
});
}
ปัญหาทั่วไป 1:ผู้ใช้บางรายบ่นว่าแอปไม่แสดงการแจ้งเตือนหลังจากทำการเปลี่ยนแปลงinfo.plist
ไฟล์ดังกล่าวข้างต้น
วิธีแก้ไข: สำหรับการทดสอบให้ลองเปลี่ยนBundle Identifier
จากไฟล์โครงการเป็นอย่างอื่นให้ล้างและสร้างแอปใหม่ หากเริ่มทำงานแล้วทุกอย่างเรียบร้อยดีให้เปลี่ยนชื่อกลับ
ปัญหาทั่วไปที่ 2:มีบางกรณีที่ไม่ได้รับการอัปเดตผลลัพธ์การดึงข้อมูล (และมุมมองที่ใช้รูปภาพจากคำขอดึงข้อมูลเหล่านั้นยังคงว่างเปล่าตามนั้น) เมื่อแอปได้รับอนุญาตให้ใช้รูปภาพในขณะที่ทำงานตามที่สัญญาไว้ในเอกสารประกอบ
จริงๆแล้วมันเกิดขึ้นเมื่อเราใช้รหัสผิดเช่นนี้:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
[self reloadCollectionView];
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
}];
}
}
ในกรณีนี้หากผู้ใช้ปฏิเสธการให้สิทธิ์viewDidLoad
แล้วข้ามไปที่การตั้งค่าอนุญาตและข้ามกลับไปที่แอปการดูจะไม่ถูกรีเฟรชเนื่องจาก[self reloadCollectionView]
ไม่ได้ส่งคำขอเรียกข้อมูล
วิธีแก้ไข: เราต้องโทร[self reloadCollectionView]
และทำการร้องขอการดึงข้อมูลอื่น ๆ ก่อนที่จะต้องได้รับอนุญาตเช่นนี้:
- (void)viewDidLoad {
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
}