Press ESC to close

Acceso a Recursos Protegidos en iOS: Guía Técnica y Legal sobre la Fototeca

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.

Ejemplo en Xcode del archivo Info.plist con la clave NSPhotoLibraryUsageDescription para solicitar permiso de acceso a la fototeca en iOS según RGPD.
<key>NSPhotoLibraryUsageDescription</key>
<string>To select and preview your photos in the app, photo library access is required.</string>
    
Fragmento del archivo Info.plist en Xcode mostrando la clave 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.

Ejemplo en Xcode del archivo Info.plist con la clave NSPhotoLibraryAddUsageDescription para guardar imágenes en la fototeca en apps iOS.
<key>NSPhotoLibraryAddUsageDescription</key>
<string>This app needs permission to save the images you just created to your photo library.</string>
Comparativa de la clave de privacidad 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.

Alerta nativa de iOS solicitando permiso para acceder a la fototeca del usuario, configurada con la clave NSPhotoLibraryUsageDescription en el archivo Info.plist.
Ejemplo de alerta de permiso en iOS para acceder a la fototeca o galería de imágenes. Este mensaje se genera automáticamente a partir de la clave 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).
  • Consola de Xcode mostrando crash por falta de clave NSPhotoLibraryUsageDescription en Info.plist
    Consola de Xcode mostrando un crash al ejecutar la app sin la clave 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.
Reflexiones de alguien que disfruta investigando y conectando temas; no es asesoría legal.