2013-04-22 7 views
11

Ich versuche eine App zu schreiben, die im Hintergrund läuft und dem Sprungbrett oder anderen Apps etwas hinzufügt. Ich verstehe, dass ich private APIs und Strukturen verwenden werde. Die App ist eine Unternehmensanwendung und muss nicht für den AppStore freigegeben werden.Wie finde ich den lila Port für die vorderste Anwendung in IOS 5 und höher?

Ich verwende die GSEvent-Struktur wie von KennyTM vorgeschlagen mit einigen kleineren Änderungen für IOS 5/6. Ich kann Berührungsereignisse und andere Ereignisse an das Springboard senden, indem ich GSSystemEvents sende.

Ich muss in der Lage sein, ähnliche Ereignisse an andere Anwendungen zu senden, aber ich bin nicht in der Lage, den Port für die vorderste Anwendung zu finden.

Gibt es eine Möglichkeit, den Port für die Anwendung zu erhalten, die im Voraus ausgeführt wird, damit ich meine GSEvents an die App senden kann?

Es wäre schön, wenn jemand mich auf Beispiele zeigen oder mir zeigen könnte, wie ich den lila Port der Front App bekommen kann.

Danke!

Antwort

12

UPDATE: Ich habe dies nicht auf ios7 getestet.

Ich arbeite zufällig auf genau die gleiche Anforderung vor.

Um den violetten Port zu erhalten, können Sie GSCopyPurpleNamedPort() mit der Bündel-ID als Argument verwenden.

Wenn Sie Touch auf SpringBoard simulieren müssen, verwenden Sie GSGetPurpleSystemEventPort.

Mit diesem Code unten, sollten Sie in der Lage sein, den Anschluss zu bekommen und es verwenden, um Touch-System weit zu injizieren.

#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); 
} 

ich getestet habe ... das funktioniert gut auf iOS 5 und 6. Sie könnten das Schlossteil nicht benötigen, wenn Sie injizieren nicht, wenn die Sperre Bildschirm nach oben zeigt. Hoffe, das hilft.

+0

Das hat super funktioniert! Vielen Dank! – mercury00x

+0

@ mercury00x du bist sehr willkommen – pt2121

+1

Großartig !! Lief wie am Schnürchen..!! – Apurv

Verwandte Themen