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

IOS: Как обнаружить клавиши escape/control на аппаратной клавиатуре Bluetooth?

Я пытаюсь понять, как обнаружить, что Escape (и другие комбинации клавиш, такие как Ctrl и alt) были нажаты на клавиатуре Bluetooth, подключенной к устройству iOS.

Некоторые ответы, похоже, предполагают, что это невозможно. Однако в Appstore есть приложения, которые делают это (например, iSSH), поэтому я предполагаю, что это возможно, используя общедоступные API.

Я попытался создать свой собственный UITextInput, однако это ничего не получает при нажатии клавиши Escape. Единственная часть API, которую я могу увидеть, где iPad может реагировать, - это когда VoiceOver включен (Escape работает как в Safari), поэтому мне интересно, есть ли способ через API доступности?

Я также пытался посмотреть, есть ли что-то, что я могу наблюдать из NSNotificationCenter, который мог бы помочь, но еще ничего не нашел.

Предложения приветствуются, я вот-вот взломал это на день, и теперь я немного потерял.

4b9b3361

Ответ 1

Вы можете сделать это сейчас в iOS 7. Например, чтобы реализовать escape-ключ, переопределите UITextView и поместите в свой класс следующие методы:

- (NSArray *) keyCommands {
    UIKeyCommand *esc = [UIKeyCommand keyCommandWithInput: UIKeyInputEscape modifierFlags: 0 action: @selector(esc:)];
    return [[NSArray alloc] initWithObjects: esc, nil];
}

- (void) esc: (UIKeyCommand *) keyCommand {
    // Your custom code goes here.
}

Вам не нужно проверять, что вы находитесь на iOS 7, поскольку более ранние версии ОС не будут вызывать метод keyCommands.

Ответ 2

Нет публичных API для того, что вы намереваетесь выполнить, поэтому это может привести к отказу.

Если вы готовы рискнуть, вы можете попробовать this. В основном перехватывает все события, отправленные в ваше приложение, перезаписывая sendEvent: в UIApplication.

Ответ 3

AFAIK это невозможно с использованием общедоступного API. Я немного поработал, и ключ esc не распознается. Единственное, что я не делал, это попробовать iSSH (он стоит 9 €:-), но если вы прочитаете описание в AppStore, то станет ясно, что клавиша esc на аппаратной (bluetooth) клавиатуре не работает, t:

  • Поддержка исчерпывающего ключа. Имеет ключи arrow (всплывающее окно или панель инструментов). ctrl, alt, esc, tab, shift, Fn (1-10), `, PgUp, PgDown и для тех ключей, которые не указаны, означает их добавить.

  • Поддержка клавиатуры Bluetooth для клавиш arrow, function и переназначение ключа ctrl с помощью сопоставления ключей опций на сервере или терминале X11/VNC. Когда включено, пресет Option + key отображает эквивалент ctrl + key.

Как вы можете видеть, во второй строке ключ esc не упоминается. Более того, я нашел это (старое) сообщение .

EDIT:

Как ваши последние обновления, я нашел способ "скрыть" _gsEvent внутри двоичного файла. Однако я не знаю, может ли Apple статический анализатор найти его. Трюк прост... создайте селектор _gsEvent (и другие частные селекторы) во время выполнения!

-(void)sendEvent:(UIEvent *)event
{

    SEL aSelector = NSSelectorFromString([self theSelector]);
    if ([event respondsToSelector:aSelector]) {

        NSLog(@"Event: %@", event.description);
    }

    [super sendEvent:event];
}

-(NSString *)theSelector
{
    // compose the keyword as you prefer
    NSString *sel = [NSString stringWithFormat:@"%@g%@%@ent", @"_", @"s", @"Ev"];
    return sel;
}

Я попытался выполнить поиск внутри двоичного файла, и я не нашел ключевое слово _gsEvent, очевидно, потому что он создан только во время выполнения.
Надеюсь, это поможет.