Мое приложение использует UIImagePickerController
Apple для получения изображений из библиотеки фотографий. На некоторых телефонах с iOS 12 отображается пустое средство выбора изображений с сообщением «Нет фотографий или видео». Проблема в том, что в библиотеке телефона есть фотографии.
Делая новый снимок и сохраняя его вне приложения, проблема решается; как только это будет сделано, приложение сможет выбирать из библиотеки фотографий, как обычно.
Вот блок, который передается в UIAlertController
(лист действий, спрашивающий, выбрать ли из камеры или библиотеки):
void (^chooseExistingAction)(void) = ^() {
[self showImagePickerForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
};
Вот метод, который представляет средство выбора изображений:
- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType {
if (![UIImagePickerController isSourceTypeAvailable:sourceType]) {
[self showAlertWithMessage:ImageSourceNotAvailableAlert];
} else {
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = sourceType;
imagePicker.delegate = self;
imagePicker.navigationBar.tintColor = self.navigationController.navigationBar.tintColor;
[self presentViewController:imagePicker animated:YES completion:NULL];
}
}
И, наконец, вот соответствующие ключи из приложения Info.plist
(значения немного отредактированы):
<key>NSCameraUsageDescription</key>
<string>This information will be used to provide visual details about [etc]</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This information will be used to provide visual details about [etc]</string>
Есть идеи? Я сбит с толку!
Заранее спасибо.
Я не вижу проверки статуса аутентификации. Взгляните на эти два способа проверить статус перед представлением средства выбора и запросом аутентификации, если это необходимо.
Первый (украл из этого ответа):
NSString *mediaType = AVMediaTypeVideo;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
if (authStatus == AVAuthorizationStatusAuthorized) {
// do your logic
} else if (authStatus == AVAuthorizationStatusDenied){
// denied
} else if (authStatus == AVAuthorizationStatusRestricted){
// restricted, normally won't happen
} else if (authStatus == AVAuthorizationStatusNotDetermined){
// not determined?!
[AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
if (granted){
NSLog(@"Granted access to %@", mediaType);
} else {
NSLog(@"Not granted access to %@", mediaType);
}
}];
} else {
// impossible, unknown authorization status
}
Второй (украл из этого ответа):
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized) {
// Access has been granted.
} else if (status == PHAuthorizationStatusDenied) {
// Access has been denied.
} else if (status == PHAuthorizationStatusNotDetermined) {
// Access has not been determined.
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized) {
// Access has been granted.
} else {
// Access has been denied.
}
}];
} else if (status == PHAuthorizationStatusRestricted) {
// Restricted access - normally won't happen.
}
Кажется, это то, чего мне не хватает. Спасибо!