IOS运行程序长时间误动作时自动退出
2015-05-25 09:52
363 查看
概述
先讲讲原理。我创建了一个 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,修改为如下内容:
view
sourceprint?
我仅仅将 UIApplicationMain 的第3 个参数修改为类名 ELCUIApplication,也就是说程序将用我们自定义的 UIApplication 启动。
在 ELCUIApplicaiton.h 中,我们定义了一个kApplicationTimeoutInMinutes 常量, 它表示了应用程序默认的超时间(5分钟),你可以修改它。
一旦程序启动,就会在指定时间到达时发布通知。接下来的事情就是响应通知。
响应超时通知
响应超时通知的一个比较好的地方,就是你的应用程序委托。这取决于你决定如何处理你的登出逻辑,我一般是在超时时弹出登录窗口(以模式窗口的方式)。示例代码如下:
view
sourceprint?
我们为名为 kApplicationDidTimeoutNotification的通知添加了观察者。当 kApplicationDidTimeoutNotification 通知触发,应用程序委托会调用 applicationDidTimeout:方法。该方法负责显示一个登录窗体。这样,用户就处于登出状态。当用户再次登入后,则应当重置时钟,以便在设备闲置一定时间后将用户再次登出。
重置时钟
我在登录窗口的 View Controller 中创建了一个登入方法:
I have created asimple (simulated) login method inside of my login view controller that lookslike this:
首先重置了时钟,然后重现登出前的界面(在用户登入后)。当然,我没有真的去让用户登入、登出,我只是简单演示了 ELCUIApplication 的使用。
先讲讲原理。我创建了一个 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,修改为如下内容:
view
sourceprint?
01.
#
import
<UIKit/UIKit.h>
02.
03.
int
main(
int
argc,
char
*argv[]) {
04.
05.
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
06.
07.
int
retVal = UIApplicationMain(argc, argv, @
"ELCUIApplication"
, nil);
08.
09.
[pool release];
10.
11.
return
retVal; }
我仅仅将 UIApplicationMain 的第3 个参数修改为类名 ELCUIApplication,也就是说程序将用我们自定义的 UIApplication 启动。
在 ELCUIApplicaiton.h 中,我们定义了一个kApplicationTimeoutInMinutes 常量, 它表示了应用程序默认的超时间(5分钟),你可以修改它。
一旦程序启动,就会在指定时间到达时发布通知。接下来的事情就是响应通知。
响应超时通知
响应超时通知的一个比较好的地方,就是你的应用程序委托。这取决于你决定如何处理你的登出逻辑,我一般是在超时时弹出登录窗口(以模式窗口的方式)。示例代码如下:
view
sourceprint?
01.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
02.
03.
// Override point for customization after application launch.
04.
05.
self.window.rootViewController = self.viewController;
06.
07.
[self.window makeKeyAndVisible];
08.
09.
[[NSNotificationCenter defaultCenter] addObserver:self
10.
11.
selector:
@selector
(applicationDidTimeout:)
12.
13.
name:kApplicationDidTimeoutNotification object:nil];
14.
15.
return
YES;
16.
17.
}
18.
19.
- (
void
) applicationDidTimeout:(NSNotification *) notif {
20.
21.
LoginViewController *controller = [[[LoginViewController alloc] initWithNibName:@
"LoginViewController"
22.
23.
bundle:[NSBundle mainBundle]] autorelease];
24.
25.
[self.viewController presentModalViewController:controller animated:YES];
26.
27.
}
我们为名为 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]; } |
相关文章推荐
- winfrom程序实时更新UI,程序长时间运行,不过我使用的线程和委托运行两天就自动退出了,不知道怎么回事??
- 长时间运行的spark-streaming程序自动退出的问题
- xcode6.1新建一个ios程序,为什么自动运行viewController这个类
- 如何当鼠标和键盘长时间不动的时候让程序自动退出?
- Mac OS X(L1-3): 登录/退出自动运行程序的设置
- iOS开发:保持程序在后台长时间运行
- Mac OS X(L1-3): 登录/退出自动运行程序的设置
- iOS开发笔记--如何实现程序长时间未操作退出
- iOS开发:保持程序在后台长时间运行
- 批处理程序运行后自动退出控制台界面
- iOS让程序退出后台时继续运行10分钟
- iOS 4程序直接退出不在后台运行的方法
- iOS开发:保持程序在后台长时间运行
- 利用PHP安装windows自动运行的服务,PHP程序可以实现长时间、自动运行、定时更新功能,直接可以用在项目中的类源代码
- iOS如何保持程序在后台长时间运行