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)
}
}