首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在iOS5及以上版本中找到最前面应用程序的紫色端口?

如何在iOS5及以上版本中找到最前面应用程序的紫色端口?
EN

Stack Overflow用户
提问于 2013-04-23 05:13:37
回答 1查看 3.8K关注 0票数 11

我正在尝试写一个在后台运行的应用程序,并为跳板或其他应用程序注入触摸。我知道我将使用私有API和结构。该应用程序是企业应用程序,不需要针对AppStore进行审批。

我使用KennyTM建议的GSEvent结构,并对iOS5/6做了一些小的修改。我可以通过发送GSSystemEvents将触摸事件和其他事件发送到跳板。

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

有没有办法获取应用程序的端口,这样我就可以将我的GSEvents发送到应用程序?

如果有人能给我举个例子,或者告诉我如何才能获得最前面的应用程序的紫色端口,那就太好了。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-23 06:04:02

更新:我还没有在ios7上测试过。

我以前也做过完全相同的工作。

要获得紫色端口,可以使用GSCopyPurpleNamedPort()并将包Id作为参数。

如果需要在SpringBoard上模拟触摸,请使用GSGetPurpleSystemEventPort。

使用下面的代码,您应该能够获取端口并使用它在系统范围内注入触摸。

代码语言:javascript
复制
#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);
}

我的tested...this在iOS 5和6上运行得很好。如果你在锁定屏幕显示时不注入,你可能不需要锁部分。希望这能有所帮助。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16156831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档