更新:我没有在 ios7 上测试过这个。
我之前碰巧在完全相同的要求上工作。
要获取紫色端口,您可以使用 GSCopyPurpleNamedPort() 并将捆绑 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 上运行良好。如果您在锁定屏幕出现时不注入,您可能不需要锁定部分。希望这可以帮助。