Para lograr un bloqueo automático de pantalla personalizado en una aplicación iOS, se requiere capturar la inactividad del usuario y redirigir a una vista de bloqueo definida. A continuación, se describe un enfoque utilizando Objective-C.
Concepto básico: Utilizar un temporizador (NSTimer) para controlar el intervalo de inactividad. Reiniciar el temporizador cuando se detecten interacciones del usuario, como toques en la pantalla o entradas de teclado.
Configuración del temporizador en AppDelegate
En el AppDelegate, se definen métodos para iniciar, reiniciar el temporizador y mostrar la pantalla de bloqueo.
// AppDelegate.m
@interface AppDelegate ()
@property (nonatomic, strong) NSTimer *temporizadorInactividad;
@property (nonatomic, assign) NSTimeInterval intervaloBloqueo;
@property (nonatomic, weak) UIViewController *controladorVistaActual;
@end
@implementation AppDelegate
- (void)iniciarTemporizador {
if (!self.temporizadorInactividad) {
self.intervaloBloqueo = 15.0; // Intervalo en segundos
self.temporizadorInactividad = [NSTimer scheduledTimerWithTimeInterval:self.intervaloBloqueo
target:self
selector:@selector(mostrarPantallaBloqueo)
userInfo:nil
repeats:YES];
}
}
- (void)reiniciarTemporizador {
[self.temporizadorInactividad invalidate];
self.temporizadorInactividad = nil;
[self iniciarTemporizador];
}
- (void)mostrarPantallaBloqueo {
if (self.controladorVistaActual) {
PantallaBloqueoViewController *vistaBloqueo = [[PantallaBloqueoViewController alloc] init];
[self.controladorVistaActual presentViewController:vistaBloqueo animated:YES completion:nil];
}
}
@end
Captura de interacciones del usuario
Para detectar toques en cualquier parte de la aplicación, se subclase UIWindow y se sobreescribe el método sendEvent:.
// VentanaPersonalizada.h
@interface VentanaPersonalizada : UIWindow
@end
// VentanaPersonalizada.m
@implementation VentanaPersonalizada
- (void)sendEvent:(UIEvent *)evento {
AppDelegate *delegado = (AppDelegate *)[UIApplication sharedApplication].delegate;
if ([delegado respondsToSelector:@selector(reiniciarTemporizador)]) {
if (evento.type == UIEventTypeTouches || evento.type == UIEventTypeMotion) {
[delegado reiniciarTemporizador];
}
}
[super sendEvent:evento];
}
@end
Manejo de entradas de teclado
Las interacciones con el teclado, como la edición de texto, no se capturan como toques en la ventana. Se utiliza NSNotificationCenter para observar cambios en campos de texto.
// En el controlador de vista
- (void)configurarObservadoresTeclado {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(entradaTextoDetectada)
name:UITextFieldTextDidChangeNotification
object:self.campoTexto];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(entradaTextoDetectada)
name:UITextFieldTextDidBeginEditingNotification
object:self.campoTexto];
}
- (void)entradaTextoDetectada {
AppDelegate *delegado = (AppDelegate *)[UIApplication sharedApplication].delegate;
[delegado reiniciarTemporizador];
}
Integración en la aplicación
Al iniciar la aplicación, se configura la ventana personalizada y se inicia el temporizador. Cada vez que se muestra una nueva vista, se asigna como controladorVistaActual en el AppDelegate y se reinicia el temporizador.
// En AppDelegate, método application:didFinishLaunchingWithOptions:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
VentanaPersonalizada *ventana = [[VentanaPersonalizada alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window = ventana;
[self iniciarTemporizador];
return YES;
}
// En cada controlador de vista al aparecer
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
AppDelegate *delegado = (AppDelegate *)[UIApplication sharedApplication].delegate;
delegado.controladorVistaActual = self;
[delegado reiniciarTemporizador];
}
Este enfoque permite un bloqueo automático personalizado basado en la inactividad del usuario, manejando tanto toques como entradas de teclado.