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

简介:

原文: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 下载。


目录
相关文章
|
人工智能 自然语言处理 API
浅谈ModelScope
ModelScope是阿里推出的下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,其开发目标为让模型应用更简单。ModelScope希望在汇集行业领先的预训练模型,减少开发者的重复研发成本,提供更加绿色环保、开源开放的AI开发环境和模型服务,助力绿色“数字经济”事业的建设。ModelScope平台以开源的方式提供了多类优质模型,开发者可在平台上免费体验与下载使用。
|
10月前
|
机器学习/深度学习 编解码 人工智能
超越Transformer,全面升级!MIT等华人团队发布通用时序TimeMixer++架构,8项任务全面领先
一支由麻省理工学院、香港科技大学(广州)、浙江大学和格里菲斯大学的华人研究团队,开发了名为TimeMixer++的时间序列分析模型。该模型在8项任务中超越现有技术,通过多尺度时间图像转换、双轴注意力机制和多尺度多分辨率混合等技术,实现了性能的显著提升。论文已发布于arXiv。
740 84
Java系类 之 生成随机数(random()和Random类)
这篇文章介绍了Java中生成随机数的两种方法:使用`Math.random()`方法和`Random`类的实例方法,并提供了示例代码展示如何使用这些方法生成特定范围或特定条件下的随机数。
|
敏捷开发 测试技术
开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum
文章详细介绍了软件开发过程中的不同开发模型(瀑布、螺旋、Scrum)和测试模型(V模型、W模型),以及增量和迭代的概念,最后阐述了敏捷思想及其在敏捷开发(如Scrum)中的应用。
1303 0
开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum
|
运维 DataWorks 监控
DataWorks常见问题之如何批量补数据
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
359 1
|
供应链 监控 搜索推荐
ERP系统中的订单管理与供应链协作解析
【7月更文挑战第25天】 ERP系统中的订单管理与供应链协作解析
982 6
|
Java UED 开发者
JVM逃逸分析原理解析:优化Java程序性能和内存利用效率
JVM逃逸分析原理解析:优化Java程序性能和内存利用效率
|
JavaScript 前端开发 搜索推荐
JavaScript 延迟加载的艺术:按需加载的最佳实践
JavaScript 延迟加载的艺术:按需加载的最佳实践
JavaScript 延迟加载的艺术:按需加载的最佳实践
|
SQL JSON Java
【bug日记】已解决:Invalid bound statement (not found): 找不到对应的Mapper映射类
【bug日记】已解决:Invalid bound statement (not found): 找不到对应的Mapper映射类
|
SQL JSON 数据格式
获取【省、市、区县、乡镇街道】json,csv,sql数据
获取【省、市、区县、乡镇街道】json,csv,sql数据
271 1