working - uinavigationbar ios 11 style




Доступ к библиотечной библиотеке iOS11 возможен, даже если для параметров установлено значение «никогда», (3)

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

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


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

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

PHAuthorizationStatus

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

isSourceTypeAvailable

обсуждение

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

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


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

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

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

Об этом вы можете узнать в разговоре WWDC17 о PhotoKit .

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

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

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

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

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

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


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

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

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

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

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