iOS实现监听用户多少分钟内是否点击屏幕

715 阅读1分钟

OC

1.让AppDelegate继承UIApplication而不是UIResponser。

2.重写sendEvent方法。

- (void)sendEvent:(UIEvent *)event{
   [super sendEvent:event];//这里一定不能漏掉,否则app将不能成功启动。
   NSSet *allTouches = [event allTouches];

    if ([allTouches count] > 0) {
        UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
        if (phase == UITouchPhaseBegan)
            NSLog(@"send event");
    }
}

3.为了能让继承了UIApplication的AppDelegate起作用,需要将main.m中的更改为:

   

return UIApplicationMain(argc,argv, NSStringFromClass([AppDelegate class]), NSStringFromClass([AppDelegate class]));

Swift

extension UIApplication {
    func changeMethod(_ object: AnyClass) -> () {
        let originalSelector = #selector(sendEvent(_:))
        let swizzledSelector = #selector(MysendEvent(_:))
        let originalMethod = class_getInstanceMethod(object, originalSelector)
        let swizzledMethod = class_getInstanceMethod(object, swizzledSelector)
        let didAddMethod: Bool = class_addMethod(object, originalSelector, method_getImplementation(swizzledMethod!), method_getTypeEncoding(swizzledMethod!))
        if didAddMethod {
            class_replaceMethod(object, swizzledSelector, method_getImplementation(originalMethod!), method_getTypeEncoding(originalMethod!))
        } else {
            method_exchangeImplementations(originalMethod!, swizzledMethod!)
        }
    }
    @objc func MysendEvent(_ event: UIEvent){
        //App的点击事件
        print("The user is active")
//        MysendEvent(event)
    }
}

或者注释AppDelegate中 @UIApplicationMain 再新建一个main文件,添加以下代码

UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(CustomApplication.self), NSStringFromClass(AppDelegate.self));

class CustomApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        // 在这里处理一些统一的逻辑
        super.sendEvent(event)
        print("event=======")
    }

    override func sendAction(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) -> Bool {
        // 在这里处理一些统一的逻辑, 例如 记录行为日志
        return super.sendAction(action, to: target, from: sender, for: event)
    }
}