задержка при нажатии кнопки гарнитуры в iphone

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

кто-нибудь испытывает подобную проблему, знает причину этого или даже лучше знает некоторые обходные пути? Испытано под ios8 и iOS 9 охота.

1 ответов


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

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

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

  1. пользователь нажимает на управление гарнитурой
  2. системные уведомления нажмите, ждет выпуска
  3. пользователь выпускает управление гарнитурой
  4. выпуск системных уведомлений, обнаруживает, что кнопка времени была удержана (длительное нажатие против короткого нажатия) и очереди одно нажатие событие
  5. система ждет 200ms в случае, если это двойное нажатие
  6. это! Пользователь нажимает на управление гарнитурой
  7. системные уведомления нажмите, ждет выпуска
  8. пользователь выпускает управление гарнитурой
  9. система преобразует событие с одним нажатием в очередь в событие с двойным нажатием
  10. система ждет 200ms в случае, если это тройное нажатие
  11. нет пользовательского ввода в течение 200 мс
  12. система запускает событие двойного нажатия и очищает очередь

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

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

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 ...