簡體   English   中英

如何在IOS 5及以上版本中找到最前端應用的紫色端口?

[英]How to find the purple port for the front most application in IOS 5 and above?

我正在嘗試編寫一個在后台運行的應用程序,並為跳板或其他應用程序注入觸摸。 我知道我將使用私有API和結構。 該應用程序是一個企業應用程序,無需批准AppStore。

我正在使用KennyTM建議的GSEvent結構,對IOS 5/6進行一些小修改。 我可以通過發送GSSystemEvents將觸摸事件和其他事件發送到Springboard。

我需要能夠將類似的事件發送到其他應用程序,但我無法找到最前面的應用程序的端口。

有沒有辦法獲得前期和運行的應用程序的端口,以便我可以將我的GSEvents發送到應用程序?

如果有人可以指出我的例子或告訴我如何獲得最前端應用程序的紫色端口,那將是很好的。

謝謝!

更新:我沒有在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上工作正常。如果你在鎖定屏幕出現時沒有注入,你可能不需要鎖定部分。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM