2012-02-29 12 views
5

Tengo una aplicación de iPhone que permite a los usuarios iniciar sesión e interactuar con un servicio web. Me gustaría tener la capacidad para que el usuario se desconecte automáticamente después de un período de inactividad ... más específicamente si la aplicación ha estado en segundo plano durante un período de tiempo (por ejemplo, 1 hora).Comprobando cuánto tiempo ha estado en segundo plano la aplicación de iPhone al entrar en primer plano

Lo ideal es que ejecute un control en el método App Delegate applicationWillEnterForeground que comprueba cuánto tiempo ha estado la aplicación en segundo plano y luego, si ha pasado el tiempo permitido, llévelos a la pantalla de inicio de sesión.

¿Cómo ejecutaría esta comprobación en el método anterior? Agradecería un código de muestra.

Si esta no es la mejor manera de cumplir mis requisitos, ¡entonces también son bienvenidas las sugerencias!

Muchas gracias de antemano

Andy

Respuesta

11

Puede utilizar esta:

- (void)applicationWillResignActive:(UIApplication *)application 
{  
    NSDate *thisMagicMoment = [NSDate date]; 
    [[NSUserDefaults standardUserDefaults] setObject:thisMagicMoment forKey:@"lastMagicMoment"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    NSDate *thisMagicMoment = [NSDate date]; 
    NSDate *lastMagicMoment = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"lastMagicMoment"]; 

    if (lastMagicMoment==nil) 
    { 
     NSLog (@"First launch!"); 
    } 
    else 
    { 
     NSTimeInterval timeOfNoMagic = [thisMagicMoment timeIntervalSinceDate:lastMagicMoment]/3600.0; 
     NSLog (@"Application was in background for %.1f hours", timeOfNoMagic); 

     //do your stuff - treat NSTimeInterval as double 

     if (timeOfNoMagic > 1.0) 
     { 
      //logout 
     } 
    } 
} 
+1

(Esta es una opinión personal con la que puede o no estar de acuerdo ...) Si bien es amable de su parte hacer el trabajo para la persona que publica la pregunta, creo que sería mejor publicar algunas pautas sobre dónde la persona que la pregunta podría ir para encontrar más información o cosas para pensar al escribir sus propias implementaciones. Stack Overflow está recibiendo cada vez más preguntas que finalizan con "por favor publique algún código" y ese código aparece en otra pregunta con "Tengo este código, y ahora quiero hacer esto extra. Publique el código". Lo cual no ayuda mucho al aprendizaje. –

+3

@Nick: desde el punto de vista educativo, estoy de acuerdo con el 70%. Creo que la codificación tiene que aprenderse de estudiar la documentación y también de ver (a veces copiar y pegar) código preparado. Aprender únicamente de la documentación de Apple sería un dolor en el ... Pero: SO no se usa solo para aprender, muchos lo usan como un depósito público para fragmentos de código cortos que resuelven problemas no cruciales (aumento de la productividad). Dicho eso: di +1 a la respuesta de tu y ade hace una hora exactamente porque son educativos. Yo (si pudiera) le doy a la mía también +1 porque puede ser un ahorro de tiempo para cualquier persona con el mismo "problema". :-) –

+2

Buen punto, bien hecho. Aquí tiene este +1 :-) –

2

Escribir la fecha y hora a NSUserDefaults cuando la aplicación entra en el fondo o es dejar de fumar. Luego lea esa fecha y hora desde NSUserDefaults en la aplicación WillEnterForeground y compárela. Si es más de 1 hora (o lo que sea que establezca el tiempo de espera), visualice la pantalla de inicio de sesión.

2

Ahorre el tiempo cuando la aplicación ingresa en segundo plano a NSUserDefaults. luego léelo cuando vuelva a entrar en primer plano.

En applicationWillEnterForeground si la diferencia de tiempo es superior a 1 hora, debe establecer una marca o publicar una notificación. es decir, podría tener un método en su delegado de la aplicación que desconecta al usuario, o podría tener una marca de verificación en la vista que aparecerá, que de ser necesario desconectará al usuario.

0

En primer lugar establecer el temporizador en applicationDidFinishLaunching método:

Ahora compruebe el tiempo en el método applicationDidBecomeActive: esto se llama cada vez que el usuario inicia la aplicación de nuevo.

Si el tiempo es mayor que ex (1 hora), reinicie el temporizador y cierre la sesión del usuario.

+0

En realidad, usted debe parar todos los temporizadores en ejecución cuando aplicacion entrar en el fondo. –

Cuestiones relacionadas