有使用IOKit成功实现模拟点击功能的大大吗?开发途中遇到些问题麻烦大家帮忙看一下。

论坛上有关使用SimulationTouch实现模拟点击功能的帖子都看过了,自己也成功在项目中通过该dylib实现了点击功能,但是发现有一个问题就是,手机在重启之后,SimulationTouch源项目里的
messagePort = rocketbootstrap_cfmessageportcreateremote(NULL, CFSTR(MACH_PORT_NAME));
这行代码无法成功获取到进程端口号,导致dylib提供的API失效了,需要在Cydia上重新安装一遍插件才可以正常使用。
看了一下SimulationTouch的源代码,先不考虑获取进程端口号的事,如果我只是想在当前app上实现模拟点击功能的话,是不需要获取进程端口号的,只要使用IOKit相关的API就行了,但是需要app是以root权限运行,并且添加相应的entitlements。但是在开发的途中,经过查看Log,发现自己发送的event并不能成功让系统分发,并且已经按照SimulationTouch源代码里面一样方式构建的event,但是系统依然会做出错误提示,下面会贴出提示和代码。
首先贴出自己写的方法函数:

  • (void)touchIsUp:(BOOL)isUp {
    uint64_t abTime = mach_absolute_time();
    uint32_t isTouching = isUp ? 0 : 1;
    uint32_t eventMask = kIOHIDDigitizerEventTouch;//2

    IOHIDEventRef handEvent = IOHIDEventCreateDigitizerEvent(kCFAllocatorDefault, abTime, 3, 0, 0, eventMask, 0, 0, 0, 0, 0.0, 0.0, 0, isTouching, 0);
    IOHIDEventSetIntegerValueWithOptions(handEvent, 720921, 1, -268435456);
    IOHIDEventSetIntegerValueWithOptions(handEvent, 4, 1, -268435456);
    IOHIDEventSetSenderID(handEvent, 0x000000010000032D);

    eventMask = (kIOHIDDigitizerEventRange | kIOHIDDigitizerEventTouch);//3

    float pointX = 150.5;
    float pointY = 150.5;
    IOHIDEventRef fingerEvent = IOHIDEventCreateDigitizerStylusEventWithPolarOrientation(kCFAllocatorDefault, abTime, 1, 2, eventMask, 0, pointX, pointY, 0.0, 0.0, 0.0, 90.0, 0.02, 0.02, isTouching, isTouching, 0);
    IOHIDEventSetSenderID(handEvent, 0x000000010000032D);
    IOHIDEventAppendEvent(handEvent, fingerEvent);

    int handEventMask = 0;
    handEventMask |= (kIOHIDDigitizerEventRange | kIOHIDDigitizerEventTouch | kIOHIDDigitizerEventIdentity);
    if (isUp) {
    handEventMask |= kIOHIDDigitizerEventPosition;
    }
    int handEventTouch = 0;
    handEventTouch |= isTouching;

    IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerEventMask, handEventMask, -268435456);
    IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerRange, handEventTouch, -268435456);
    IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerTouch, handEventTouch, -268435456);

    static IOHIDEventSystemClientRef client;
    if (client == NULL) {
    client = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
    }

    IOHIDEventSetSenderID(handEvent, 0x000000010000032D);
    IOHIDEventSystemClientDispatchEvent(client, handEvent);
    }

然后贴出在调用该方法时,系统打印的日志信息:
Dec 23 09:51:18 iPhone5-01 backboardd[11626]: BKSHID: event with no senderID – sender:(null) event:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Timestamp: 10311793932637
Total Latency: 7385 us
SenderID: 0x000000010000032D
BuiltIn: 1
ValueType: Absolute
EventType: Digitizer
DisplayIntegrated: 1
TransducerType: Hand
TransducerIndex: 0
Identity: 0
EventMask: 35
Events: Range Touch Identity
ButtonMask: 0
Range: 1
Touch: 1
Pressure: 0.000000
AuxiliaryPressure: 0.000000
Twist: 0.000000
GenerationCount: 0
WillUpdateMask: 00000000
DidUpdateMask: 00000000
X: 0.000000
Y: 0.000000
Z: 0.000000
TiltX: 0.000000
TiltY: 0.000000
ChildEvents:
-----------------------------------------------------------------------
ValueType: Absolute
EventType: Digitizer
DisplayIntegrated: 0
TransducerType: Stylus
TransducerIndex: 1
Identity: 2
EventMask: 3
Events: Range Touch
ButtonMask: 0
Range: 1
Touch: 0
Pressure: 0.000000
AuxiliaryPressure: 0.000000
Twist: 90.000000
GenerationCount: 0
WillUpdateMask: 00000000
DidUpdateMask: 00000000
X: 150.500000
Y: 150.500000
Z: 0.000000
Altitude: 0.019989
Azimuth: 0.019989
Quality: 0.000000
Density: 0.000000
MajorRadius: 0.000000
MinorRadius: 0.000000
-----------------------------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

