Как найти фиолетовый порт для самого переднего приложения в IOS 5 и выше?
Я пытаюсь написать приложение, которое работает в фоновом режиме и вводит прикосновения к трамплину или другим приложениям. Я понимаю, что буду использовать частные API и структуры. Приложение является корпоративным приложением и не требует одобрения для AppStore.
Я использую структуру GSEvent, предложенную KennyTM, с некоторыми незначительными изменениями для IOS 5/6. Я могу отправлять сенсорные события и другие события на Springboard, отправляя GSSystemEvents.
Мне нужно иметь возможность отправлять похожие события и в другие приложения, но я не могу найти порт для самого переднего приложения.
Есть ли способ получить порт для приложения, которое является начальным и запущенным, чтобы я мог отправить свои GSEvent s в приложение?
Было бы неплохо, если бы кто-то мог указать мне на примеры или показать, как я могу получить фиолетовый порт самого переднего приложения.
Спасибо!
1 ответ
ОБНОВЛЕНИЕ: я не проверял это на ios7.
Мне довелось работать по точно такому же требованию раньше.
Чтобы получить фиолетовый порт, вы можете использовать GSCopyPurpleNamedPort() с идентификатором пакета в качестве аргумента.
Если вам нужно смоделировать касание в 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. Вам может не понадобиться блокировка, если вы не вводите, когда появляется экран блокировки. Надеюсь это поможет.