Подтвердить что ты не робот

Как найти фиолетовый порт для большинства приложений в IOS 5 и выше?

Я пытаюсь написать приложение, которое работает в фоновом режиме и вводит штрихи в трамплин или другие приложения. Я понимаю, что буду использовать частные API и структуры. Приложение является корпоративным приложением и не нуждается в одобрении для AppStore.

Я использую структуру GSEvent, предложенную KennyTM, с некоторыми незначительными изменениями для IOS 5/6. Я могу отправить события касания и другие события на Springboard, отправив GSSystemEvents.

Мне также нужно отправлять похожие события в другие приложения, но я не могу найти порт для самого большого приложения.

Есть ли способ получить порт для приложения, которое работает и работает, чтобы я мог отправлять свои GSEvents в приложение?

Было бы неплохо, если бы кто-то мог указать мне на примеры или показать мне, как я могу получить фиолетовый порт самого большого приложения.

Спасибо!

4b9b3361

Ответ 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. Вам может не понадобиться блокировка, если вы не вводите ее, когда появляется экран блокировки. Надеюсь, это поможет.