iOS 长时间未操作的监测

  程序中常常碰到当用户一定时间未操作时,app需要进行一些变化。

  我们知道iOS有一个事件循环机制,也就是大家所说的runloop。我们在对程序进行手势操作时、如点击、滑动、长按、双击等都会响应对应的事件。那么我们就可以利用这个原理监听所有的屏幕事件来实现我们的功能。在程序里负责对用户事件进行处理的是UIApplication。那么如果我们想要做点什么的话,就要继承这个类。然后在里面做一些操作。好了,废话说完。下面上代码。

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

#import <UIKit/UIKit.h>

// 定义未操作的时间,也可以从服务器上获取。
#define kApplicationTimeoutInSecond 6
// 超时通知名字
#define kApplicationDidTimeoutNotification @"ApplicationDidTimeout"

@interface SubjectApplication : UIApplication

{
    NSTimer *_myidleTimer;
}
 
 - (void)resetIdleTimer;

@end
#import "SubjectApplication.h"

@implementation SubjectApplication

-(void)sendEvent:(UIEvent *)event {
    
     [super sendEvent:event];
    
     if (!_myidleTimer) {
    
             [self resetIdleTimer];
    
    }
      NSSet *allTouches = [event allTouches];
    
      if ([allTouches count] > 0) {
        
               UITouchPhase phase= ((UITouch *)[allTouches anyObject]).phase;
        
               if (phase ==UITouchPhaseBegan) {
                        [self resetIdleTimer];
                    }
      }
}

//重置时钟

 -(void)resetIdleTimer {
   
    if (_myidleTimer) {
 
          [_myidleTimer invalidate];
 
      }
   
    //将超时时间由分钟转换成秒数

    int timeout = kApplicationTimeoutInMinutes;

    _myidleTimer = [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO];
}

//当达到超时时间,发送 kApplicationTimeoutInMinutes通知

-(void)idleTimerExceeded {
     [[NSNotificationCenter defaultCenter] postNotificationName:kApplicationDidTimeoutNotification object:nil];
 }

@end

2、修改main.h中代码

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "SubjectApplication.h"
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, NSStringFromClass([SubjectApplication class]), NSStringFromClass([AppDelegate class]));
    }
}

3、在需要使用的地方加上下面的代码

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil];


-(void)applicationDidTimeout:(NSNotification *)notif {
     NSLog (@"超时要进行的操作");
}

通知记得移除哦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 4,192评论 2 19
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,211评论 30 472
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,422评论 25 708
  • 今天和往常一样去接孩子,老师和我说今天又考的不理想,我拿到卷子一看,很简单的也错了,我刚想发脾气,但是还是压制住了...
    刘梓涵妈妈阅读 154评论 0 0
  • 原来今天是喜欢郑大贤的第200天。 在这之前我不知道我还能如此喜欢一个人。 认识B.A.P是很巧合的事,因为老方去...
    张洲泽_阅读 350评论 0 0