我们使用金融软件经常会发现手机锁屏或者长时间未操作就会退出程序或者需要重新输入密码等情况。下面让我们看一下如何实现这种功能。我们知道iOS有一个事件循环机制,也就是大家所说的runloop。我们在对程序进行手势操作时、如点击、滑动、长按、双击等都会响应对应的事件。那么我们就可以利用这个原理监听所有的屏幕事件来实现我们的功能。在程序里负责对用户事件进行处理的是UIApplication。那么如果我们想要做点什么的话,就要继承这个类。然后在里面做一些操作。好了,废话说完。下面上代码。

  首先创建一个继承UIApplication的类。

SWFUIApplication.h文件

 #import <UIKit/UIKit.h>

 // 定义未操作的时间,也可以从服务器上获取。
#define kApplicationTimeoutInMinutes 5 // 超时通知名字
#define kApplicationDidTimeoutNotification @"ApplicationDidTimeout" /**
* This is a subclass of UIApplication with the sendEvent: method
* overridden in order to catch all touch events.
*/ @interface SWFUIApplication : UIApplication
{
NSTimer *_myidleTimer;
}
/**
* Resets the idle timer to its initial state. This method gets called
* every time there is a touch on the screen. It should also be called
* when the user correctly enters their pin to access the application.
*/
- (void)resetIdleTimer;
@end

SWFUIApplication.m文件

 #import "SWFUIApplication.h"

 @implementation SWFUIApplication
-(void)sendEvent:(UIEvent *)event { [super sendEvent:event]; if (!_myidleTimer) { [self resetIdleTimer]; }
NSSet *allTouches = [event allTouches]; if ([allTouches count] > ) { UITouchPhase phase= ((UITouch *) [allTouches anyObject]).phase; if (phase ==UITouchPhaseBegan) {
[self resetIdleTimer];
} } } //重置时钟 -(void)resetIdleTimer { if (_myidleTimer) { [_myidleTimer invalidate]; } //将超时时间由分钟转换成秒数 int timeout = kApplicationTimeoutInMinutes* 60; _myidleTimer = [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO]; } //当达到超时时间,发送 kApplicationTimeoutInMinutes通知 -(void)idleTimerExceeded { [[NSNotificationCenter defaultCenter] postNotificationName:kApplicationDidTimeoutNotification object:nil];
}
@end

主要代码写完,下面来看一下如何使用

AppDelegate.m

 #import "AppDelegate.h"
#import "SWFUIApplication.h"
#import "SecondViewController.h"
@interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil];
return YES;
} -(void)applicationDidTimeout:(NSNotification *)notif {
NSLog (@"超时要进行的操作");
self.window.rootViewController = [SecondViewController new];
[[NSNotificationCenter defaultCenter] removeObserver:self name:kApplicationDidTimeoutNotification object:nil];
}

demo的功能是 模拟登陆页面 然后5秒未操作 会切换另一个页面

控制器代码

 #import "ViewController.h"
#import "ThirdViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)btnAction {
[self presentViewController:[ThirdViewController new] animated:YES completion:nil];
}
 #import "SecondViewController.h"

 @interface SecondViewController ()

 @end

 @implementation SecondViewController

 - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor redColor];
}
 #import "ThirdViewController.h"

 @interface ThirdViewController ()

 @end

 @implementation ThirdViewController

 - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor purpleColor];
}

实现效果

DemoGithub地址:https://github.com/yanhuaxuanlan/untreatedExitDemo

