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

Внедрение системных событий касания на iOS7

До iOS7 можно было вводить события касания с помощью вызовов GSSendSystemEvent и GSSendEvent private API, например:

В iOS7 эти вызовы кажутся бесшумными. Альтернатива была предложена в Имитация общесистемных касаний в iOS 7, но она работает только на джейлбрейк-устройствах. https://github.com/kif-framework/KIF выглядит как еще один вариант, но, похоже, он поддерживает только инжекционные события для текущего приложения, а не по всей системе (так что вы не можете" t вводят событие касания, когда вы находитесь в фоновом режиме, например).

Итак, как вы можете вводить системные события с сенсорным экраном на iOS7 без джейлбрейка?

4b9b3361

Ответ 1

Я предполагаю, что вам нужно сделать это в рамках всей системы для сценария тестирования? В этом случае вам может быть хорошо обеспечена инфраструктура Apple UI Automation, инструмент на основе JavaScript, полезный для тестирования на устройстве.

В то время как вы не можете делать такие вещи, как симуляция нажатия кнопки "домашняя", вы можете отправить свое приложение на задний план в течение определенной продолжительности, например:

UIATarget.localTarget().deactivateAppForDuration(seconds);

Вот документы:

https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef

Ответ 2

Вы можете подклассировать UIWindow и перезаписать sendEvent. Я использую его для реализации шаблона нескольких прослушивателей, но вы также можете использовать его для запуска событий...

- (void)sendEvent:(UIEvent*)event {
    [super sendEvent:event];
    //NSLog(@"NSEventListenerWindow.sentEvent: %@\n", event);

    // pass all events on to those who listen
    for ( id listener in listeners) {
        if ([listener respondsToSelector:@selector(sendEvent:)]) {
            [listener sendEvent:event]; 
        }
    }
    .....

Ответ 3

Я думаю, вам будет лучше использовать службу IIS SDK Notification api. Это будет самый чистый способ достичь того, чего вы хотите.

Концептуально, Apple не намерена (третьи стороны) выпускать системные события, так как это не будет хорошо сочетаться с iOS тщательной моделью обучения, поэтому люди прибегают к частным API и джейлбрейку. Частные API, как следует из названия, не должны полагаться.

Подумайте об этом таким образом, если только вы не отвечаете за всю систему, которой пользовательское приложение не может быть, у вас действительно нет бизнес-системных событий. Я знаю, как Android это делает, но эта другая история (не подходит для этой темы).

На Mac, службы XPC Services api позволяют процессам взаимодействовать друг с другом, но не совсем способ генерации события в системе. Я бы посоветовал вам использовать API уведомлений iOS SDK, который, вероятно, был бы самым чистым методом для достижения того, чего вы хотите. Да, он выходит на Apple и возвращается к устройству, но тот механизм, который доступен до сих пор.