
1. Introducción
1.1 Enfoque técnico y funcional
Los dispositivos móviles almacenan datos personales sensibles por lo que el acceso a recursos como la fototeca, la cámara o la ubicación requiere especial cuidado desde la fase de diseño de la aplicación hasta su puesta en producción. En este artículo, exploraremos como gestionar el acceso a la biblioteca de fotos en iOS usando Xcode, así como las distintas opciones técnicas disponibles según el nivel de acceso necesario.
1.2 Justificación legal
El acceso a la fototeca no es solo una decisión técnica desde el punto de vista de desarrollo, sino que también implica el tratamiento de datos personales. Esto implica obligaciones legales para los desarrolladores, especialmente bajo el Reglamento General de Protección de Datos (RGPD). Analizaremos cuándo es obligatorio solicitar el consentimiento del usuario y cómo hacerlo.
2. Configuración de permisos en iOS
2.1 Privacidad desde el diseño en iOS
Apple aplica el principio de privacidad desde el diseño limitando por defecto el acceso a recursos sensibles y permitiendo al usuario controlar los permisos desde los ajustes del sistema. La App Store revisa cada aplicación para verificar su cumplimiento. Este principio está recogido en el artículo 25 del RGPD y en documentos como el Dictamen 02/2013 sobre las aplicaciones de los dispositivos inteligentes.
2.2. Acceso completo vs. Acceso a contenido seleccionado
Cuando una app necesita acceder a la biblioteca de fotos, existen dos enfoques con diferentes implicaciones técnicas y legales:
2.2.1 Acceso completo (o limitado) mediate PHPhotoLibrary e Info.plist
Declaración de permisos en Info.plist
En este caso, la aplicación debe declarar explícitamente su intención de acceder al recurso en un archivo denominado Info.plist.
El archivo Info.plist es esencial en cualquier app iOS. Contiene información clave de configuración, como el nombre de la app, los idiomas compatibles y los permisos necesarios para interactuar con el sistema operativo. Este archivo se genera automáticamente al crear un nuevo proyecto en Xcode y utiliza un formato de pares clave-valor, donde cada clave define una configuración específica y su valor proporciona detalles adicionales.
📌 Clave | CFBundleDisplayName |
📘 Valor | "ExampleApp" |
📝 Significado | Define el nombre de la app. |
Cuando la aplicación necesite leer fotos o vídeos de la biblioteca —o tanto leer como escribir (guardar) contenido en ella—, será necesario añadir la clave de privacidad NSPhotoLibraryUsageDescription en el archivo Info.plist.

<key>NSPhotoLibraryUsageDescription</key>
<string>To select and preview your photos in the app, photo library access is required.</string>
NSPhotoLibraryUsageDescription
.
Esta declaración es necesaria para que las apps iOS
puedan solicitar acceso a la fototeca del usuario de manera
transparente, cumpliendo con las políticas de privacidad de Apple
y con el RGPD.
Ahora bien, si solo necesita escribir (guardar) imágenes o vídeos en la biblioteca de fotos del usuario y no necesita leer ninguno, se recomienda mejor el uso de la clave NSPhotoLibraryAddUsageDescription.

<key>NSPhotoLibraryAddUsageDescription</key>
<string>This app needs permission to save the images you just created to your photo library.</string>
NSPhotoLibraryAddUsageDescription
.
Posteriormente, cuando la aplicación intente acceder a la biblioteca de fotos, el sistema mostrará automáticamente una alerta que incluirá el nombre de la app y el mensaje definido por el desarrollador en el archivo Info.plist.
Es fundamental que este mensaje sea claro, transparente y directo, preferiblemente en una oración, ya que será lo primero que vea el usuario cuando la app necesite acceder a este recurso. Un mensaje bien redactado inspira confianza y mejora las tasas de consentimiento.

NSPhotoLibraryUsageDescription
en el Info.plist, garantizando
el cumplimiento de las políticas de privacidad de Apple y del
RGPD.
⚠️ Importante
- La alerta de solicitud del permiso no puede mostrarse manualmente. El sistema la activará automáticamente la primera vez que la app intente acceder a la fototeca.
- Si el usuario declina el permiso, otra forma de concederlo es manualmente desde los ajustes del dispositivo.
- Si la app intenta acceder a la biblioteca de fotos sin declarar previamente el permiso en
Info.plist
, el sistema bloqueará la solicitud y la app se cerrará (crash).

NSPhotoLibraryUsageDescription
en Info.plist. En un dispositivo real, la app se cerrará automáticamente sin error visible al usuario.
Acceso a la biblioteca de fotos en iOS: implementación en Swift
El siguiente fragmento de código en Swift muestra cómo solicitar acceso a la biblioteca de fotos (lectura y/o escritura) utilizando PHPhotoLibrary.requestAuthorization
. Este enfoque permite distinguir entre acceso completo o limitado en función del consentimiento otorgado por el usuario.
import UIKit
import Photos
final class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
/// Requests access to the user's photo library
func requestPhotoLibraryPermission() async {
// You can use `.addOnly` if you only need to save images
let accessLevel: PHAccessLevel = .readWrite
let status = await PHPhotoLibrary.requestAuthorization(for: accessLevel)
switch status {
case .authorized:
print("✅ Full access granted")
// You can now freely access the photo library
case .limited:
print("🟡 Limited access granted")
// The user granted access to selected photos only
case .denied:
print("❌ Access denied")
// The user denied the permission
case .restricted:
print("🚫 Access restricted (parental controls or device policies)")
case .notDetermined:
print("🤔 The user has not responded yet")
@unknown default:
print("⚠️ Unknown authorization status")
}
}
/// Button action that triggers the permission request
@IBAction func photoLibrary(_ sender: UIButton) {
Task {
await requestPhotoLibraryPermission()
}
}
}
A partir de iOS 14, Apple introdujo una alternativa más privada para acceder solo a imágenes seleccionadas, sin necesidad de solicitar acceso a la biblioteca, mediante el uso de PHPickerViewController. A continuación, veremos cómo funciona y qué ventajas ofrece desde la perspectiva de la privacidad.
2.2.2 Acceso controlado mediante PHPickerViewController
PHPickerViewController representa un cambio importante en el modelo de permisos de iOS. En lugar de solicitar acceso general a toda la biblioteca de fotos, este componente permite que el usuario seleccione únicamente los elementos que desea compartir, sin que la aplicación vea nada más.
Esta forma de acceso refleja una evolución hacia un mayor control de los datos por parte del usuario y se alinea con el principio de minimización de datos del RGPD (art. 5.1.c).
Si la app solo necesita que el usuario seleccione imágenes de forma manual (p.e. para subir una foto de perfil o para adjuntar una imagen puntual), este enfoque es ideal y no requiere declaración de permisos en Info.plist.
En este caso el usuario selecciona imágenes o videos específicos sin conceder acceso completo a su biblioteca de fotos. Solo las fotos seleccionadas explícitamente por el usuario son devueltas a la app, lo que implica una clara intención de compartir.
import UIKit
import PhotosUI
final class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
// Opens the photo picker with a basic configuration
func openPhotoPicker() {
var configuration = PHPickerConfiguration()
// Filter to show only images (includes Live Photos)
configuration.filter = .images
// Set selection limit: 0 = unlimited, 1 = default single selection
configuration.selectionLimit = 1
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
present(picker, animated: true, completion: nil)
}
@IBAction func openPhotoPicker(_ sender: UIButton) {
openPhotoPicker()
}
}
extension ViewController: PHPickerViewControllerDelegate {
// Handles the user's selection
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true)
guard let itemProvider = results.first?.itemProvider,
itemProvider.canLoadObject(ofClass: UIImage.self) else {
return
}
itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
if let error = error {
print("❌ Failed to load image:", error)
return
}
DispatchQueue.main.async {
if let image = image as? UIImage {
self?.imageView.image = image
}
}
}
}
}
3. Enfoque legal: tratamiento de datos personales
3.1. Marco normativo aplicable
El RGPD regula el tratamiento de datos personales en la UE con independencia del lugar de establecimiento del desarrollador o de publicación de la app. Además, la Directiva 2002/58/CE sobre la privacidad y las comunicaciones electrónicas (en proceso de ser reemplazada por el Reglamento ePrivacy) complementa el RGPD en lo que respecta al almacenamiento y acceso a datos en dispositivos.
• Dato personal: Cualquier información que identifique o pueda identificar a una persona física (art. 4.1 RGPD).
• Identificadores típicos: nombre, número de identificación, ubicación, características físicas, genéticas o sociales, entre otros.
3.2. Responsabilidad del desarrollador
El desarrollador (persona o entidad) que decide sobre los medios y fines del tratamiento es considerado responsable del tratamiento (art. 4.7 RGPD). Ahora bien, si los datos se anonimizan de manera irreversible o no se almacenan fuera del dispositivo esta responsabilidad se reduce significativamente.
3.3. Consentimiento y bases legales
Según el art. 6.1.a el consentimiento del usuario es una de las principales bases legales para el tratamiento de datos personales. En ciertos casos, durante el uso de la app pueden aplicarse otros fundamentos, como la ejecución de un contrato (art. 6.1.b) o intereses legítimos (art. 6.1.f), pero siempre que no se trate de datos sensibles de carácter personal (art. 9 RGPD).
No siempre es necesario que la aplicación solicite permiso explícito, especialmente cuando:
- No accede directamente a los datos, sino que permite al usuario seleccionar activamente el dato que desea compartir (por ejemplo, una foto mediante PHPickerViewController).
- No hay almacenamiento ni procesamiento fuera del dispositivo.
- La app impide el acceso generalizado a los datos del usuario.
3.4 Requisitos para un consentimiento válido
Tal como establece el art. 4.11 del RGPD, el consentimiento del interesado es:
Toda manifestación de voluntad libre, específica, informada e inequívoca por la que el interesado acepta, ya sea mediante una declaración o una clara acción afirmativa, el tratamiento de datos personales que le conciernen.
Este concepto se complementa con el art. 7, que impone condiciones adicionales para que el consentimiento sea jurídicamente válido.
En consecuencia, para que el consentimiento pueda considerarse conforme al RGPD, debe cumplir las siguientes condiciones:
• Libre: El acceso a funcionalidades básicas de la app no debe depender de conceder permisos no esenciales. El usuario debe poder otorgar o denegar su consentimiento sin sufrir consecuencias negativas ni funcionales arbitrarias.
• Específico: El consentimiento debe referirse a cada finalidad concreta de tratamiento. Por ejemplo, el acceso a la biblioteca de fotos no puede amparar el tratamiento de otros datos, como la localización o los contactos, sin una solicitud separada.
• Informado: El usuario debe comprender claramente qué datos se van a tratar, para qué finalidad, durante cuánto tiempo y si se compartirán con terceros. Esta información debe proporcionarse de forma concisa, inteligible y fácilmente accesible, antes de que se realice el tratamiento (p.e. política de privacidad y solictud de acceso).
• Inequívoco: Requiere una acción afirmativa clara por parte del usuario, como tocar un botón o marcar una casilla. No se admite el silencio, las casillas premarcadas ni la inacción como prueba válida de consentimiento.
Ejemplo aplicado al acceso a la fototeca en iOS:
- Solicitar acceso mediante PHPhotoLibrary requiere consentimiento explícito previo (desde el punto de vista de la solicitud del permiso).
- Utilizar PHPickerViewController, en cambio, podríamos decir que se basa en una acción clara e informada del usuario (selección manual de archivos, previa informacion suficientemente detallada en la política de privacidad), sin necesidad de una solicitud de permiso por parte de la app.
En resumen, además de solicitar el consentimiento técnico a través de los mecanismos del sistema operativo —ya sea mediante PHPhotoLibrary o PHPickerViewController—, es fundamental que la app cuente con una política de privacidad accesible, clara y comprensible, donde se detallen las finalidades del tratamiento, el tipo de datos tratados, y los derechos del usuario.
4. Buenas prácticas y cumplimiento
4.1. Minimización de datos y limitación de la finalidad (art. 5.1.b y c del RGPD)
❌ Incorrecto: solicitar acceso completo para subir una sola imagen de forma puntual.
✅ Correcto: permitir la selección manual mediante PHPickerViewController
4.2. Revocación del consentimiento del acceso al recurso protegido
• El usuario puede revocar el permiso desde Ajustes → Nombre de la app → Privacidad → Fotos.
• El usuario también tiene derecho a gestionar sus datos personales ejerciendo los derechos de rectificación, supresión, bloqueo y portabilidad (arts. 12 y 14 RGPD).
• Las apps deben ofrecer mecanismos internos o enlaces externos donde el usuario pueda revisar y modificar los datos tratados.
5. Conclusión
El acceso a la biblioteca de fotos en iOS es un ejemplo claro de como el diseño técnico y el cumplimiento legal deben ir de la mano. Elegir entre solicitar acceso directo o utilizar un selector privado no solo afecta a la experiencia de usuario, sino también al cumplimiento normativo. Adoptar enfoques respetuosos con la privacidad desde el diseño es clave para desarrollar aplicaciones seguras, transparentes y conformes con la legislación vigente.
📚 Bibliografía y fuentes consultadas
- Reglamento (UE) 2016/679 del Parlamento Europeo y del Consejo, de 27 de abril de 2016, relativo a la protección de las personas físicas en lo que respecta al tratamiento de datos personales y a la libre circulación de estos datos y por el que se deroga la Directiva 95/46/CE ( RGPD ).
- Dictamen 02/2013 sobre las aplicaciones de los dispositivos inteligentes. Disponible aquí.
- Documentación para desarrolladores de Apple: NSPhotoLibraryUsageDescription.
- Solicitar acceso a recursos protegidos de Apple: Documentación oficial.