如何获取 FrontMost App 是 iOS8

Posted

技术标签:

【中文标题】如何获取 FrontMost App 是 iOS8【英文标题】:How to get FrontMost App is iOS8 【发布时间】:2014-09-19 17:46:57 【问题描述】:

之前我使用弹簧板框架来获取最前面的应用程序,它在 ios7 之前运行良好,但在 iOS8 中。我没有得到最前面的应用程序名称。我正在使用此代码。

#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"
#define UIKITPATH "/System/Library/Framework/UIKit.framework/UIKit"
 //To get port
    mach_port_t *p;
    void *uikit = dlopen(UIKITPATH, RTLD_LAZY);
    int (*SBSSpringBoardServerPort)() =
    dlsym(uikit, "SBSSpringBoardServerPort");
    p = (mach_port_t *)SBSSpringBoardServerPort();
    dlclose(uikit);

void *sbserv = dlopen(SBSERVPATH, RTLD_LAZY);

void* (*SBFrontmostApplicationDisplayIdentifier)(mach_port_t* port,char * result) =
    dlsym(sbserv, "SBFrontmostApplicationDisplayIdentifier");
    //Get frontmost application
    char frontmostAppS[256];
    memset(frontmostAppS,sizeof(frontmostAppS),0);
    SBFrontmostApplicationDisplayIdentifier(p,frontmostAppS);
    NSString * frontmostApp=[NSString stringWithFormat:@"%s",frontmostAppS];

谁能帮我解决这个问题。 或者任何我有错误的地方,可以请添加一个灯。 提前致谢。

【问题讨论】:

你有 ios 8 的解决方案吗? 【参考方案1】:

你可能做不到。根据this post 的说法,通过 SBFrontmostApplicationDisplayIdentifier 获取最前面的应用程序被视为隐私泄露,已在 iOS 8 中被阻止。

【讨论】:

【参考方案2】:

如果您处于越狱环境并连接到 SpringBoard,您可以使用 SpringBoard 的 _accessibilityFrontMostApplication 获取对最前面的 SBApplication 的引用:

[[SpringBoard sharedApplication] _accessibilityFrontMostApplication]

如果返回nil,则用户在主屏幕上。

【讨论】:

以上是关于如何获取 FrontMost App 是 iOS8的主要内容,如果未能解决你的问题,请参考以下文章

在IOS8中使用共享扩展时如何获取源应用程序的bundleId

如何使用 XMPP ios8 获取最后一个对话用户?

ios8唤不起APP的问题

如何使用TestFlight进行App构建版本测试

iOS 8 Photos 框架:使用 iOS8 获取所有相册的列表

iOS8 In App Purchase收据验证