Programación en Swift y SwiftUI para iOS Developers

Cómo detectar capturas de pantalla en una app iOS usando SwiftUI

Las capturas de pantalla son una función básica del sistema operativo iOS, pero en muchas aplicaciones pueden representar un problema de privacidad, seguridad o control de contenido. Apps bancarias, de mensajería, educación o streaming necesitan saber cuándo un usuario ha realizado una captura para poder reaccionar: mostrar una advertencia, ocultar datos sensibles o registrar un evento.

En este tutorial aprenderás cómo detectar cuando un usuario hace una captura de pantalla en una app desarrollada con SwiftUI, usando herramientas nativas de iOS, Xcode y UIKit integradas con SwiftUI.

Aprenderás:

  • Cómo funciona el sistema de notificaciones de capturas en iOS
  • Cómo usar UIApplication.userDidTakeScreenshotNotification
  • Cómo integrarlo en SwiftUI
  • Cómo mostrar alertas o ejecutar acciones
  • Cómo ocultar información sensible
  • Buenas prácticas y limitaciones

Este tutorial está pensado tanto para desarrolladores principiantes como intermedios que ya estén creando aplicaciones con SwiftUI.


🧠 ¿Por qué detectar capturas de pantalla?

Apple no permite bloquear ni impedir capturas de pantalla en iOS (por motivos de accesibilidad y control del usuario), pero sí permite detectar cuando ocurren.

Algunos casos de uso reales:

  • Apps bancarias → advertir al usuario
  • Apps de mensajería → notificar al otro usuario
  • Apps de cursos → evitar que se compartan materiales
  • Apps médicas → proteger datos personales
  • Apps empresariales → auditar fugas de información

SwiftUI por sí mismo no tiene una API directa para esto, pero podemos usar UIKit perfectamente desde SwiftUI.


🧩 Cómo funciona internamente

iOS emite una notificación del sistema cuando el usuario hace una captura de pantalla:

UIApplication.userDidTakeScreenshotNotification

Cada vez que se presionan los botones físicos (Power + Volume), el sistema publica esta notificación en NotificationCenter.

Nosotros simplemente debemos:

  1. Suscribirnos a esa notificación
  2. Ejecutar código cuando ocurra
  3. Integrarlo en SwiftUI

🛠️ Paso 1 – Crear un proyecto SwiftUI en Xcode

Abre Xcode y crea un nuevo proyecto:

  • Template: iOS App
  • Interface: SwiftUI
  • Language: Swift

Llama al proyecto por ejemplo:
ScreenshotDetector


📡 Paso 2 – Escuchar la notificación del sistema

UIKit publica la notificación cuando se realiza una captura:

NotificationCenter.default.addObserver(
    forName: UIApplication.userDidTakeScreenshotNotification,
    object: nil,
    queue: .main
) { notification in
    print("El usuario ha hecho una captura")
}

Pero en SwiftUI no usamos observers manuales normalmente. Vamos a integrarlo con el ciclo de vida de una vista.


🔗 Paso 3 – Crear un detector de capturas

Creamos una clase observable que detecte capturas.

import SwiftUI
import UIKit

class ScreenshotDetector: ObservableObject {
    
    @Published var didTakeScreenshot = false
    
    init() {
        NotificationCenter.default.addObserver(
            forName: UIApplication.userDidTakeScreenshotNotification,
            object: nil,
            queue: .main
        ) { _ in
            self.didTakeScreenshot = true
        }
    }
}

Esta clase escucha la notificación del sistema y actualiza una propiedad observable que SwiftUI puede usar.


🧱 Paso 4 – Usar el detector en SwiftUI

Ahora integramos esto en una vista SwiftUI.

struct ContentView: View {
    
    @StateObject private var screenshotDetector = ScreenshotDetector()
    @State private var showAlert = false
    
    var body: some View {
        VStack(spacing: 20) {
            Text("Información confidencial")
                .font(.title)
            
            Text("Número de cuenta: 1234 5678 9012")
                .font(.headline)
                .foregroundColor(.red)
        }
        .padding()
        .onChange(of: screenshotDetector.didTakeScreenshot) { newValue in
            if newValue {
                showAlert = true
                screenshotDetector.didTakeScreenshot = false
            }
        }
        .alert("Captura detectada",
               isPresented: $showAlert) {
            Button("Aceptar", role: .cancel) { }
        } message: {
            Text("Has realizado una captura de pantalla. Esta acción ha sido registrada.")
        }
    }
}

