我就是想自己写一个模拟点击屏幕的方法

先上图


绿色部分是N个按钮,点击任意一个按钮会变成红色

下面上主要的代码

  • (void)viewDidLoad
    {
    [super viewDidLoad];
    IOHIDEventQueueRef queue = IOHIDEventQueueCreate(kCFAllocatorDefault, 1, 14);
    IOHIDEventQueueSetNotificationPort(queue, [self getPort]);
    IOHIDEventQueueEnqueue(queue, [self getdownEvent]);
    IOHIDEventQueueEnqueue(queue, [self getupEvent]);
    }

- (mach_port_t)getPort
{
void *IOKit = dlopen("/System/Library/Frameworks/IOKit.framework/IOKit", RTLD_NOW);
if (IOKit)
{
mach_port_t *kIOMasterPortDefault = dlsym(IOKit, “kIOMasterPortDefault”);
CFMutableDictionaryRef (*IOServiceMatching)(const char *name) = dlsym(IOKit, “IOServiceMatching”);
mach_port_t (*IOServiceGetMatchingService)(mach_port_t masterPort, CFDictionaryRef matching) = dlsym(IOKit, “IOServiceGetMatchingService”);
CFTypeRef (*IORegistryEntryCreateCFProperty)(mach_port_t entry, CFStringRef key, CFAllocatorRef allocator, uint32_t options) = dlsym(IOKit, “IORegistryEntryCreateCFProperty”);
kern_return_t (*IOObjectRelease)(mach_port_t object) = dlsym(IOKit, “IOObjectRelease”);

    if (kIOMasterPortDefault && IOServiceGetMatchingService && IORegistryEntryCreateCFProperty && IOObjectRelease)
    {
        mach_port_t platformExpertDevice = IOServiceGetMatchingService(*kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
        return platformExpertDevice;
    }
    dlclose(IOKit);
}
return 0;

}

- (IOHIDEventRef)getdownEvent
{
uint64_t abTime = mach_absolute_time();
AbsoluteTime timeStamp = *(AbsoluteTime *) &abTime;

//iOS6 kIOHIDDigitizerTransducerTypeHand == 35
//iOS7 kIOHIDTransducerTypeHand == 3
IOHIDEventRef handEvent = IOHIDEventCreateDigitizerEvent(kCFAllocatorDefault, timeStamp, kIOHIDTransducerTypeHand, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

//Got on iOS7.
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerDisplayIntegrated, 1, -268435456); //-268435456
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldBuiltIn, 1, -268435456); //-268435456

int handEventMask = 0;
int handEventTouch = 0;

CGFloat rX = 50;
CGFloat rY = 50;

IOHIDEventRef fingerEvent = IOHIDEventCreateDigitizerFingerEventWithQuality(kCFAllocatorDefault, timeStamp,
                                                                            1, 2, kIOHIDDigitizerEventRange | kIOHIDDigitizerEventTouch, rX, rY, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0);
IOHIDEventAppendEvent(handEvent, fingerEvent);
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerEventMask, handEventMask, -268435456);
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerRange, handEventTouch, -268435456);
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerTouch, handEventTouch, -268435456);
return handEvent;

}

- (IOHIDEventRef)getupEvent
{
uint64_t abTime = mach_absolute_time();
AbsoluteTime timeStamp = *(AbsoluteTime *) &abTime;

//iOS6 kIOHIDDigitizerTransducerTypeHand == 35
//iOS7 kIOHIDTransducerTypeHand == 3
IOHIDEventRef handEvent = IOHIDEventCreateDigitizerEvent(kCFAllocatorDefault, timeStamp, kIOHIDTransducerTypeHand, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

//Got on iOS7.
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerDisplayIntegrated, 1, -268435456); //-268435456
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldBuiltIn, 1, -268435456); //-268435456

int handEventMask = 0;
int handEventTouch = 0;

CGFloat rX = 50;
CGFloat rY = 50;