iOS开发笔记--如何实现程序长时间未操作退出的更多相关文章

  1. iOS实现程序长时间未操作退出

    大部分银行客户端都有这样的需求,在用户一定时间内未操作,即认定为token失效,但未操作是任何判定的呢?我的想法是用户未进行任何touch时间,原理就是监听runloop事件.我们需要进行的操作是创建 ...

  2. WPF程序长时间无人操作

    在软件开发中为了安全性,特别是那些需要用到用户名和密码登录服务端的程序,常常考虑长期无人操作,程序自动跳转到用户登录界面. 判断程序是否长时间无人操作,有两个依据,第一个是鼠标长时间不动,第二个是鼠标 ...

  3. web页面长时间未操作自动退出登录

    var lastTime = new Date().getTime(); var currentTime = new Date().getTime(); * * ; //设置超时时间: 10分 $(f ...

  4. JavaScript长时间未操作自动退出登录

    主要是通过mouseover 来监听有没有进行当前页面操作,通过未操作时间和设定退出的时间做比较,从而退出登录. var oldTime = new Date().getTime(); var new ...

  5. vue项目前端限制页面长时间未操作超时退出到登录页

    之前项目超时判断是后台根据token判断的,这样判断需要请求接口才能得到返回结果,这样就出现页面没有接口请求时还可以点击,有接口请求时才会退出 现在需要做到的效果是:页面超过30分钟未操作时,无论点击 ...

  6. Android实现app长时间未操作时自动退出app

    这里要考虑3个问题,第一个是锁屏问题,第二个是app被切换至后台的问题,第三个是屏幕锁定和解除时app在后台时的问题 一,监听屏幕解锁,锁定 ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  7. WPF窗口长时间无人操作鼠标自动隐藏

    在软件开发中有时会有等待一段时间无人操作后隐藏鼠标,可能原因大致如下: 1.为了安全性,特别是那些需要用到用户名和密码登录服务端的程序,常常考虑长期无人操作,程序自动跳转到用户登录界面: 2.软件为了 ...

  8. jsp+js完成用户一定时间未操作就跳到登录页面

    <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" ...

  9. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

随机推荐

  1. XDebug 教程

    安装说明: PHP调试时,不得不提XDEBUG这个调试利器.学习PHP以来,几乎所有的问题我都利用它来解决. 首先关于如何安装,不在赘述,请自行google之.(需要特别注意的是:PHP5.2 和5. ...

  2. [Functional Programming] Pull Many Random Numbers in a Single State ADT Transaction

    We have the ability to select a single random card from a pile of twelve cards, but we would like to ...

  3. fetch的用法

    fetch api是被设计用来替换XmlHttpRequest的,详细用法如下: http://javascript.ruanyifeng.com/bom/ajax.html#toc27

  4. angular - 如何运行在起来 - 使用nginx

    nginx下载地址,使用的是标准版的: 点击下载nginx nginx下载完后,解压 dist文件夹下面所有angular文件放入html文件夹中. 最后命令行cd到当前nginx.exe目录,启动命 ...

  5. java注解说明

    * 元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * Elem ...

  6. 树莓派之OLED12864视频播放—BadApple

    代码地址如下:http://www.demodashi.com/demo/13218.html 概述 本篇教程讲述了使用树莓派驱动OLED12864液晶屏,并在液晶屏上播放动画和视频. 硬件平台 树莓 ...

  7. Zabbix触发器函数(取前后差值)

    获取最新值last zabbix触发器方法last用于获取item最新值或者第几个值以及某个时间的哪一个值. Last (most recent) T value is > N Last (mo ...

  8. lua面向对象编程 《lua程序设计》 16章 笔记

    Lua中的table就是一种对象,即它拥有状态.拥有独立于其值的标识(self).table与对象一样具有独立于创建者和创建地的征集周期 什么叫对象拥有独立的生命周期? Account = {bala ...

  9. 使用svn hooks 脚本post-commit时遇到的故障

    由于网站上线,需要把新添加功能上传到测试环境进行测试,但由于程序员每天有大量的修改,如果总是登陆服务器手动更新svn工作副本(测试环境)太耗时耗精力,进而增加svn进行commit时,测试环境即时更新 ...

  10. Python数据处理——绘制函数图形以及数据拟合

    1.多项式拟合 对散点进行多项式拟合并打印出拟合函数以及拟合后的图形import matplotlib.pyplot as pltimport numpy as npx=np.arange(1,17, ...