Ahora, cuando el usuario haga una captura, aparecerá una alerta.


🔐 Paso 5 – Ocultar contenido sensible tras una captura

Una técnica común es ocultar datos después de que se haga una captura.

@State private var hideData = false

Y en el detector:

.onChange(of: screenshotDetector.didTakeScreenshot) { _ in
    hideData = true
}

Luego modificamos la vista:

if hideData {
    Text("Contenido oculto por seguridad")
        .foregroundColor(.gray)
} else {
    Text("Número de cuenta: 1234 5678 9012")
        .foregroundColor(.red)
}

Esto no evita la captura, pero impide que el usuario siga viendo los datos después.


🧪 Paso 6 – Probar en un dispositivo real

⚠️ Importante:
Las capturas NO se detectan correctamente en el simulador. Debes probar en un iPhone real.

Ejecuta la app en tu iPhone, presiona:
Botón lateral + Volumen arriba

Verás que la alerta aparece inmediatamente.


🛡️ Paso 7 – Bloquear capturas en pantallas concretas (truco)

Apple no permite bloquear capturas… pero hay un truco usando vistas seguras de UIKit.

Creamos una vista que iOS trata como campo protegido:

struct SecureView<Content: View>: UIViewRepresentable {
    
    let content: Content
    
    func makeUIView(context: Context) -> UIView {
        let textField = UITextField()
        textField.isSecureTextEntry = true
        
        let hosting = UIHostingController(rootView: content)
        hosting.view.translatesAutoresizingMaskIntoConstraints = false
        
        textField.addSubview(hosting.view)
        
        NSLayoutConstraint.activate([
            hosting.view.topAnchor.constraint(equalTo: textField.topAnchor),
            hosting.view.bottomAnchor.constraint(equalTo: textField.bottomAnchor),
            hosting.view.leadingAnchor.constraint(equalTo: textField.leadingAnchor),
            hosting.view.trailingAnchor.constraint(equalTo: textField.trailingAnchor)
        ])
        
        return textField
    }
    
    func updateUIView(_ uiView: UIView, context: Context) { }
}

Y lo usamos así:

SecureView {
    Text("Contenido ultra confidencial")
        .font(.title)
}

Esto hará que el contenido aparezca negro en la captura de pantalla.


⚠️ Limitaciones legales y técnicas

Apple establece que:

  • No puedes impedir que el usuario haga capturas
  • No puedes sancionar al usuario por hacerlas
  • Solo puedes notificar o proteger datos

Además:

  • No puedes detectar grabación de pantalla con la misma fiabilidad
  • Las notificaciones llegan después de la captura

🧩 Casos de uso reales

Tipo de appQué hacer
BancaOcultar datos + alerta
ChatNotificar al servidor
EducaciónMostrar advertencia
StreamingRegistrar el evento
SaludBloquear vista segura

🧠 Buenas prácticas

  • Informa al usuario en tu política de privacidad
  • No abuses de las alertas
  • Usa SecureView solo para datos sensibles
  • Registra el evento si es necesario

🏁 Conclusión

Detectar capturas de pantalla en una app hecha con SwiftUI es completamente posible gracias a las notificaciones del sistema de UIKit. Con unas pocas líneas de código puedes:

  • Saber cuándo el usuario hace una captura
  • Mostrar alertas
  • Ocultar información
  • Proteger vistas sensibles

Aunque no puedes impedir que se haga una captura, puedes controlar cómo reacciona tu aplicación, lo que es esencial en apps modernas que manejan datos privados.

Con SwiftUI y Xcode, este tipo de integración es sencilla, potente y totalmente compatible con las normas de Apple.

Si tienes cualquier duda sobre este artículo, contacta conmigo y estaré encantado de ayudarte 🙂. Puedes contactar conmigo en mi perfil de X o en mi perfil de Instagram

Leave a Reply

Your email address will not be published. Required fields are marked *

Previous Article

Edición de Texto Enriquecido con TextView y AttributedString en SwiftUI 

Next Article

Cómo permitir que los usuarios compartan contenido en SwiftUI usando ShareLink

Related Posts