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.userDidTakeScreenshotNotificationCada vez que se presionan los botones físicos (Power + Volume), el sistema publica esta notificación en NotificationCenter.
Nosotros simplemente debemos:
- Suscribirnos a esa notificación
- Ejecutar código cuando ocurra
- 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 = falseY 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 app | Qué hacer |
|---|---|
| Banca | Ocultar datos + alerta |
| Chat | Notificar al servidor |
| Educación | Mostrar advertencia |
| Streaming | Registrar el evento |
| Salud | Bloquear 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









