El acceso a la biblioteca fotográfica iOS11 es posible incluso si la configuration se establece en "nunca"

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

Incluso si configuro el acceso a Fotos en Configuración a "Nunca" con el código anterior, todavía puedo presentar el selector de imágenes y mostrar fotos. PHPhotoLibrary.authorizationStatus() antes de mostrarlo, pero me gustaría saber si se trata de un comportamiento esperado.

¿Es este comportamiento esperado? – SÍ.

Desde los documentos – https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypdisponible

verdadero si el dispositivo admite el tipo de fuente especificado; falso si el tipo de fuente especificado no está disponible.

Le indica si el dispositivo admite el tipo de fuente y no si la aplicación tiene permiso para acceder a él.

Como ya mencionó en la pregunta, PHPhotoLibrary.authorizationStatus() sería la forma correcta de verificar esto.

De acuerdo, puedes orderar esto de las respuestas y los comentarios, pero tratar de contar una historia más completa …


En iOS 11, UIImagePickerController ejecuta como un process separado de su aplicación. Eso significa:

  1. Su aplicación no puede ver la biblioteca de fotos completa del usuario: obtiene acceso de solo lectura para los activos que el usuario elija en el selector de imágenes.
  2. Debido a (1), su aplicación no necesita la autorización de privacidad estándar para el acceso a la biblioteca de fotos. El usuario elige explícitamente un activo específico (o múltiple) para usarlo en su aplicación, lo que significa que el usuario otorga permiso a su aplicación para leer los activos en cuestión.

Puede ver más sobre esto en la charla WWDC17 en PhotoKit .

(Por cierto, este model coincide con lo que ha visto en el marco de contactos desde iOS 9: si muestra el selector de contactos, su aplicación solo obtiene una sola gota de información de contacto para los contactos que seleccionó el usuario, no acceso continuo de lectura / escritura a la database de contactos, por lo que el selector de contacto no requiere un permiso de privacidad especial).


PHPhotoLibrary y su estado de autorización reflejan el permiso global de lectura / escritura para el acceso de Fotos que los usuarios pueden controlar desde Configuración> Privacidad. (Ese es el sitio donde su Info.plist necesita NSPhotoLibraryUsageDescription ). Cualquier uso de la API de PHPhotoLibrary requiere este permiso, independientemente de si el uso de esa API por parte de la aplicación es solo para escribir o solo para leer. Esto ha sido cierto desde que PhotoKit se introdujo en iOS 8.

Si no está utilizando PHPhotoLibrary , PHAsset , etc., existen opciones de permiso más estrechas que son nuevas en iOS 11 (y no forman parte de la API Photos.framework):

  • Como se indicó anteriormente, UIImagePickerController no necesita un permiso general de configuration de privacidad porque cada uso otorga acceso de lectura único para los activos específicos elegidos.
  • Si solo necesita agregar nuevos resources a la biblioteca de Fotos, utilice UIImageWriteToSavedPhotosAlbum o UISaveVideoAtPathToSavedPhotosAlbum . Con ellos, puede poner NSPhotoLibraryAddUsageDescription en su Info.plist, luego la configuration de privacidad del sistema dejará en claro al usuario que no están dando su permiso para ver o modificar los activos existentes, solo para agregar otros nuevos.

    Si el usuario otorga permiso de solo agregado, solo se aplica a esas funciones de UIKit; intentar usar PHPhotoLibrary todavía solicitará (y requerirá la key de Info.plist) acceso de lectura / escritura.

    Vea esta parte de la charla WWDC17 para get más información sobre la configuration de privacidad de solo agregar.

UIImagePickerController y PHPhotoLibrary responsables de diferentes áreas.

Debe verificar ambos: estado de authentication y disponibilidad de fuente.

PHAuthorizationStatus

Información sobre la autorización de su aplicación para acceder a la biblioteca de fotos del usuario.

isSourceTypeDisponible

Discusión

Debido a que una fuente de medios puede no estar presente o no estar disponible , es posible que los dispositivos no siempre admitan todos los types de fuente.

Por ejemplo , si intenta elegir una image de la biblioteca del usuario y la biblioteca está vacía, este método devuelve falso. De manera similar, si la camera ya está en uso, este método devuelve falso.

Este (nuevo) comportamiento me parece lógico, he aquí por qué. Al usar UIImagePickerController su aplicación en realidad no tiene acceso a ninguna foto. Solo ve el que ha elegido tu usuario, cuando eso sucede; y si el usuario toca Cancelar en el selector, ninguno de ellos estará disponible para la aplicación.

PHPhotoLibrary es parte de un marco separado, Fotos , donde puede hacer muchas cosas con la biblioteca de fotos del usuario y, por lo tanto, necesita permiso.

Así que si solo estás usando UIImagePickerController , sugeriría que no se mezclen cosas de fotos.

Descargo de responsabilidad: no he tenido noticias de ninguna statement oficial de la gente de Apple. Este hilo del foro parece relevante, tal vez recibamos una respuesta allí.

Además, si eres lo suficientemente malvado, teóricamente puedes UIImagePickerController con la jerarquía de vista de UIImagePickerController en time de ejecución y examinar lo que el usuario vea allí. Pero eso es otra vez para que Apple se ocupe, deberíamos estar bien 🙂

En realidad, debería ser un error y se solucionará pronto en la próxima versión. Porque enfrenté el mismo problema y también puse esto como un error en el rastreador de errores de Apple pero no obtuve una respuesta.

También como estoy pensando que es un error grave porque afecta al nivel de security directo y debería solucionarlo lo más pronto posible.