Dưới đây là hướng dẫn đầy đủ cho iOS 8+ (không có ALAssetLibrary):
Đầu tiên, chúng tôi phải cung cấp mô tả sử dụng vì bây giờ nó được yêu cầu bởi PHPhotoLibrary.
Để làm điều này, chúng ta phải mở info.plist
tệp, tìm khóa Privacy - Photo Library Usage Description
và cung cấp giá trị cho nó. Nếu khóa không tồn tại thì chỉ cần tạo nó.
Đây là một hình ảnh ví dụ:
Đồng thời đảm bảo rằng giá trị của khóa Bundle name
không trống tronginfo.plist
tệp.
Bây giờ khi chúng tôi có mô tả, thông thường chúng tôi có thể yêu cầu ủy quyền bằng requestAuthorization
phương thức gọi :
[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;
}
}];
LƯU Ý 1: requestAuthorization
thực tế không hiển thị cảnh báo trong mỗi cuộc gọi. Nó hiển thị một lần một lúc, lưu câu trả lời của người dùng và trả lại nó mọi lúc thay vì hiển thị lại cảnh báo. Nhưng vì nó không phải là thứ chúng ta cần, đây là một đoạn mã hữu ích luôn hiển thị cảnh báo mỗi khi chúng ta cần sự cho phép (với chuyển hướng đến cài đặt):
- (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];
}
}];
}
});
}
Sự cố thường gặp 1: Một số người dùng phàn nàn rằng ứng dụng không hiển thị cảnh báo sau khi thực hiện các thay đổi nêu trên trong info.plist
tệp.
Giải pháp: Để thử nghiệm, hãy thử thay đổi Bundle Identifier
từ tệp dự án sang tệp khác, làm sạch và xây dựng lại ứng dụng. Nếu nó bắt đầu hoạt động thì mọi thứ vẫn ổn, hãy đổi tên nó trở lại.
Sự cố phổ biến 2: Có một số trường hợp cụ thể khi kết quả tìm nạp không được cập nhật (và các chế độ xem đã sử dụng hình ảnh từ các yêu cầu tìm nạp đó vẫn trống tương ứng) khi ứng dụng nhận được quyền đối với ảnh, trong khi chạy như đã hứa trong tài liệu.
Trên thực tế, nó xảy ra khi chúng ta sử dụng mã SAI như thế này:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
Trong trường hợp này, nếu người dùng từ chối cấp quyền viewDidLoad
sau đó chuyển đến cài đặt, được phép và quay lại ứng dụng, các lượt xem sẽ không được làm mới vì [self reloadCollectionView]
và yêu cầu tìm nạp không được gửi.
Giải pháp: Chúng tôi chỉ cần gọi [self reloadCollectionView]
và thực hiện các yêu cầu tìm nạp khác trước khi yêu cầu ủy quyền như sau:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}