UIImagePickerController неправильно заявляет «Нет фотографий или библиотек» в библиотеке фотографий - PullRequest
0 голосов
/ 09 апреля 2019

Мое приложение использует Apple UIImagePickerController для получения изображений из библиотеки фотографий.На некоторых телефонах 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>

Есть идеи?Я сбит с толку!

Заранее спасибо.

1 Ответ

0 голосов
/ 09 апреля 2019

Я не вижу статус проверки чека. Посмотрите на эти два способа проверить состояние перед представлением средства выбора и запросить аутентификацию при необходимости.

Первый ( украл из этого ответа ):

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.
}  
...