计时器离开应用程序,并返回到iOS
目前在我的iOS应用程序中,当用户退出到主屏幕并返回到应用程序时,它会请求在我的AppDelegate中设置的login凭据。 但是我想要做的是,如果用户退出应用程序,并在例如2分钟内,定时器重置,用户不需要input他的密码。 当用户在2分钟后回到应用程序时,会提醒他再次input密码。 任何帮助将不胜感激。 谢谢!
使用NSUserDefaults
将NSDate
存储在您的应用程序委托中
- (void)applicationDidEnterBackground:(UIApplication *)application { [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"myDateKey"]; } - (void)applicationWillEnterForeground:(UIApplication *)application { NSDate *bgDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey: @"myDateKey"]; if(fabs([bgDate timeIntervalSinceNow]) > 120.00) { //logout } [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"myDateKey"]; }
更新:
如果应用程序必须实现某些东西来处理时钟变化,我们可以使用类似这样的东西
- (void)applicationDidEnterBackground:(UIApplication *)application { [[NSUserDefaults standardUserDefaults] setFloat: [[NSProcessInfo processInfo] systemUptime] forKey:@"myDateKey"]; } - (void)applicationWillEnterForeground:(UIApplication *)application { float bgTime = [[NSUserDefaults standardUserDefaults] floatForKey: @"myDateKey"]; if(fabs([[NSProcessInfo processInfo] systemUptime] - bgTime) > 120.00) { //logout } [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"myDateKey"]; }
显然,一旦手机重新启动,时间将被重置,在这种情况下,我们必须确保我们添加validation。 另外需要注意的是myDateKey应该在适当的应用模式下被移除。
当应用程序处于后台时,用户可以调整系统时间。 应用程序重新打开时,将存储时间与当前系统时间进行比较可能不太可靠。
我们可以使用NSTimer + BackgroundTask来确保stream逝的时间。
在applicationWillResignActive:delegate中,设置一个后台任务和一个NSTimer。
当定时器启动(即在120秒),设置会话过期,并结束后台任务。
当应用程序重新打开时,在applicationDidBecomeActive:委托中,如果请求login过期,请检查会话以查找请求。
static BOOL sessionActive; static NSTimer *timer; static UIBackgroundTaskIdentifier bgTask; - (void)applicationWillResignActive:(UIApplication *)application { sessionActive = YES; timer = [NSTimer scheduledTimerWithTimeInterval:120.0 target:self selector:@selector(sessionExpired) userInfo:nil repeats:NO]; bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{[self sessionExpired];}]; } - (void)applicationDidBecomeActive:(UIApplication *)application { [self cleanup]; if(!sessionActive) { //session expired, request login credentials } } -(void)sessionExpired { [self cleanup]; sessionActive = NO; } -(void)cleanup { if([timer isValid]) [timer invalidate]; timer = nil; [[UIApplication sharedApplication] endBackgroundTask:bgTask]; }