2013-04-22 13 views
11

Sto provando a scrivere un'app che viene eseguita in background e inietta i tocchi al trampolino o ad altre app. Comprendo che userò API e strutture private. L'app è un'app aziendale e non deve essere approvata per l'App Store.Come trovare la porta viola per la maggior parte delle applicazioni frontali in IOS 5 e versioni successive?

Sto usando la struttura GSEvent come suggerito da KennyTM con alcune modifiche minori per IOS 5/6. Sono in grado di inviare eventi touch e altri eventi allo Springboard inviando GSSystemEvents.

Devo essere in grado di inviare eventi simili ad altre applicazioni, ma non riesco a trovare la porta per la maggior parte delle applicazioni.

C'è un modo per ottenere la porta per l'applicazione che è in anticipo e in esecuzione in modo che possa inviare i miei GSEvents all'app?

Sarebbe bello se qualcuno potesse indicarmi degli esempi o mostrarmi come ottenere la porta viola della parte anteriore della maggior parte delle app.

Grazie!

risposta

12

AGGIORNAMENTO: non l'ho provato su ios7.

Mi capita di lavorare prima con lo stesso esatto requisito.

Per ottenere la porta viola, è possibile utilizzare GSCopyPurpleNamedPort() con l'ID bundle come argomento.

Se è necessario simulare il tocco su SpringBoard, utilizzare GSGetPurpleSystemEventPort.

Con questo codice di sotto, dovresti essere in grado di ottenere la porta e usarla per iniettare il sistema touch wide.

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

Ho provato ... questo funziona bene su iOS 5 e 6. Potrebbe non essere necessario la parte di blocco se non si inietta quando la schermata di blocco si presenta. Spero che questo aiuti.

+0

Ha funzionato alla grande! Grazie! – mercury00x

+0

@ mercury00x siete i benvenuti – pt2121

+1

Ottimo .. !! Ha funzionato come un fascino .. !! – Apurv

Problemi correlati