2014-11-20 56 views
1

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

+1

为什么当你可以存储应用程序切换到后台和前台时的时间比较存储的NSDate和电流的NSDate之间的间隔定时器。如果大于阈值,则将用户注销。 – Vig 2014-11-20 17:36:56

+0

这听起来像是一个更好的解决方案!有关在AppDelegate中如何查找信息的任何建议? – user3550275 2014-11-20 18:19:13

回答

2

使用NSUserDefaultsNSDate存储在您的应用程序代理

- (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津如果应用程序必须实现的东西来处理时钟的变化,我们可以使用的东西像这样

- (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应该在适当的应用程序模式下被删除。

+0

这个解决方案效果很好,但我得到了一个“快照未呈现结果的视图结果为空的快照。确保您的视图在屏幕更新后的快照或快照前至少呈现过一次。”通知虽然 – user3550275 2014-11-20 19:13:14

+0

当你进入前景或背景时,你会得到什么 – Vig 2014-11-20 19:32:10

+0

当我进入背景 – user3550275 2014-11-20 19:51:48

0

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

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

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

当定时器启动(即在120秒)时,设置会话过期,并结束后台任务。

当应用程序重新打开时,在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]; 
} 
+0

好点,我根据你对时钟变化的关注更新了我的答案 – Vig 2014-11-20 19:31:03

相关问题