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

Латентность при нажатии кнопки гарнитуры в iphone

Я пытаюсь инициировать различные действия внутри только моего собственного приложения, используя кнопки подключенной гарнитуры (что-то похожее на то, что делает нажатие). Однако я заметил, что независимо от того, использую ли я делегат MPRemoteCommandCenter или remoteControlReceivedWithEvent, я получаю события с заметным отставанием. Что еще хуже, так это то, что если я попытаюсь дважды нажать кнопку быстрого доступа, я получу только один UIEventTypeRemoteControl.

Кто-нибудь сталкивается с подобной проблемой, знает причину этого или даже лучше знает какое-то обходное решение? Протестировано под ios8 и ios9.

4b9b3361

Ответ 1

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

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

Длинный, болезненный, но, надеюсь, полезный пример обнаружения двойного пресса:

  • Пользователь нажимает на управление гарнитурой.
  • Системные уведомления нажмите, ждет выхода
  • Пользователь запускает управление гарнитурой.
  • Освобождение системных уведомлений, обнаружение кнопки времени было приостановлено (длительное нажатие против короткого нажатия) и очереди с одним нажатием.
  • Система ожидает 200 мс в случае двойного нажатия
  • Это! Пользователь нажимает на управление гарнитурой.
  • Системные уведомления нажмите, ждет выхода
  • Пользователь запускает управление гарнитурой.
  • Система преобразует событие однократного нажатия в очереди в событие двойного нажатия
  • Система ожидает 200 мс, если это тройной пресс
  • Пользователь не вводит пользователя в течение 200 мс
  • Система запускает событие двойного нажатия и очищает очередь

Посмотрите, как необходима задержка для обнаружения одиночного/двойного/тройного нажатий.

Когда событие достигнет вашего приложения, у него будет подтип, который описывает, какой тип щелчка пользователь сделал:

let rc = event!.subtype
print("received remote control \(rc.rawValue)") // 101 = pause, 100 = play

switch rc {
    case .RemoteControlTogglePlayPause:
        // ..
    case .RemoteControlPlay:
        // ..
    case .RemoteControlPause:
        // ..
    default:break
}

В ответе на подобный вопрос указано, что эти целые числа кода кода будут такими:

100 = play
101 = pause
103 = single mic click
104 = double mic click
105 = triple mic click
etc ...