Ответ 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 для получения дополнительной информации о настройке конфиденциальности только для добавления.