Implementación de un temporizador de bloqueo automático personalizado en iOS

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.

Etiquetas: iOS Objective-C NSTimer UIWindow NSNotificationCenter

Publicado el 7-11 21:32