ios - desarrollador - portal apple
El acceso a la biblioteca de fotos iOS11 es posible incluso si la configuraciĆ³n se establece en "nunca" (4)
De acuerdo, puedes juntar todo esto a partir de respuestas y comentarios, pero para intentar contar una historia más completa ...
En iOS 11, UIImagePickerController
ejecuta como un proceso separado de su aplicación. Eso significa:
- Su aplicación no puede ver la biblioteca completa de fotos del usuario: obtiene acceso de solo lectura para los recursos que el usuario elija en el selector de imágenes.
- Debido a (1), su aplicación no necesita la autorización de privacidad estándar para acceder a la biblioteca de fotos. El usuario elige explícitamente un activo específico (o múltiple) para su uso en su aplicación, lo que significa que el usuario le otorga permiso a su aplicación para leer el (los) activo (s) en cuestión.
Puedes ver más sobre esto en la charla de WWDC17 en PhotoKit .
(Por cierto, este modelo coincide con lo que ha visto en el marco de Contactos desde iOS 9; si muestra el selector de contactos, su aplicación solo recibe una sola vez la información de contacto de los contactos que el usuario seleccionó, no acceso de lectura / escritura en curso a la base de datos de Contactos, por lo que el selector de contactos no requiere un permiso de privacidad especial.)
PHPhotoLibrary
y su estado de autorización reflejan el permiso global de lectura / escritura para el acceso a las fotos que los usuarios pueden controlar desde Configuración> Privacidad. (Ese es el lugar en el que su Info.plist necesita NSPhotoLibraryUsageDescription
). Cualquier uso de la API PHPhotoLibrary
requiere este permiso, independientemente de si el uso de esa aplicación de la API es solo para escribir o para leer. Esto ha sido cierto desde que PhotoKit se introdujo en iOS 8.
Si no está utilizando PHPhotoLibrary
, PHAsset
, etc., hay opciones de permisos más estrechos que son nuevas en iOS 11 (y no son parte de la API Photos.framework):
- Como se indicó anteriormente,
UIImagePickerController
no necesita un permiso de configuración de privacidad general porque cada uso otorga acceso de lectura por única vez para los activos específicos elegidos. Si solo necesita agregar nuevos activos a la biblioteca de fotos, use
UIImageWriteToSavedPhotosAlbum
oUISaveVideoAtPathToSavedPhotosAlbum
. Con esos, puede ponerNSPhotoLibraryAddUsageDescription
en su lista de información. Luego, la Configuración de privacidad del sistema dejará en claro al usuario que no está dando su permiso para ver o modificar los activos existentes, solo para agregar nuevos.Si el usuario otorga el permiso de agregar solo, se aplica solo a esas funciones de UIKit; el intento de usar
PHPhotoLibrary
aún solicitará (y requerirá la clave de Lista de información para) el acceso de lectura / escritura.Vea esta parte de la charla sobre WWDC17 para obtener más información sobre la configuración de privacidad de solo agregar.
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 en "Nunca" con el código anterior, todavía puedo presentar el selector de imágenes y mostrar fotos. Verificaré PHPhotoLibrary.authorizationStatus()
antes de mostrarlo, pero me gustaría saber si es este comportamiento esperado.
Este (nuevo) comportamiento me suena lógico, he aquí por qué. Al usar UIImagePickerController
tu aplicación no obtiene acceso a ninguna foto. Solo ve el que su usuario ha elegido, cuando eso sucede; y si el usuario pulsa Cancelar en el selector, ninguno de ellos estará disponible para la aplicación.
PHPhotoLibrary
es parte de un marco separado, Photos , donde puedes hacer muchas cosas con la biblioteca de fotos del usuario y, por lo tanto, necesitas permiso.
Por lo tanto, si solo está utilizando UIImagePickerController
, sugeriría no mezclar cosas de Photos.
Descargo de responsabilidad: no he oído hablar de ninguna declaración oficial de la gente de Apple. Este hilo del foro parece relevante, tal vez obtengamos una respuesta allí.
Además, si eres lo suficientemente malo, teóricamente puedes UIImagePickerController
con la jerarquía de vistas de UIImagePickerController
en el tiempo de ejecución y examinar lo que el usuario ve allí. Pero eso es otra vez para Apple con quien lidiar, deberíamos ser agradables :-)
UIImagePickerController y PHPhotoLibrary responsables de diferentes áreas.
Debe verificar tanto el estado de autenticación como la disponibilidad de la fuente.
Estado de autorizacion
Información sobre la autorización de su aplicación para acceder a la biblioteca de fotos del usuario.
isSourceTypeAvailable
Discusión
Debido a que es posible que una fuente de medios no esté presente o no esté disponible , es posible que los dispositivos no siempre admitan todos los tipos de fuentes.
Por ejemplo , si intenta seleccionar una imagen de la biblioteca del usuario y la biblioteca está vacía, este método devuelve falso. De manera similar, si la cámara ya está en uso, este método devuelve falso.
¿Es este el comportamiento esperado? - si
De los documentos: https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable
true si el dispositivo admite el tipo de fuente especificado; Falso si el tipo de fuente especificado no está disponible.
Le informa si el dispositivo es compatible con 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.