大家留意第一行的日志输出:
BKSHID: event with no senderID – sender:(null) event
系统提示说我构造的event没有senderID,但是我在代码中明明已经
IOHIDEventSetSenderID(handEvent, 0x000000010000032D);
设置了senderID了呀,并且这个参数的值也是我hook系统函数之后拿到的数值,也是有效的。
下面贴出我hook系统函数打印出来的正常event数据:
Timestamp: 9852026029888
Total Latency: 5540 us
SenderID: 0x000000010000032D
BuiltIn: 0
AttributeDataLength: 48
AttributeData: 02 00 00 00 20 00 00 00 37 24 97 8e 3c ca 9b 56 14 0e 19 41 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ValueType: Absolute
EventType: Digitizer
DisplayIntegrated: 1
TransducerType: Hand
TransducerIndex: 0
Identity: 0
EventMask: 2
Events: Touch
ButtonMask: 0
Range: 0
Touch: 1
Pressure: 0.000000
AuxiliaryPressure: 0.000000
Twist: 0.000000
GenerationCount: 0
WillUpdateMask: 00000000
DidUpdateMask: 00000000
X: 0.000000
Y: 0.000000
Z: 0.000000
TiltX: 0.000000
TiltY: 0.000000
ChildEvents:
-----------------------------------------------------------------------
ValueType: Absolute
EventType: Digitizer
DisplayIntegrated: 0
TransducerType: Finger
TransducerIndex: 1
Identity: 2
EventMask: 3
Events: Range Touch
ButtonMask: 0
Range: 1
Touch: 1
Pressure: 0.000000
AuxiliaryPressure: 0.000000
Twist: 90.000000
GenerationCount: 0
WillUpdateMask: 00000000
DidUpdateMask: 00000000
X: 252.500000
Y: 228.500000
Z: 0.000000
Quality: 0.746094
Density: 1.753906
Irregularity: 0.000000
MajorRadius: 0.044937
MinorRadius: 0.044937
Accuracy: 0.011230
-----------------------------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

而且大家看一下系统的event,比我发送的event还多了
AttributeDataLength: 48
AttributeData: 02 00 00 00 20 00 00 00 37 24 97 8e 3c ca 9b 56 14 0e 19 41 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
这个我在看simulationTouch源代码的时候没发现在哪里设置的AttributeData,但是调用simulationTouch的API的时候生成的event也是有AttributeData的,下面贴出调用simulationTouch的API生成的event:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Timestamp: 9953217116173
Total Latency: 11999 us
SenderID: 0x0000000000000000
BuiltIn: 0
AttributeDataLength: 48
AttributeData: 02 00 00 00 20 00 00 00 d2 85 01 49 40 eb f4 84 f5 4f 19 41 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ValueType: Absolute
EventType: Digitizer
DisplayIntegrated: 1
TransducerType: Hand
TransducerIndex: 0
Identity: 0
EventMask: 2
Events: Touch
ButtonMask: 0
Range: 0
Touch: 1
Pressure: 0.000000
AuxiliaryPressure: 0.000000
Twist: 0.000000
GenerationCount: 0
WillUpdateMask: 00000000
DidUpdateMask: 00000000
X: 0.000000
Y: 0.000000
Z: 0.000000
TiltX: 0.000000
TiltY: 0.000000
ChildEvents:
-----------------------------------------------------------------------
ValueType: Absolute
EventType: Digitizer
DisplayIntegrated: 0
TransducerType: Finger
TransducerIndex: 6
Identity: 2
EventMask: 3
Events: Range Touch
ButtonMask: 0
Range: 1
Touch: 1
Pressure: 0.000000
AuxiliaryPressure: 0.000000
Twist: 0.000000
GenerationCount: 0
WillUpdateMask: 00000000
DidUpdateMask: 00000000
X: 301.500000
Y: 180.500000
Z: 0.000000
Quality: 0.000000
Density: 0.000000
Irregularity: 0.000000
MajorRadius: 0.000000
MinorRadius: 0.000000
Accuracy: 0.000000
-----------------------------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
而且很奇怪,大家看一下simulationTouch API生成event,看到SenderID: 0x0000000000000000
这个,系统打印出来的event是没有SenderID的,但是在看它源代码的时候是有设置了senderID的,真的是搞不明白。
有人能帮帮忙看下哪里出现问题了吗,真的是没头绪了。

两天了都没人指导一下:pensive:

大牛,使用tweak集成SimulationTouch,能行得通吗,ios9的系统,能不能请教一下,tool模板能执行

我没试过在tweak集成,只在APP里面集成过,不过道理应该都一样的,引入lib和头文件,在需要的地方调API,手机里需要安装好插件就可以了,论坛有教程,可以搜一下

感谢回复,我再继续研究下吧

我在12.4.7系统上,hook了 IOHIDEventSystemOpen,发现一直重启

MSInitialize {
STTouches = [[NSMutableDictionary alloc] init];
NSLog(@“MSInitialize successfully”);
if (objc_getClass(“BKHIDSystemInterface”)) {
iOS7 = YES;
}else{
iOS7 = NO;
}

MSHookFunction(&IOHIDEventSystemOpen, &new_IOHIDEventSystemOpen ,&orig_IOHIDEventSystemOpen);

}