原文:http://www.icodeblog.com/2011/09/19/timing-out-an-application-due-to-inactivity/git
概述github
先讲讲原理。我建立了一个 UIApplication 的子类ELCUIApplication。目的是为了覆盖 sendEvent: 方法。这个方法在每次触摸时都会调用。触摸可能来自于按钮、文本框以致窗口内的任何东西。app
在 sendEvent 方法中,首先调用 super 的方法(确保事件能被传递到它应该到达的地方),而后重置NSTimer。这个时钟会在 5 分钟(能够修改)之后触发。ide
一旦定时器触发(应用程序超时),我将发送一个 NSNotification通知给订阅了该消息的对象。很是简单。this
为了重置定时器(好比用户从新登陆以后),你能够调用ELCUIAppilcation的 resetIdleTimer 方法。spa
你可能会问,为何不在主窗口添加一个UIGestureRecognizer 来识别?开始的时候我也这样想过,但通过尝试,我发现没法得到所有的触摸事件。致使一些用户操做没有被记录。code
示例项目在 github上能够下载。至少须要下载两个文件:ELCUIApplication.h 和 ELCUIApplication.m 。orm
自定义 UIApplication 子类server
将 ELCUIApplication.h 和ELCUIApplication.m 拖到你的项目中。 确保选择“Copy Items...”。对象
打开 main.m,修改成以下内容:
#import <UIKit/UIKit.h> int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, @"ELCUIApplication", nil); [pool release]; return retVal; } |
我仅仅将 UIApplicationMain 的第3 个参数修改成类名 ELCUIApplication,也就是说程序将用咱们自定义的 UIApplication 启动。
在 ELCUIApplicaiton.h 中,咱们定义了一个kApplicationTimeoutInMinutes 常量, 它表示了应用程序默认的超时间(5分钟),你能够修改它。
一旦程序启动,就会在指定时间到达时发布通知。接下来的事情就是响应通知。
响应超时通知
响应超时通知的一个比较好的地方,就是你的应用程序委托。这取决于你决定如何处理你的登出逻辑,我通常是在超时时弹出登陆窗口(以模式窗口的方式)。示例代码以下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil]; return YES; } - (void) applicationDidTimeout:(NSNotification *) notif { LoginViewController *controller = [[[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:[NSBundle mainBundle]] autorelease]; [self.viewController presentModalViewController:controller animated:YES]; } |
咱们为名为 kApplicationDidTimeoutNotification的通知添加了观察者。当 kApplicationDidTimeoutNotification 通知触发,应用程序委托会调用 applicationDidTimeout:方法。该方法负责显示一个登陆窗体。这样,用户就处于登出状态。当用户再次登入后,则应当重置时钟,以便在设备闲置必定时间后将用户再次登出。
重置时钟
我在登陆窗口的 View Controller 中建立了一个登入方法:
I have created asimple (simulated) login method inside of my login view controller that lookslike this:
- (IBAction)login:(id)sender { [(ELCUIApplication *)[UIApplication sharedApplication] resetIdleTimer]; [self.parentViewController dismissModalViewControllerAnimated:YES]; } |
首先重置了时钟,而后重现登出前的界面(在用户登入后)。固然,我没有真的去让用户登入、登出,我只是简单演示了 ELCUIApplication 的使用。
结论