Подтвердить что ты не робот

Доступ к библиотечной библиотеке iOS11 возможен, даже если для установок установлено значение "никогда",

if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
    let imagePicker = UIImagePickerController()
    imagePicker.sourceType = .photoLibrary
    imagePicker.allowsEditing = true
    self.present(imagePicker, animated: true, completion: { })
}

Даже если я установил доступ к фотографиям в настройках "Никогда" с приведенным выше кодом, я все еще могу отображать подборку изображений и показывать фотографии. Я проверил для PHPhotoLibrary.authorizationStatus(), прежде чем показывать его, но я хотел бы знать, это ожидаемое поведение?

4b9b3361

Ответ 1

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


В iOS 11, UIImagePickerController выполняется как отдельный процесс из вашего приложения. Это означает:

  • Ваше приложение не может видеть библиотеку пользователей в целом - она ​​получает доступ только для чтения только для того, какой ресурс пользователь выбирает в подборщике изображений.
  • Из-за (1) вашему приложению не требуется стандартная авторизация конфиденциальности для доступа к библиотеке фотографий. Пользователь явно выбирает конкретный актив (или несколько) для использования в вашем приложении, а это означает, что пользователь предоставляет ваше приложение для чтения рассматриваемого актива (ов).

Вы можете увидеть больше об этом в разговоре WWDC17 о PhotoKit.

(Кстати, эта модель соответствует тому, что вы видели в структуре контактов с iOS 9; если вы показываете контактную панель, приложение получает только однократное падение контактной информации для контактов, выбранных пользователем, а не постоянного доступа для чтения/записи к базе данных контактов, поэтому для выбора контактов не требуется специального разрешения на конфиденциальность.)


PHPhotoLibrary и его статус авторизации отражают глобальное разрешение на чтение/запись для доступа к фотографиям, доступ к которым пользователи могут контролировать из настроек > Конфиденциальность. (Это тот, где нужен ваш Info.plist NSPhotoLibraryUsageDescription.) Любое использование API PHPhotoLibrary требует этого разрешения, независимо от того, использует ли ваше приложение этот API только для записи или только для чтения. Это верно, поскольку PhotoKit был представлен в iOS 8.

Если вы не используете PHPhotoLibrary, PHAsset и т.д., есть более узкие варианты разрешений, которые являются новыми в iOS 11 (а не в API Photos.framework):

  • Как уже отмечалось выше, UIImagePickerController не требует полного разрешения конфиденциальности, поскольку каждое использование предоставляет одноразовый доступ для чтения для выбранных выбранных активов.
  • Если вам нужно только добавить новые ресурсы в библиотеку фотографий, используйте UIImageWriteToSavedPhotosAlbum или UISaveVideoAtPathToSavedPhotosAlbum. С помощью тех, которые вы можете поместить NSPhotoLibraryAddUsageDescription в свой Info.plist, - тогда настройки конфиденциальности системы позволят пользователю понять, что они не дают вам разрешения на просмотр или изменение существующих активов, только для добавления новых.

    Если пользователь предоставляет разрешение только для добавления, он применяется только к тем функциям UIKit - попытка использования PHPhotoLibrary по-прежнему запрашивает (и требует ключ Info.plist для) доступа для чтения/записи.

    См. эту часть беседы WWDC17 для получения дополнительной информации о настройке конфиденциальности только для добавления.

Ответ 2

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

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

Так что, если вы используете только UIImagePickerController я бы посоветовал не смешивать фотографии в.

Отказ от ответственности: не слышал ни о каком официальном заявлении от людей Apple. Эта ветка форума выглядит актуальной, возможно, мы получим ответ там. UPD: вот такая же идея.

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

Ответ 3

Это ожидаемое поведение? - ДА.

Из документов - https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable

Значение true, если устройство поддерживает указанный тип источника; false, если указанный тип источника недоступен.

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

Как вы уже упоминали в этом вопросе, PHPhotoLibrary.authorizationStatus() будет правильным способом проверить это.

Ответ 4

UIImagePickerController и PHPhotoLibrary, отвечающие за разные области.

Вы должны проверить оба: статус auth и доступность источника.

PHAuthorizationStatus

Информация о ваших приложениях авторизация для доступа к пользователям библиотека.

isSourceTypeAvailable

Обсуждение

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

Например, если вы попытка выбрать изображение из библиотеки пользователей, а библиотека - empty, этот метод возвращает false. Аналогично, если камера уже при использовании этот метод возвращает false.