设置NSTimer以检查应用程序是否处于非活动状态

时间:2011-11-26 00:02:38

标签: iphone objective-c cocoa-touch nstimer

我有一个需要用户登录才能使用它的应用。我有一个X分钟的值,如果该应用程序长时间处于非活动状态,它会将用户注销,因此当他们下次启动应用程序时,他们将不得不再次输入他们的登录信息。

有一种简单有效的方法吗?我想我必须在NSTimer添加AppDelegate并在didFinishLaunchingWithOptions方法中添加一些逻辑。我将分钟存储为NSUserDefaults中的int。

例如,如果应用程序尚未在60 minutes中使用,则将用户注销(它不会真正记录用户,但下次启动应用程序时会记录用户out并显示登录屏幕等。)

编辑:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSDictionary *userContextDictionary = [dataSource fetchUserContext];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setDouble:[[userContextDictionary valueForKey:@"autologout_idle_timeout"] doubleValue] forKey:@"timeoutLength"];  
    double timeDifference = ([[NSDate date] timeIntervalSince1970] - [userDefaults doubleForKey:@"Close Time"]) / 60;

    if (timeDifference > [userDefaults doubleForKey:@"timeoutLength"]) {
         NSLog(@"Timeout Hit");
     } else {
         NSLog(@"No Timeout");
     }

- (void)applicationDidEnterBackground:(UIApplication *)application
{    
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    double currentTime = [[NSDate date] timeIntervalSince1970];
    [userDefaults setDouble:currentTime forKey:@"Close Time"];
}

3 个答案:

答案 0 :(得分:4)

只需存储关闭应用程序的时间,然后在应用程序处于活动状态时进行检查。如果两者之间的差异太大,则需要重新登录。否则,请继续停止使用的应用程序。

使用applicationDidEnterBackground方法或类似方法:

double currentTime = [[NSDate date] timeIntervalSince1970]];
[NSUserDefaultsVar setDouble:currentDate forKey:@"Close Time"];

然后在applicationWillEnterForegrounddidFinishLaunchingWithOptions(以涵盖从封闭状态开始并从背景开始):

double timeDifference = ([[NSDate date] timeIntervalSince1970] - [NSUserDefaultsVar doubleForKey:@"Close Time"]) / 60;

if (timeDifference > [NSUserDefaultsVar doubleForKey:@"Acceptable Difference"] ) {
      [self reLogin];
} else {
      //continue 
}

答案 1 :(得分:2)

除了你的计时器创意之外,您还可以查看NSObject的performSelector:withObject:afterDelay方法。

但是我不得不怀疑你是否期望这个方法在应用程序处于后台时触发?

如果应用程序在X分钟后恢复到前台(或再次激活),则可以更自动地将用户注销。

答案 2 :(得分:0)

两种不活动:

1 /应用程序不活动(应用程序没有或前台或设备已锁定)。

当您的应用开始处于非活动状态时,请将当前时间保存到变量中,并将其与应用再次激活时的当前时间进行比较(UIApplicationDelegate中的方法)

2 /用户无效(不接触任何东西)

创建计时器并覆盖[UIApplication sentEvent:]。使用此方法重置计时器并调用[super sendEvent:]