`

iOS模拟屏幕点击事件

 
阅读更多

参考:

http://blog.csdn.net/guojin08/article/details/14525881

iOS私有头文件:

https://github.com/kennytm/iphone-private-frameworks

iOS 6.0模拟器的私有库路径:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/System/Library/PrivateFrameworks

 

真机iOS7.1系统的私有库路径:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/PrivateFrameworks

 

iPod-5.1.1的私有库路径:

/Users/tangwu/Library/Developer/Xcode/iOS DeviceSupport/5.1.1 (9B206)/Symbols/System/Library/PrivateFrameworks

 

#include <mach/mach_time.h>
#import <objc/message.h>
#import <dlfcn.h>

#import "SsjjSyViewController.h"
#import "GraphicsServices.h"
#import "GraphicsServices.h"

#define SBSERVPATH  "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"


@interface SsjjSyViewController ()

@end


static mach_port_t getFrontMostAppPort() {
    mach_port_t *port;
    void *lib = dlopen(SBSERVPATH, RTLD_LAZY);
    int (*SBSSpringBoardServerPort)() = dlsym(lib, "SBSSpringBoardServerPort");
    port = (mach_port_t *)SBSSpringBoardServerPort();
    dlclose(lib);
    
    void *(*SBFrontmostApplicationDisplayIdentifier)(mach_port_t *port, char *result) = dlsym(lib, "SBFrontmostApplicationDisplayIdentifier");
    char appId[256];
    memset(appId, 0, sizeof(appId));
    SBFrontmostApplicationDisplayIdentifier(port, appId);
    return GSCopyPurpleNamedPort(appId);
}

@implementation SsjjSyViewController


- (void)sendTap : (CGPoint) point{
    [self sendTouchStart:point];
    [self sendTouchEnd:point];
}

- (void)sendTouchStart: (CGPoint) point{
    [self sendEventForPhase:UITouchPhaseBegan point:point];
}

- (void)sendTouchEnd: (CGPoint) point{
    [self sendEventForPhase:UITouchPhaseEnded point:point];
}

- (void)sendEventForPhase: (UITouchPhase)phase
                   point : (CGPoint) point{
    CGPoint adjustedPoint = [self.view convertPoint:point toView:self.view.window];

//    NSLog(@"point : %@ \n NSStringFromCGPoint(adjustedPoint: %@ \n", NSStringFromCGPoint(point), NSStringFromCGPoint(adjustedPoint));
    uint8_t touchEvent[sizeof(GSEventRecord) + sizeof(GSHandInfo) + sizeof(GSPathInfo)];
    struct GSTouchEvent {
        GSEventRecord record;
        GSHandInfo    handInfo;
    } * event = (struct GSTouchEvent*) &touchEvent;
    bzero(event, sizeof(event));
    event->record.type = kGSEventHand;
    event->record.subtype = kGSEventSubTypeUnknown;
    event->record.location = point;
    event->record.timestamp = GSCurrentEventTimestamp();
    event->record.infoSize = sizeof(GSHandInfo) + sizeof(GSPathInfo);
    event->handInfo.type = (phase == UITouchPhaseBegan) ? kGSHandInfoTypeTouchDown : kGSHandInfoTypeTouchUp;
    event->handInfo.pathInfosCount = 1;
    
    bzero(&event->handInfo.pathInfos[0], sizeof(GSPathInfo));
    event->handInfo.pathInfos[0].pathIndex     = 1;
    event->handInfo.pathInfos[0].pathIdentity  = 2;
    event->handInfo.pathInfos[0].pathProximity = (phase == UITouchPhaseBegan) ? 0x03 : 0x00;
    event->handInfo.pathInfos[0].pathLocation  = adjustedPoint;
    
    mach_port_t port = getFrontMostAppPort();
    GSEventRecord* record = (GSEventRecord*)event;
    record->timestamp = GSCurrentEventTimestamp();
    GSSendEvent(record, port);
}







- (void)viewDidLoad
{
    [super viewDidLoad];
    UIButton    *btn1 = [[UIButton alloc] initWithFrame:CGRectMake(40, 40, 200, 100)];
    [btn1 setTitle:@"按钮1" forState:UIControlStateNormal];
    [btn1 setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];
    
    [btn1 addTarget:self action:@selector(btn1TouchDown:) forControlEvents:UIControlEventTouchDown];
    [btn1 addTarget:self action:@selector(btn1TouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:btn1];

    UIButton    *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(40, 150, 200, 100)];
    [btn2 setTitle:@"按钮2" forState:UIControlStateNormal];
    [btn2 setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];
    
    [btn2 addTarget:self action:@selector(btn2TouchDown:) forControlEvents:UIControlEventTouchDown];
    [btn2 addTarget:self action:@selector(btn2TouchUpInside:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn2];
    


}

- (void) btn1TouchDown: (id) sender
{
    UIButton    *btn1 = (UIButton *) sender;
    [btn1 setHighlighted:YES];

}

- (void) btn1TouchUpInside: (id) sender
{
    UIButton    *btn1 = (UIButton *) sender;
    [btn1 setHighlighted:NO];
    CGPoint     point = CGPointMake(50, 155);
    [self sendTap:point];
}


- (void) btn2TouchDown: (id) sender
{
    NSLog(@"btn2TouchDown\n");
    UIButton    *btn2 = (UIButton *) sender;
    [btn2 setHighlighted:YES];
}

- (void) btn2TouchUpInside: (id) sender
{
    NSLog(@"btn2TouchUpInside\n");
    UIButton    *btn2 = (UIButton *) sender;
    [btn2 setHighlighted:NO];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 

分享到:
评论

相关推荐

    PTFakeTouchDemo iOS模拟点击屏幕例子

    iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟...

    ZSFakeTouch iOS模拟点击屏幕

    iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作

    ios系统点击源码,实现iphone手机上的系统点击事件

    在iOS开发中,实现系统点击事件的模拟是一项关键技能,特别是在自动化测试、远程控制或特殊交互设计中。本文将深入探讨如何使用iOS的系统点击源码来实现iPhone手机上的系统点击事件。 首先,我们需要理解iOS事件...

    IOS Touch屏幕点击

    本文将深入探讨iOS中的触摸事件处理,以及如何实现屏幕点击及图片移动效果,主要围绕Cocos2d-x框架进行讨论,因为压缩包中的文件名暗示了我们可能正在使用这个2D游戏引擎。 ### 一、iOS Touch事件处理基础 iOS系统...

    代码模拟点击反控iOS页面

    在iOS开发中,有时我们需要对应用进行自动化测试或者远程控制,这时“代码模拟点击反控iOS页面”的技术就显得尤为重要。这个技术主要依赖于苹果提供的自动化测试框架,如UIAutomation,以及私有API来实现。下面我们...

    CSS3+jQuery 模拟 iOS passbook

    在本项目中,"CSS3+jQuery 模拟 iOS passbook" 的目标是利用现代Web技术,即CSS3和jQuery,来创建一个视觉上与苹果iOS设备上的Passbook应用相似的网页元素。Passbook是iOS系统中的一款应用程序,用于存储各种电子...

    python模拟点击在ios中实现的实例讲解

    那么之前学会python模拟点击的小伙伴开始担心,如果手机是ios版本那还能使用吗?这个问题小编进行了测试,小伙伴们完全不用忧虑ios版本,因为经过测试的结果是可以使用的。具体在ios中模拟点击使用的细节大家也可以...

    IOS手机录屏 IOS自动化

    iOS录屏的基本操作可以通过系统内置的“屏幕录制”功能实现,用户只需在控制中心找到屏幕录制按钮并点击即可开始录制。然而,当需要进行更复杂的自动化操作时,比如在应用程序测试或数据分析中,就需要利用到iOS自动...

    PTFakeTouch:模拟iOS的触摸事件[用户模式]

    模拟iOS的触摸事件[用户模式] 仅在应用程序中启用,系统触摸模拟库: : 只需构建它,然后将此框架添加到您的项目中即可。 然后就可以使用它了。 附件来自kif。 使用案例 单击屏幕上的一个点 NSInteger ...

    通过手势模拟的iOS3DTouch效果.zip

    在iOS系统中,3D Touch是一项独特且强大的功能,它允许用户通过按压屏幕的不同力度来触发不同的操作。然而,Android设备并未广泛支持类似的技术,如Force Touch或3D Touch。针对这一情况,开发者们创建了一个开源...

    iOS12真机调试资源包

    3. **App Limits**:为了帮助用户更好地管理屏幕时间,iOS 12引入了“屏幕使用时间”功能,可监控并限制应用的使用。 4. **通知改进**:新的通知分组功能使用户可以更有效地管理通知,减少通知干扰。 5. **Siri ...

    模拟iOS发送通知,验证push证书

    5. 点击发送按钮,如果一切配置正确,你的iOS设备应该会接收到模拟的通知。 在开发过程中,确保通知的正确发送和接收是至关重要的。有时,问题可能出现在证书配置、Device Token获取或者服务器端的推送代码。使用像...

    仿ios点击状态栏回到顶部功能修改版

    在iOS系统中,用户可以通过点击屏幕顶部的状态栏来快速回到应用内容的顶部,这是一个非常方便的设计。本项目针对这一功能进行了仿制,并对原有代码进行了修改,以解决之前版本中存在的问题,即在点击返回或者回到...

    VS2022 Maui实现Android手机模拟屏幕操作,截屏、点击、滑动

    【标题】:“VS2022 Maui实现Android手机模拟屏幕操作,截屏、点击、滑动” 【描述】:“在VS2022 测试是可以的”表明在Visual Studio 2022环境下,我们可以成功地对Android应用程序进行自动化测试,包括模拟屏幕...

    IOS 弹出模拟模态对话框

    在模态控制器的某个事件(如登录按钮点击)中,调用`dismiss(animated:completion:)`方法来关闭模态对话框。 5. **自定义模态动画**: - 如果需要更复杂的动画效果,可以自定义`UIPresentationController`子类,...

    模拟屏幕浏览器

    4. **触摸事件模拟**:对于触屏设备,模拟屏幕浏览器可能支持模拟点击、滑动等触摸操作,验证交互设计的正确性。 5. **网页缩放与布局调整**:在不同分辨率下,网页的布局和元素可能会发生变化,工具应能展示这些...

    ios demo,单击按钮,延时某个操作,并且完成了动态创建弹出式菜单功能

    这个“ios demo”示例专注于两个核心功能:按钮点击后的延时操作以及动态创建弹出式菜单。这两个功能都是iOS应用中常见的需求,下面将详细介绍它们的实现原理和步骤。 首先,延时执行是一个常用的功能,它允许我们...

    ios-模拟购物功能.zip

    总的来说,这个“ios-模拟购物功能.zip”项目涵盖了iOS应用中商品信息展示与交互的关键部分,涉及到了UI设计、数据管理、事件处理和用户体验优化等多个技术点。通过深入学习和实践,开发者可以进一步提升自己的iOS...

    NRTouchPoints, 在屏幕上,模拟用户触摸的UIWindow子类.zip

    NRTouchPoints, 在屏幕上,模拟用户触摸的UIWindow子类 NRTouchPoints我希望能够为我的应用程序的用户录制一个教程。 当我有越狱时,这是可以能的,但是有一个非狱电的电话,这变得复杂了。 我发现的解决方案是使用...

    IOS16.3真机调试包

    5. **运行应用**:选择目标设备(这里是运行iOS 16.3的设备),然后点击运行按钮。Xcode会编译代码并将其推送到设备上,同时启动应用。 6. **调试**:在设备上操作应用时,Xcode的控制台会显示相应的输出信息。你...

Global site tag (gtag.js) - Google Analytics