Пустое поле выбора изображения UIImagePickerController и PHPickerViewController в iOS14

Если бы это работало на последних нескольких версиях iOS, но на 14 не удалось заставить это работать, я провел последние 5 дней в Google.

Когда я иду добавить изображение из галереи, всплывающее окно для выбора изображения пустое.

Я пробовал UIImagePickerController(который отлично работает с iOS13 и ниже) и новый PHPickerViewController.

До iOS14 работало то, что пользователь нажимает кнопку панели, чтобы "добавить изображение", и всплывающее окно предлагает выбрать из галереи, а затем представляет средство выбора изображений в вашей галерее.

Я установил Info.plist "Конфиденциальность - описание использования библиотеки фотографий" для UIImagePickerController, я знаю, что PHPickerViewController не нуждается в химической завивке, поскольку он обрабатывает получение изображения за вас.

Я также время от времени встречал это пурпурное предупреждение, в котором говорилось, что "xxxx необходимо использовать только из основного потока", никогда не видел этого раньше до нового Xcode.

Любая помощь приветствуется. Запуск Xcode 12.0.1 (12A7300), симуляторы под управлением iOS14.

Адам

       class AddCustomExerciseViewController: UIViewController, UITextViewDelegate, UINavigationControllerDelegate, GADBannerViewDelegate, UIImagePickerControllerDelegate, PHPickerViewControllerDelegate{

let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
        alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in self.openGallery() }))
        alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))
        self.present(alert, animated: true, completion: nil)

func openGallery()
{
    let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        switch photoAuthorizationStatus {
        case .authorized:
            self.showGallery()
            print("Access is granted by user")
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization({
                (newStatus) in
                print("status is \(newStatus)")
                if newStatus ==  PHAuthorizationStatus.authorized {
                    self.showGallery()
                    print("success")
                }
            })
            print("It is not determined until now")
        case .restricted:
            // same same
            print("User do not have access to photo album.")
        case .denied:
            // same same
            print("User has denied the permission.")
        case .limited:
            // same same
            print("User has denied the permission.")
        }
}

func showGallery()
{
    if #available(iOS 14, *)
    {
        var configuration = PHPickerConfiguration()
        configuration.filter = .images
        configuration.selectionLimit = 0
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        self.present(picker, animated: true, completion: nil)
    }
    else
    {
                
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.allowsEditing = false
            imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
            self.present(imagePicker, animated: true, completion: nil)
        }
        else
        {
            let alert  = UIAlertController(title: "Warning", message: "You don't have permission to access gallery.", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        
        //get the file url
        if let fileUrl = info[UIImagePickerControllerImageURL] as? URL {
            print(fileUrl)
            print(fileUrl.lastPathComponent)
            let filePath = fileUrl.lastPathComponent
            
            if(filePath.hasSuffix("GIF")||filePath.hasSuffix("gif"))
            {
                //to change later to support gifs
                gifView.image = pickedImage
            }
            else
            {
                //to show the static image to users
                gifView.image = pickedImage
            }
            //for saving the file name to retrieve in local parse datastore
            imageNameToSave = fileUrl.lastPathComponent
        }
        //for saving the selected image
        imageToSave = pickedImage
    }
    picker.dismiss(animated: true, completion: nil)
}
@available(iOS 14, *)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult])
{
   picker.dismiss(animated: true, completion: nil)
   for result in results
   {
      result.itemProvider.loadObject(ofClass: UIImage.self, completionHandler: { (object, error) in
         if let image = object as? UIImage {
            DispatchQueue.main.async {
               // Use UIImage
               print("Selected image: \(image)")
            }
         }
      })
   }
}  }

2 ответа

В iOS 14 диалоговое окно разрешения ограниченного выбора изображений открывается в отдельном потоке, поэтому при возврате авторизации вам нужно будет выполнять задачи пользовательского интерфейса в основном потоке.

PHPhotoLibrary.requestAuthorization({
        (newStatus) in
    DispatchQueue.main.async {
        print("status is \(newStatus)")
        if newStatus ==  PHAuthorizationStatus.authorized {
            self.showGallery()
            print("success")
        }
    }
})

Если это полезно для кого-то еще, я обнаружил, что редактирование фона прокси-сервера для просмотра прокрутки вызвало ошибку как в UIImagePickerController, так и в PHPickerViewController, не позволяющую им отображать изображения в iOS 14 и выше. Я отредактировал фоновый прокси для просмотра прокрутки, потому что он черный даже в светлом режиме. После нескольких часов поиска в Google и тестирования я обнаружил, что удаление модификации фона внешнего вида на прокси-сервере scrollview позволило средствам выбора изображений функционировать должным образом. Я отправил отчет об ошибке в Apple. Строка кода, вызвавшая ошибку, была следующей:

      UIScrollView.appearance().backgroundColor = .systemBackground
Другие вопросы по тегам