Сообщение об ошибке средства выбора при выходе (обнаружено при обнаружении расширений: домен ошибки = код PlugInKit = 13) с Swift 4 — Xcode 9

Похожий на

Ошибка обнаружения PhotoPicker: Error Domain=PlugInKit Code=13

а также

https://forums.developer.apple.com/thread/82105

НО я пробовал все эти предложения и все еще получаю сообщение об ошибке в журнале отладки. Запуск Swift 4 XCode 9A235

То, что было предложено в разных местах, было ...

  • некоторые люди сказали добавить @objc
  • некоторые люди сказали добавить внутренний
  • некоторые люди предлагали добавить _ и убедиться, что используется Any, а не AnyObject
  • некоторые люди говорили, что используют didFinishPickingImageWithInfo (для меня это не возвращает изображение)
  • некоторые люди сказали уволить сборщика, другие сказали уволить себя, третьи сказали уволить обоих
  • некоторые сказали добавить «Конфиденциальность...» в plist (сделано)
  • добавлен импорт фото
  • добавлен предыдущий вызов для принудительного PHPhotoLibrary.requestAuthorization() { (status) -> Void in ...

Я НЕ получил эту проблему в Swift 3 - предыдущий xcode. Но со Swift 4 я пробовал все, что предлагал, и все равно получаю следующую ошибку.

Ошибки [обнаружения], обнаруженные при обнаружении расширений: Error Domain=PlugInKit Code=13 "запрос отменен" UserInfo={NSLocalizedDescription=запрос отменен

Средство выбора работает нормально, и я ДЕЙСТВИТЕЛЬНО выбираю изображение из фотографий, но я получаю это сообщение об ошибке при выходе из средства выбора (отмена или выбор) каждый раз...

Любые предложения, как остановить сообщение об ошибке? Кроме списка вещей, предлагаемых по двум другим ссылкам (кратко изложенным выше)

мой метод

@objc internal func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    imageSelected = nil

    if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
        imageSelected = editedImage
    } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
        imageSelected = originalImage
    }

    if  imageSelected != nil {
        handleSelectedImage()   // override in subclass to do something with the returned image
    }
    picker.dismiss(animated: true, completion: nil)   // mess of calling both dismiss to see if it helps - it does not
    dismiss(animated: true, completion: nil)
}

person john    schedule 06.10.2017    source источник


Ответы (10)


  1. добавить «Конфиденциальность...» в plist
  2. В меню Xcode откройте: «Продукт»> «Схема»> «Редактировать схему»> «В переменных среды» установите OS_ACTIVITY_MODE в наборе значений, отключите

см. в mc-system- групповой-контейнер-и-MC-чтение-из-общедоступных-эффективных-пользовательских-настроек-ошибка

Работа мне подходит

РЕДАКТИРОВАТЬ

если это может помочь ниже моего кода (работает с xcode 9)

if libraryAuthorization == .authorized {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
        imagePicker.allowsEditing = false
        imagePicker.view.tag = button.tag
        self.present(imagePicker, animated: true, completion: nil)
    }
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let pickerImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        photoContainer.addImageToButton(pickerImage, buttonTag: picker.view.tag)
        dismiss(animated: true)
    }
}
person Antoine Richeux    schedule 09.10.2017
comment
Можем ли мы получить версию для Objective-C? - person Reza.Ab; 27.01.2018
comment
Можете ли вы объяснить, что это делает или почему это работает? Я не решаюсь добавить параметр, не понимая последствий. Большое спасибо, кажется, этот ответ хорошо работает для некоторых! (хотя и не все) - person woody121; 02.05.2018
comment
После небольшого поиска кажется, что это отключает ведение журнала. Скрытие сообщения не является исправлением в моей книге. - person Henrik; 20.11.2018
comment
Отключение OS_ACTIVITY_MODE звучит как притворство, что проблемы не существует, и надежда на лучшее. Я бы никогда не рекомендовал это - person Ky Leggiero; 05.02.2021

Для Свифт 4:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    guard let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {
        return
    }
    ...
}
  • В параметре метода измените [String: Any] на [UIImagePickerController.InfoKey : Any].
  • На выбранном изображении измените info["UIImagePickerControllerOriginalImage"] на info[UIImagePickerController.InfoKey.originalImage].
person Andre Racco    schedule 05.09.2018
comment
Это определенно тот, который помог мне. Исходный метод делегата imagePickerController didFinishPickingImage никогда не вызывался — его пришлось обновить до нового метода делегата. - person Misha Stone; 18.01.2019

Это связано с тем, что ваше приложение использует библиотеку фотографий (в данном случае с помощью UIImagePickerController) без запроса разрешения пользователя. Например, если я хочу показать средство выбора изображений при нажатии кнопки добавления:

@IBAction func addButtonTapped(_ sender: UIBarButtonItem) {
    checkPermission {
        let picker = UIImagePickerController()
        picker.sourceType = .photoLibrary
        picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!

        picker.delegate = self
        picker.allowsEditing = false
        self.present(picker, animated: true, completion: nil)
    }
}

