原文:http://stackoverflow.com/questions/273450/iphone-detecting-user-inactivity-idle-time-since-last-screen-touch
方案一:让你的应用程序委托子类化 UIApplication。在实现部分,覆盖 sendEvent:方法:
- (void)sendEvent:(UIEvent *)event {
[super sendEvent:event];
// 只在开始或结束触摸时 reset 闲置时间, 以减少不必须要的时钟 reset 动作
NSSet *allTouches = [event allTouches];
if ([allTouches count] > 0) {
// allTouchescount 似乎只会是 1, 因此 anyObject 总是可用的
UITouchPhase phase =((UITouch *)[allTouches anyObject]).phase;
if (phase ==UITouchPhaseBegan || phase == UITouchPhaseEnded)
[self resetIdleTimer];
}
}
- (void)resetIdleTimer {
if (idleTimer) {
[idleTimerinvalidate];
[idleTimerrelease];
}
idleTimer = [[NSTimer scheduledTimerWithTimeInterval:maxIdleTimetarget:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO]retain];
}
- (void)idleTimerExceeded {
NSLog(@"idle time exceeded");
}
这里, maxIdleTime 和 idleTimer 都是实例变量.
此外你要修改 main.m,告诉 UIApplicationMain 使用你的 delegate 类(在这个例子里,即 AppDelegate)作为主类:
int main(int argc, char *argv[])
{
@autoreleasepool{
return UIApplicationMain(argc, argv, NSStringFromClass([AppDelegateclass]), NSStringFromClass([AppDelegate class]));
}
}
方案二:本方案不需要子类化UIApplication。它能在某个 UIViewController 子类上生效,因此对于只有一个 ViewController(比如一个互动式应用或游戏)相当有用,或者只想在一个 View Controller 中处理用户闲置时间。
它不会在重置时钟时重建 NSTimer 对象,而仅仅是修改它的触发时间。
在你的代码中,你可以调用 resetIdleTimer 去检测各种事件(比如加速计的急剧改变)。
@interface MainViewController : UIViewController {
NSTimer*idleTimer;
}
@end
#define kMaxIdleTimeSeconds 60.0
@implementation MainViewController
#pragma mark -
#pragma mark Handling idle timeout
- (void)resetIdleTimer {
if(!idleTimer) {
idleTimer =[[NSTimer scheduledTimerWithTimeInterval:kMaxIdleTimeSeconds target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO] retain];
}
else {
if(fabs([idleTimer.fireDate timeIntervalSinceNow]) < kMaxIdleTimeSeconds-1.0){
[idleTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:kMaxIdleTimeSeconds]];
}
}
}
- (void)idleTimerExceeded {
[idleTimerrelease];
idleTimer = nil;
[selfstartScreenSaverOrSomethingInteresting];
[selfresetIdleTimer];
}
- (UIResponder *)nextResponder {
[selfresetIdleTimer];
return[super nextResponder];
}
- (void)viewDidLoad {
[superviewDidLoad];
[selfresetIdleTimer];
}
@end
为简便起见,忽略了内存管理代码。