【问题标题】:iOS touch event notifications (private API)iOS 触摸事件通知(私有 API)
【发布时间】:2013-03-10 08:59:44
【问题描述】:

可以simulate touch events on iOS,并且您可以在后台使用 CTTelephonyCenterAddObserver 和 CFNotificationCenterAddObserver 接收各种系统范围的通知,例如:

不过,我还没有找到一种在后台获取触摸通知的方法。是否有可以和CFNotificationCenterAddObserver一起使用的“触摸事件”,可以使用不同的通知中心,或者完全不同的方法?

我会对低级触摸信息(例如 x、y 坐标和触摸类型)感到满意,但高级信息(例如按下键、按下后退按钮等)会更好!

【问题讨论】:

标签: ios jailbreak iphone-privateapi


【解决方案1】:

您可以使用 IOKit 中的 IOHID 东西来获取 x、y 坐标。

#include <IOHIDEventSystem.h>

创建 IOHIDEventSystemClient:

void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault);

注册回调:

IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
IOHIDEventSystemClientRegisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL);

注销回调:

IOHIDEventSystemClientUnregisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL);
IOHIDEventSystemClientUnscheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

回调:

void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
   if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){
       IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX);
       IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY);
       int width = [[UIScreen mainScreen] bounds].size.width;
       int height = [[UIScreen mainScreen] bounds].size.height;
       NSLog(@"click : %f, %f", x*width, y*height) ;
   }
}

另外,你可以看看这个: IOHIDEventSystemCreate on iOS6 failed。 希望这会有所帮助。

编辑:请查看日志中的结果。在 iPhone 4 和 5 上测试。

void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
    NSLog(@"handle_event : %d", IOHIDEventGetType(event));
if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){
    IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX);
    IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY);
    NSLog(@" x %f : y %f", x, y);
//2013-03-28 10:02:52.169 MyIOKit[143:907] handle_event : 11
//2013-03-28 10:02:52.182 MyIOKit[143:907]  x 0.766754 : y 0.555023
}
}

【讨论】:

  • 太棒了!我收到了事件,但我的 x,y 值非常大,例如:1050201600.000000、1052667392.000000。有什么建议吗?
  • 你在乘法之前检查过 x 和 y 吗?我现在不在我的 Mac 前,但据我所知,我从 % 中得到了 x 和 y。例如,如果您触摸右上角,x = 0.9 和 y 0.1。
  • 是的,巨大的数字是 x,y 没有相乘。
  • 好的。当我有 mac 时,我会回复你。
  • 在 iOS6 上,我仍然看到巨大的价值,例如:x 1064502784.000000 : y 1034551296.000000 :(
猜你喜欢
  • 2014-10-19
  • 2011-05-16
  • 2013-04-01
  • 2011-05-04
  • 2021-10-27
  • 1970-01-01
  • 2015-02-06
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多