使程序在用户长时间不操作时退出

简介:

原文:http://www.icodeblog.com/2011/09/19/timing-out-an-application-due-to-inactivity/

概述

先讲讲原理。我创建了一个 UIApplication 的子类ELCUIApplication。目的是为了覆盖 sendEvent: 方法。这个方法在每次触摸时都会调用。触摸可能来自于按钮、文本框以至窗口内的任何东西。

在 sendEvent 方法中,首先调用 super 的方法(确保事件能被传递到它应该到达的地方),然后重置NSTimer。这个时钟会在 5 分钟(可以修改)以后触发。

一旦定时器触发(应用程序超时),我将发送一个 NSNotification通知给订阅了该消息的对象。非常简单。

为了重置定时器(比如用户重新登录之后),你可以调用ELCUIAppilcation的 resetIdleTimer 方法。

你可能会问,为什么不在主窗口添加一个UIGestureRecognizer 来识别?开始的时候我也这样想过,但经过尝试,我发现无法获得全部的触摸事件。导致一些用户操作没有被记录。

示例项目在 github上可以下载。至少需要下载两个文件:ELCUIApplication.h 和 ELCUIApplication.m 。

 

自定义  UIApplication 子类

 

将 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  的使用。 

结论

最后,如果你有任何问题或建议,请在我的 Twitter上给我留言。源代码可在github 下载。


目录
相关文章
|
Shell
设置shell脚本执行错误自动退出
设置shell脚本执行错误自动退出
913 0
|
6月前
|
存储 小程序 前端开发
超简单实现小程序用户授权登录与退出
本文介绍了如何轻松实现小程序的用户授权登录与退出功能。通过调用微信的`wx.getUserProfile` API获取用户信息,成功后存储到本地以实现授权登录,并在WXML、CSS和JS中提供示例代码。用户信息存储使用`wx.setStorageSync`,退出登录则清除相关缓存,提升用户体验。
152 1
|
6月前
|
调度
程序后台执行与前台执行速度出现差异
程序后台执行与前台执行速度出现差异
75 0
|
Web App开发 安全 应用服务中间件
nginxWebUI 存在前台远程命令执行漏洞
nginxWebUI 存在前台远程命令执行漏洞,攻击者通过该漏洞获取服务器控制权限进而进一步获取敏感数据信息。
335 1
|
Ubuntu Linux Windows
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
在Qt软件中实现部分终端控制命令行功能,使软件内可以又好的模拟终端控制,提升软件整体契合度。
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
|
C# Windows
用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠
原文:用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠 简介 本文讲述了用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠。 如何实现 首先,使用 using 语句添加我们需要的命名空间: using System.
3599 0
|
Shell Linux
linux配置超时不操作自动退出登录TMOUT
linux配置超时不操作自动退出登录TMOUT
1500 0
|
Linux
Linux使用PAM锁定多次登陆失败的用户
Linux使用PAM锁定多次登陆失败的用户
204 0
|
Shell
shell之通过if [ $? != 0 ]判断上次程序是否执行成功
shell之通过if [ $? != 0 ]判断上次程序是否执行成功
674 0
|
Java 开发者
用户模块之退出功能|学习笔记
快速学习用户模块之退出功能