代码看完后感觉非常优秀

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)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. Cisco IOS Security command Guide

    copy system:running-config nvram:startup-config : to save your configuration changes to the startup ...

  4. iOS 逆向之ARM汇编

    最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...

  5. iOS安装包瘦身的那些事儿

    在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...

  6. CallKit iOS 教程

    原文:CallKit Tutorial for iOS 作者:József Vesza 译者:kmyhy 对 VoIP App 开发者来说,iOS 的支持并不友好.尤其是它的通知发送这一块,太糙了.你 ...

  7. 浅谈C#中常见的委托<Func,Action,Predicate>(转)

    一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...

  8. [转]ios push

    转:http://blog.csdn.net/showhilllee/article/details/8631734 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 P ...

  9. iOS开发者证书申请过程

    真机测试前准备工作:1.苹果的MAC一台.如果你用的是***不知道可不可以,反正我没用过...一般公司都会给你配开发工具的.2.iphone手机一部.(本人纯屌丝,用的iphone4)3.开发者账号. ...

随机推荐

  1. 20个Flutter实例视频教程-第09节: 保持页面状态-2

    视频地址:https://www.bilibili.com/video/av39709290/?p=9 博客地址:https://jspang.com/post/flutterDemo.html#to ...

  2. flex 在父窗口监听弹出窗口里的某个按钮被点击

    flex 在父窗口监听弹出窗口里的某个按钮被点击 这样可以从子窗口拿回数据在父窗口处理数据,不必再子窗口中处理.在某些情形下省去了不少麻烦. /** * 右键菜单项单击事件 * changed by ...

  3. Entity FrameWork 5 增删改查 & 直接调用sql语句 ?

    #region 1.0 新增 -void Add() /// <summary> /// 1.0 新增 /// </summary> static void Add() { / ...

  4. 【WIP】Swift4 闭包

    创建: 2018/06/05 闭包的声明  闭包的概要 { (参数表) -> 型 in { ... } ● 参数不可以带默认值 ● 参数不可以带标签 ●  定义闭包并直接呼出必须要被代入 {re ...

  5. 洛谷 - P2257 - YY的GCD - 莫比乌斯反演 - 整除分块

    https://www.luogu.org/problemnew/show/P2257 求 \(n,m\) 中 \(gcd(i,j)==p\) 的数对的个数 求 $\sum\limits_p \sum ...

  6. 萌新笔记之堆(heap)

    前言(萌新感想): 以前用STL的queue啊stack啊priority_queue啊,一直很想懂原理,现在终于课上到了priority_queue,还有就是下周期中考,哈哈,所以写几篇blog总结 ...

  7. IT兄弟连 JavaWeb教程 JSP中的注释

    由于JSP页面由HTML.JSP.Java脚本等组成,所以在其中可以使用多种注释格式 HTML中的注释 HTML语言的注释不会被显示在网页中,但是在浏览器中选择查看网页源代码时,还是能够看到注释的信息 ...

  8. 第二章 "我要点爆"微信小程序点爆页面的实现与云函数和云存储的应用

    点爆页面的实现与云函数和云存储的应用以及录音功能讲解 点爆页面制作 点爆页面主要提供文字记录和语音记录两种爆文记录方式,在本页面内输入文字或录入语音后选择心情点击点爆按钮,跳转到点爆方式选择界面. 首 ...

  9. 15.split分割注意事项

    1.v = 'k1,v1- k2,v2- k3,v3-'变成一个字典{'k1':'v1','k2':'v2','k3:'v3'...} 变成一个字典 {'k1':'v1','k2':'v2','k3: ...

  10. dosbox让DOSBox启动后自动执行命令——自动挂载

    学习汇编时. 每次启动DOSBox后,都要挂载.转盘符,于是有一个骚套路. 找到这个:bat文件 用记事本就可以编辑.  拉到最下面,找到[autoexec]部分,补充命令如下: mount c f: ...