¿Cómo encontrar el puerto morado para la aplicación más avanzada del IOS 5 y superior?

Estoy intentando escribir una aplicación que se ejecuta en segundo plano e inyecta toques al trampolín u otras aplicaciones. Entiendo que usaré API y estructuras privadas. La aplicación es una aplicación empresarial y no necesita ser aprobada para AppStore.

Estoy usando la estructura de GSEvent como lo sugirió KennyTM con algunas modificaciones menores para IOS 5/6. Puedo enviar events táctiles y otros events al Springboard enviando GSSystemEvents.

Necesito poder enviar events similares a otras aplicaciones también, pero no puedo encontrar el puerto para la aplicación más avanzada.

¿Hay alguna manera de get el puerto para la aplicación que está por adelantado y en ejecución para que pueda enviar mis GSEvents a la aplicación?

Sería bueno si alguien puede apuntarme a ejemplos o mostrarme cómo puedo get el puerto púrpura de la aplicación más avanzada.

¡Gracias!

ACTUALIZACIÓN: no he probado esto en ios7.

Sucede que trabajo exactamente antes con el mismo requisito.

Para get el puerto púrpura, puede usar GSCopyPurpleNamedPort () con el ID del package como argumento.

Si necesita simular tocar en SpringBoard, use GSGetPurpleSystemEventPort.

Con este código a continuación, debería poder get el puerto y usarlo para inyectar el sistema táctil.

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

He probado … esto funciona bien en iOS 5 y 6. Es posible que no necesite la parte de locking si no se inyecta cuando aparece la pantalla de locking. Espero que esto ayude.