iOS perform action after period of inactivity (no user interaction)
代码看完后感觉非常优秀
http://stackoverflow.com/questions/8085188/ios-perform-action-after-period-of-inactivity-no-user-interaction
1. 新建 Objective-C 类,继承 UIApplication。
2. 编辑 .h 如下:
#import <Foundation/Foundation.h>
// 定义应用程序超时时间,单位为分钟,因此我们会在这个数上乘以60,以便折算成秒数。
#define kApplicationTimeoutInMinutes 5
// 定义通知名称,其真实内容是字符串 "timed out"
#define kApplicationDidTimeoutNotification
@"AppTimeOut"
@interface TIMERUIApplication : UIApplication {
NSTimer *myidleTimer;
}
-(void)resetIdleTimer;
@end
3. 编辑 .m 如下:
#import "TIMERUIApplication.h"
@implementation TIMERUIApplication
// 监听所有触摸,当屏幕被触摸,时钟将被重置
-(void)sendEvent:(UIEvent *)event {
[super sendEvent:event];
if (!myidleTimer) {
[selfresetIdleTimer];
}
NSSet *allTouches = [eventallTouches];
if ([allTouches count] > 0) {
UITouchPhase phase= ((UITouch *)
[allTouchesanyObject]).phase;
if (phase ==UITouchPhaseBegan) {
[self resetIdleTimer];
}
}
}
// 重置时钟
-(void)resetIdleTimer {
if (myidleTimer) {
[myidleTimerinvalidate];
}
// 将超时时间由分钟转换成秒数
int timeout =
kApplicationTimeoutInMinutes* 60;
myidleTimer = [NSTimer
scheduledTimerWithTimeInterval:timeout
target:self
selector:@selector(idleTimerExceeded)
userInfo:nilrepeats:NO];
}
// 当达到超时时间,张贴 kApplicationTimeoutInMinutes 通知
-(void)idleTimerExceeded {
[[NSNotificationCenter defaultCenter]
postNotificationName:
kApplicationDidTimeoutNotification
object:nil];
}
@end
4. 修改 main.m :
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "TIMERUIApplication.h"
int main(int argc, char *argv[]) {
@autoreleasepool {
returnUIApplicationMain(argc, argv,
NSStringFromClass(
[TIMERUIApplicationclass]),
NSStringFromClass(
[AppDelegate
class]));
}
}
5. 接下来编辑 AppDelegate.mfile,不需要编辑 AppDelegate.h。
#import "AppDelegate.h"
#import "TIMERUIApplication.h"
@implementation AppDelegate
@synthesize window = _window;
-(BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:
@selector(applicationDidTimeout:)
name:
kApplicationDidTimeoutNotification
object:nil];
return YES;
}
-(void)applicationDidTimeout:(NSNotification *)notif {
NSLog (@"time exceeded!!");
//这是故事板和xib文件不同的地方。对于你想跳转到的 View Controller,确保下面代码中的id 和故事板中 View Controller 的 Storyboard Identifier 一致。在本例中,即"mainView"。而我的故事板文件名为MainStoryboard.storyboard, 确保你的文件名和 storyboardWithName 参数保持一致。
UIViewController *controller =
[[UIStoryboard
storyboardWithName:@"MainStoryboard"
bundle:NULL]
instantiateViewControllerWithIdentifier:
@"mainView"];
[(UINavigationController*)
self.window.rootViewController
pushViewController:controller
animated:YES];
}
提示: 一旦侦测到触摸,定时器会被启动。也就是说,如果用户触摸了主窗口(例如“mainView”),哪怕并没有从主窗口离开,同一个视图仍然会在指定时间后 push。这在我的 app 中不是问题,但对于你的 app 则可能是个问题。
这将导致视图每隔 x 分钟就push 一次。哪怕侦测到触摸,时钟仍然会被重置。
这个问题的一种解决方案是,在app delegate 中声明一个 Bool 成员 idle,这样,当你想侦测用户是否无动作时将其设置为 true,如果仅仅是跳转到 idle view 则设置为false。然后在 TIMERUIApplication 的 idleTimerExceeded 方法中使用如下的 if 语句。在所有你想侦测用户是否无动作的视图中,将app delegate 的 idle 设置为 true。对于不需要侦测用户是否无动作的视图,将 idle 设置为 false。
-(void)idleTimerExceeded{
AppDelegate *appdelegate = [[UIApplication
sharedApplication] delegate];
if(appdelegate.idle){
[[NSNotificationCenter defaultCenter]
postNotificationName:
kApplicationDidTimeOutNotification
object:nil];
}
}
iOS perform action after period of inactivity (no user interaction)的更多相关文章
- AuthorizationFailed""The client '***' with object id '***' does not have authorization to perform action 'or the scope is invalid. If access was recently granted, please refresh your credentials
Warning SyncLoadBalancerFailed 4m9s (x11 over 29m) service-controller Error syncing load balanc ...
- An iOS zero-click radio proximity exploit odyssey
NOTE: This specific issue was fixed before the launch of Privacy-Preserving Contact Tracing in iOS 1 ...
- Cisco IOS Security command Guide
copy system:running-config nvram:startup-config : to save your configuration changes to the startup ...
- iOS 逆向之ARM汇编
最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...
- iOS安装包瘦身的那些事儿
在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...
- CallKit iOS 教程
原文:CallKit Tutorial for iOS 作者:József Vesza 译者:kmyhy 对 VoIP App 开发者来说,iOS 的支持并不友好.尤其是它的通知发送这一块,太糙了.你 ...
- 浅谈C#中常见的委托<Func,Action,Predicate>(转)
一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...
- [转]ios push
转:http://blog.csdn.net/showhilllee/article/details/8631734 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 P ...
- iOS开发者证书申请过程
真机测试前准备工作:1.苹果的MAC一台.如果你用的是***不知道可不可以,反正我没用过...一般公司都会给你配开发工具的.2.iphone手机一部.(本人纯屌丝,用的iphone4)3.开发者账号. ...
随机推荐
- 极客时间_Vue开发实战_07.Vue组件的核心概念(3):插槽
07.Vue组件的核心概念(3):插槽 严格来的说在2.0之后已经不分区这两种插槽的概念了. 因为它底层的实现已经趋向于相同了. 2.6为了兼容2.5的版本,现在依然可以用这两种写法 作用域插槽就是多 ...
- UVa 1349 Optimal Bus Route Design (最佳完美匹配)
题意:给定一个有向图,让你找出若干个图,使得每个点恰好属于一个圈,并且总的权和最小. 析:每个点都有唯一的一个圈,也就是说每一点都有唯一的后继,那么我们就可以转换成求一个图的最小权的最佳完全匹配,可以 ...
- HDU 3729【二分匹配】
题意: 给出n个同学的排名,代表每个排名在哪个区间,要求保证最多人说的是实话,并在此前提下求一个说真话人最大字典序. 思路: 最后感觉就是点去填区间,点和区间建个边,然后跑个二分图,然后sort一发. ...
- VR头盔产品镜片评测
2015-07-21 16:59 原创 Randy Orton http://www.leiphone.com/news/201507/7j46BjWsSitKML13.html 虚拟现实设备自从去年 ...
- Unity3D中常用的数据结构总结与分
阅读目录 1.几种常见的数据结构 2.几种常见数据结构的使用情景 来到周末,小匹夫终于有精力和时间来更新下博客了.前段时间小匹夫读过一份代码,对其中各种数据结构灵活的使用赞不绝口,同时也大大激发了小匹 ...
- MySql 长时间读数据发生超时的异常 Mysql Reader Exception TimeOut expired
mysql connector: .net var r = cmd.ExecuteReader() r.Reader() // <--长时间不停调用 Timeout expired. Th ...
- 【Linux】Devops的一些运维工具
一.Devops简介 从手工编译.上传服务器文件.执行命令.启动停止服务器.发现BUG再重复一遍流程,软件开发的重复劳动越来越多,在Devops概念之前,全部要靠人工手动完成,也看到了很多运维人员半夜 ...
- 洛谷P1823 [COI2007] Patrik 音乐会的等待
https://www.luogu.org/problemnew/show/P1823 自己只会一个log的 设取的人的位置分别是l,r(l<r) 这个做法大概是考虑枚举r,设法对于每个r求出有 ...
- NodeJs前端构建工具 ——————之Grunt篇
为何使用grunt? 如何搭建grunt? 开始第一个grunt项目 基础()合并js文件 开始第一个grunt项目 基础()压缩js 开始第一个grunt项目 基础()代码规范检测 开始第一个gru ...
- js中对象与函数的关系
首先什么是对象?根据W3C上面的解释JS中所有事物都是对象,对象是拥有属性和方法的数据,由此可以看出基本值类型不是对象(number.string.Boolean.Undefined),剩下的引用类型 ...