1

我有一个具有 loginVC 的应用程序,当用户登录时,我希望应用程序在 12 小时后-(void)logout使用这些行在[self performSelector:@selector(logout) withObject:nil afterDelay:43200];UserLoggedVC 的 viewDidLoad 方法中调用该方法。如果应用程序处于打开状态或在后台,且 afterDelay 中的时间参数很短,如 600 秒(10 分钟),则该方法调用正常,但何时为长时间(如 43200 秒(12 小时)),并且应用程序处于后台该方法永远不会被调用。

我希望你能帮帮我

4

3 回答 3

4

performSelector: withObject: afterDelay:本质上只是一个计时器,后台不允许使用计时器。

相反,您应该只记录用户首次登录应用程序时的时间戳并保存。然后每次应用程序进入前台时,只需检查从当前时间到登录时间是否有 12 小时。

于 2013-09-25T23:49:00.820 回答
2

您不能期望您的应用程序在内存中存活 12 小时。当应用程序进入后台时,操作系统最终会杀死它,所以你的方法永远不会执行。

此处的方法可以是存储上一次用户活动的日期并在用户打开应用程序时将其与当前活动进行检查,或者执行检查服务器端并强制注销。

于 2013-09-25T23:49:22.163 回答
2

Gabriele 和 tdevoy 的回答清楚地说明了为什么这是不可能的。所以我不会重复同样的事情,如果你不知道怎么做,你可以试试:

在你的,像这样viewDidLoad存储登录时间NSUserDefaults

NSDate *currentDate= [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"loggedInTime"];

现在在您的applicationDidBecomeActive委托方法中,

NSDate *loggedInTime = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"loggedInTime"];
NSTimeInterval timeSpentInApp = [[NSDate date] timeIntervalSinceDate:loggedInTime];
//if this timeSpentInApp is greater than 43200, then you can call logout. 
//(Make sure after relogin, the loggedInTime value was updated again.)

但是,如果用户连续使用该应用程序 12 小时,那么您也应该考虑使用您的代码片段,因为这只会在应用程序来自后台时调用。

于 2013-09-26T01:11:37.727 回答