参考:
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
#import
#import
#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