我正在尝试编写一个在后台运行的应用程序,并为跳板或其他应用程序注入触摸。我知道我将使用私有API和结构。该应用程序是一个企业应用程序,无需获得AppStore批准。
我正在使用KennyTM建议的GSEvent结构,对IOS 5/6进行一些小修改。我可以通过发送GSSystemEvents将触摸事件和其他事件发送到Springboard。
我需要能够将类似的事件发送到其他应用程序,但我无法找到最前面的应用程序的端口。
有没有办法获得前期和运行的应用程序的端口,以便我可以将我的GSEvents发送到应用程序?
如果有人可以指出我的例子,或者告诉我如何获得最前端应用程序的紫色端口,那将是很好的。
谢谢!
更新:我没有在ios7上测试过这个。
我之前碰巧完全按照相同的要求工作。
要获取紫色端口,可以使用GSCopyPurpleNamedPort()和bundle Id作为参数。
如果您需要在SpringBoard上模拟触摸,请使用GSGetPurpleSystemEventPort。
使用下面的代码,您应该能够获得端口并使用它来注入触摸系统。
#import <dlfcn.h>
// Framework Paths
#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"
-(mach_port_t)getFrontMostAppPort
{
bool locked;
bool passcode;
mach_port_t *port;
void *lib = dlopen(SBSERVPATH, RTLD_LAZY);
int (*SBSSpringBoardServerPort)() = dlsym(lib, "SBSSpringBoardServerPort");
void* (*SBGetScreenLockStatus)(mach_port_t* port, bool *lockStatus, bool *passcodeEnabled) = dlsym(lib, "SBGetScreenLockStatus");
port = (mach_port_t *)SBSSpringBoardServerPort();
dlclose(lib);
SBGetScreenLockStatus(port, &locked, &passcode);
void *(*SBFrontmostApplicationDisplayIdentifier)(mach_port_t *port, char *result) = dlsym(lib, "SBFrontmostApplicationDisplayIdentifier");
char appId[256];
memset(appId, 0, sizeof(appId));
SBFrontmostApplicationDisplayIdentifier(port, appId);
NSString * frontmostApp=[NSString stringWithFormat:@"%s",appId];
if([frontmostApp length] == 0 || locked)
return GSGetPurpleSystemEventPort();
else
return GSCopyPurpleNamedPort(appId);
}
我已经测试过......这在iOS 5和6上运行良好。
如果在锁定屏幕出现时未注入,则可能不需要锁定部件。
希望这可以帮助。
更新:我没有在ios7上测试过这个。
我之前碰巧完全按照相同的要求工作。
要获取紫色端口,可以使用GSCopyPurpleNamedPort()和bundle Id作为参数。
如果您需要在SpringBoard上模拟触摸,请使用GSGetPurpleSystemEventPort。
使用下面的代码,您应该能够获得端口并使用它来注入触摸系统。
#import <dlfcn.h>
// Framework Paths
#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"
-(mach_port_t)getFrontMostAppPort
{
bool locked;
bool passcode;
mach_port_t *port;
void *lib = dlopen(SBSERVPATH, RTLD_LAZY);
int (*SBSSpringBoardServerPort)() = dlsym(lib, "SBSSpringBoardServerPort");
void* (*SBGetScreenLockStatus)(mach_port_t* port, bool *lockStatus, bool *passcodeEnabled) = dlsym(lib, "SBGetScreenLockStatus");
port = (mach_port_t *)SBSSpringBoardServerPort();
dlclose(lib);
SBGetScreenLockStatus(port, &locked, &passcode);
void *(*SBFrontmostApplicationDisplayIdentifier)(mach_port_t *port, char *result) = dlsym(lib, "SBFrontmostApplicationDisplayIdentifier");
char appId[256];
memset(appId, 0, sizeof(appId));
SBFrontmostApplicationDisplayIdentifier(port, appId);
NSString * frontmostApp=[NSString stringWithFormat:@"%s",appId];
if([frontmostApp length] == 0 || locked)
return GSGetPurpleSystemEventPort();
else
return GSCopyPurpleNamedPort(appId);
}
我已经测试过......这在iOS 5和6上运行良好。
如果在锁定屏幕出现时未注入,则可能不需要锁定部件。
希望这可以帮助。