我有一个具有loginVC的应用程序,当用户登录时我希望在12小时后应用程序使用这些行-(void)logout
调用方法[self performSelector:@selector(logout) withObject:nil afterDelay:43200];
,在viewDidLoad方法中UserLoggedVC。
如果应用程序在afterDelay中打开或在后台使用短时间参数,例如600秒(10分钟),则该方法称为精细,但是如果长时间如43200秒(12小时),并且应用程序在后台永远不会调用该方法。
我希望你能帮助我
答案 0 :(得分:4)
performSelector: withObject: afterDelay:
基本上只是一个计时器,后台不允许使用计时器。
相反,您应该只记录用户首次登录应用程序并保存时的时间戳。然后,每次应用程序到达前台时,只需检查从当前时间到登录时间是否为12小时。
答案 1 :(得分:2)
您不能指望您的应用程序在内存中存活12小时。当应用程序进入后台时,操作系统最终会将其终止,因此您的方法永远不会执行。
此处的方法可以是存储上次用户活动的日期,并在用户打开应用程序时检查当前用户活动的日期,或执行检查服务器端并强制注销。
答案 2 :(得分: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小时,那么您也应该考虑使用您的代码段,因为这只会在应用来自后台时调用。