func checkPermission(hanler: @escaping () -> Void) {
    let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
    switch photoAuthorizationStatus {
    case .authorized:
        // Access is already granted by user
        hanler()
    case .notDetermined:
        PHPhotoLibrary.requestAuthorization { (newStatus) in
            if newStatus == PHAuthorizationStatus.authorized {
                // Access is granted by user
                hanler()
            }
        }
    default:
        print("Error: no access to photo album.")
    }
}

Кроме того, необходимо добавить это в свой plist:

<key>NSPhotoLibraryUsageDescription</key>
<string>So that you can add images for your cloth. </string>

сообщение, отображаемое в диалоговом окне разрешений.

person Yuchen    schedule 17.11.2017
comment
Вау, спасибо, это исправило мою ошибку! У меня был только NSPhotoLibraryUsageDescription... странно, это было трудно отлаживать! - person Romy Ilano; 22.04.2018

У меня была такая же проблема, и я пробовал все решения, которые мог найти, но ничего не помогло. Просто спросил себя, что может случиться с делегатом, чтобы он не сработал: освобождение делегата!

И это было в моем случае! При представлении UIImagePickerController мой экземпляр class ImagePickerController : NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate, который не является контроллером представления представления, будет освобожден напрямую. Конечно, функции делегата больше не могут выполняться.

Просто поставьте точку останова в deinit (или dealloc в мире Objective-C) и посмотрите, освобождается ли ваш делегат.

person Kai    schedule 04.12.2017

Пользователь спрашивает: «*Есть предложения, как остановить сообщение об ошибке? Кроме списка вещей, предлагаемых по двум другим ссылкам (кратко изложенным выше)».

Я использовал два шага, чтобы устранить сообщение об ошибке. Престижность человеку выше Антуана Ришо https://stackoverflow.com/users/5767821/antoine-richeux.< br> Я думаю, что добавление конфиденциальности в pList может не понадобиться, по крайней мере, в моем случае

ШАГ 1. В строке меню выберите: Продукт > Схема > Редактировать схему > выберите "Выполнить" в левом списке "Создать, выполнить... Архивировать" "Выбрать аргументы из верхнего набора". вариантов на правой стороне - см. прилагаемую картинку. Используйте кнопку + в разделе «Переменные среды», чтобы добавить новую запись Имя: OS_ACTIVITY_MODE Значение: отключить

Это показывает, куда добавить переменную среды

ШАГ 2. Очистите проект и перестройте

person ZUser    schedule 06.04.2018

Убедитесь, что вы объявили, что ваш класс реализует UINavigationControllerDelegate.

extension MyViewController: UINavigationControllerDelegate {}

По какой-то причине в Xcode 9.0 меня предупредили объявить делегат как таковой:

imagePicker.delegate = self as? UIImagePickerControllerDelegate & UINavigationControllerDelegate
person user339946    schedule 10.10.2017
comment
Сделал это и реализовал протокол, иначе я бы не получил выбранное изображение. Все еще получаю эту ошибку. - person valeCocoa; 11.10.2017
comment
попробовал ... imagePicker.delegate = self as UIImagePickerControllerDelegate & UINavigationControllerDelegate .. и все равно получаю ошибку. Просто делал = сам. но без разницы - person john; 12.10.2017
comment
Извините, я все еще получаю сообщение журнала, это решение на самом деле, если вы не можете получить метод делегата для выбора изображения. Я предполагаю, что сообщение журнала - это просто ошибка xcode, которая в конечном итоге будет исправлена. - person user339946; 12.10.2017

Можете ли вы попробовать это?

extension YourProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        log.debug("Called imagePickerController function ")
        let image = info[UIImagePickerControllerOriginalImage] as? UIImage
        self.dismiss(animated: true) {
            self.yourProfileImageView.image = image
        }
    }
}
person eemrah    schedule 26.04.2018

У меня также была эта проблема. Это очень раздражает, потому что появляется ошибка консоли, но приложение все еще загружает изображение. Я запросил статус авторизации, добавил свои ключи в .plst, но не нашел ничего из этого, чтобы выполнить работу.

После того, как я перешел в Product -> Scheme -> Edit Scheme -> Run, добавил ключ: "OS_ACTIVITY_MODE", значение: "disable", очистил и переустановил... ошибка ушла.

person Richard Poutier    schedule 10.07.2018
comment
Этот работал для меня. Это происходит только в симуляторе, но я все же могу получить изображение. - person FonzTech; 02.08.2018

Была такая же проблема в Swift 4.2 и Xcode 10.0. Хотя средство выбора изображений работало правильно, Xcode показал эту ошибку на консоли. Чтобы избавиться от этого:

  • В меню Xcode «Продукт» > «Схема» > «Редактировать схему»
  • Выберите вкладку «Выполнить», затем «Аргументы».
  • В разделе «Переменные среды» добавьте переменную с именем OS_ACTIVITY_MODE и значением disable.
person Marcos Reboucas    schedule 14.10.2018
comment
Это просто скрывает сообщение из журнала. - person jhamu; 01.12.2018

var messageImage = UIImage()

    @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        self.dismiss(animated: true, completion: { () -> Void in

        })
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
        {
            messageImage = image

        }
        print("Image Captured")
    }

Вам нужно принести UIImagePickerController.InfoKey.originalImage, а не UIImagePickerController.InfoKey.editedImage

person Deviyani Swami    schedule 21.05.2019