如何在IOS 5及以上版本中找到前台应用程序的紫色端口?

11

我正在尝试编写一个在后台运行并向Springboard或其他应用注入触摸的应用程序。我明白我将使用私有API和结构。该应用是企业应用,不需要经过AppStore的审核。

我正在使用GSEvent结构,根据KennyTM的建议进行了一些小修改以适用于IOS 5/6。我能够通过发送GSSystemEvents将触摸事件和其他事件发送到Springboard。

我需要能够向其他应用程序发送类似的事件,但我找不到前台应用程序的端口。

是否有办法获取正在前台运行的应用程序的端口,以便我可以将我的GSEvents发送到该应用程序?

如果有人能为我指出示例或向我展示如何获取前台应用程序的紫色端口,那就太好了。

谢谢!

1个回答

12

更新:我尚未在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上运行良好。 如果您不在锁屏界面出现时注入,可能就不需要锁定部分。 希望这可以帮到你。


1
太棒了..!! 像魔法一样顺利运行..!! - Apurv
抱歉,我还没有在iOS7上测试过它。 - pt2121
请找到一些适用于iOS 7的方式。 - Mehul Thakkar
1
请如果有人对如何在iOS7上工作有想法,请尝试发布它。 - Dhekra Zaied

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接