IOHIDEventRef fingerEvent = IOHIDEventCreateDigitizerFingerEventWithQuality(kCFAllocatorDefault, timeStamp,
                                                                            1, 2, kIOHIDDigitizerEventRange | kIOHIDDigitizerEventTouch, rX, rY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
IOHIDEventAppendEvent(handEvent, fingerEvent);
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerEventMask, handEventMask, -268435456);
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerRange, handEventTouch, -268435456);
IOHIDEventSetIntegerValueWithOptions(handEvent, kIOHIDEventFieldDigitizerTouch, handEventTouch, -268435456);
return handEvent;

}

程序运行以后没有崩溃,但是也没有任何反应…
viewDidLoad里的代码是我自己看H文件找出来的,我也不知道这几句能不能把event发送出去…
getPort方法是在google找的,能返回一个5位数字,这应该是成功获取到port了吧?
生成evet的方法是参照SimulateTouch的源码写的,一头雾水哎…
路过的大神指点一下吧,就想实现个模拟点击,折腾了快俩月了,完全没头绪:sob:

3 个赞

我没做过这玩意儿啊。
我觉得你decache一下IOKit逆向可能能找到问题在哪
或者写封邮件给simulatetouch作者问问

1 个赞

试试这个吧:enter link description here

模拟点击使用UIAutomation不是更好。

论坛里搜SimulateTouch

这个帖子我两个月前就看过啦,当时试过并不好用,貌似SimulateTouch并不支持iOS8?

UIAutomation必须要有程序源码才行吧?
我最终是想在Tweak中使用模拟点击

有空我再多试试吧
其实上次试了好多次都没成功,我用的openDEV
我也试过改SimulateTouch.mm这个文件,但是总编译错误
Undefined symbols for architecture x86_64:
“_IOHIDEventSetSenderID”, referenced from:
SendTouchesEvent(unsigned int) in TouchMM.o
SendHIDEvent(__IOHIDEvent*) in TouchMM.o
“_IOHIDEventSystemClientCreate”, referenced from:
SendHIDEvent(__IOHIDEvent*) in TouchMM.o
“_IOHIDEventSystemClientDispatchEvent”, referenced from:
SendHIDEvent(__IOHIDEvent*) in TouchMM.o
“_MSHookFunction”, referenced from:
void MSHookFunction<unsigned char (___IOHIDEventSystem*, void ()(void, void*, __IOHIDService*, __IOHIDEvent*), void*, void*, void*)>(unsigned char ()(___IOHIDEventSystem, void ()(void, void*, __IOHIDService*, __IOHIDEvent*), void*, void*, void*), unsigned char ()(___IOHIDEventSystem, void ()(void, void*, __IOHIDService*, __IOHIDEvent*), void*, void*, void*), unsigned char (**)(___IOHIDEventSystem*, void ()(void, void*, __IOHIDService*, __IOHIDEvent*), void*, void*, void*)) in TouchMM.o
“_rocketbootstrap_cfmessageportexposelocal”, referenced from:
_MSInitialize() in TouchMM.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

……IOKit……不行dlsym大法:monkey:

新开的贴被锁啦,我想的是新开一贴会方便以后的人查找…
在这里重发一遍

自己写按键精灵——用SimulateTouch模拟点击及滑动
刚才按照这个帖子的步骤又搞了一遍:
先新建了个tool工程

把libsimulatetouch.dylib和SimulateTouch.h放在了对应的位置

makefile文件就改了一下target的版本号

main.mm文件就不截图了,一模一样复制的…

然后make

make以后多了个文件夹

ssh到手机 touch 6 6没有点击备忘录的返回按钮

不知道是哪一步做的不对哇:sob:

你命令里的touch是哪里来的?

我也不太清楚啊,这方面真的不懂,完全是按教程一步一步做

我把手机里我自己写的插件都删了 但是这个touch命令还是存在 好奇怪啊
有什么办法能查一下这个命令的来源么?

好像是ST包里自带的

我把手机里的SimulateTouch插件删了 还是有这个命令

dpkg -S 绝对路径? 我这也没越狱设备

好像手机里也没什么跟touch相关的东西了

这是GNU Utils里的touch,不是你要的那种意思
@snakeninny 他这一查我确认了,这个是gnu基础包里的那个。最简单的用法:

touch README.md

创建一个名为README.md的空白文件

:fearful:确实是,我竟然米有想到……