离开应用程序并在ios上返回时的计时器

时间:2014-11-20 17:06:18

标签: ios alert nstimer

目前在我的iOS应用程序上,当用户退出主屏幕并返回应用程序时,它会请求在我的AppDelegate中设置的登录凭据。但我想要做的是,如果用户离开应用程序并在内部返回例如2分钟,则计时器重置并且用户不需要输入他的密码。当用户在2分钟后返回应用程序时,它会提醒他再次输入密码。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

使用NSUserDefaultsNSDate存储在您的app delegate

- (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"];
}

<强>更新

@mun chun的好点如果应用程序必须实现处理时钟更改的东西我们可以使用这样的东西

- (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"];
}

显然,一旦手机重启,时间将被重置,在这种情况下,我们必须确保添加验证。另外需要注意的是,应该在适当的应用程序模式中删除myDateKey。

答案 1 :(得分:0)

用户可以在应用程序处于后台时将系统时间调整为更早。在重新打开应用程序时,将存储的时间与当前系统时间进行比较可能不可靠。

我们可以使用NSTimer + BackgroundTask来确保经过的时间。

在applicationWillResignActive:delegate中,设置后台任务和NSTimer。

当计时器被解雇时(即120秒),设置会话已过期,并结束后台任务。

当app重新打开时,在applicationDidBecomeActive:delegate中,检查会话是否已过期请求登录。

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];
}