【问题标题】:Timer when leaving app and returning on ios离开应用程序并在 ios 上返回时的计时器
【发布时间】:2014-11-20 17:06:18
【问题描述】:

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

【问题讨论】:

  • 当您可以存储应用程序进入后台的时间并在前台比较存储的 nsdate 和当前 nsdate 之间的时间间隔时,为什么要使用计时器。如果大于阈值,则将用户注销。
  • 这听起来确实是一个更好的解决方案!有关在 AppDelegate 中查找有关执行此操作的信息的任何建议?

标签: ios alert nstimer


【解决方案1】:

使用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 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 应该在适当的应用模式下被移除。

【讨论】:

  • 此解决方案效果很好,但我收到“对未渲染的视图进行快照会导致空快照。确保您的视图在快照之前至少渲染一次或屏幕更新后的快照。 "请注意
  • 是进入前景还是背景时得到的东西
  • 当我进入后台时
  • 你还有什么,你在更新任何观点吗?
  • 它唯一的作用是,当时间用完并且您进入应用程序时,会显示警报。我敢肯定这是我忘记的小东西,我会调查的。
【解决方案2】:

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

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

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

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

当应用重新打开时,在 applicationDidBecomeActive: 委托中,检查请求登录的会话是否过期。

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

【讨论】:

  • 好点,我已经根据您对时钟变化的关注更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多