如何findIOS 5以上的最前面的应用程序的紫色端口?

我正在尝试编写一个在后台运行的应用程序,并将其注入到跳板或其他应用程序中。 我明白,我将使用私人API和结构。 该应用程序是一个企业应用程序,并不需要为AppStore批准。

我正在使用KennyTMbuild议的GSEvent结构,并对IOS 5/6做了一些小修改。 我可以通过发送GSSystemEvents来发送触摸事件和其他事件给Springboard。

我需要能够发送类似的事件到其他应用程序,但我无法find最前面的应用程序的端口。

有没有一种方法来获得应用程序的端口和运行,以便我可以发送我的GSEvents到应用程序?

如果有人能指点我的例子,或者告诉我如何才能获得最前面的应用程序的紫色端口,那将是非常好的。

谢谢!

更新:我没有在ios7上testing过。

我碰巧在以前完全一样的要求上工作。

要获得紫色端口,可以使用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); } 

我已经testing过…这在iOS 5和6上工作正常。如果在locking屏幕出现时没有注入,则可能不需要locking部分。 希望这可以帮助。