Мешают ли Core Haptics и Core Bluetooth?

Настройка

Мое приложение iOS обменивается данными с устройством BLE. В ответ на определенные события в рамках этого сообщения я хотел бы обеспечить тактильную обратную связь с пользователем.

Пытаясь поддерживать старые телефоны, такие как iPhone 7, я решил использовать для этой цели UIFeedbackGenerator, а именно UIImpactFeedbackGenerator.

Теперь, когда я получаю указанные события через BLE, я вызываю feedbackGenerator.impactOccurred().

Поведение

Во время звонка тактильной обратной связи не происходит. Но система все равно помнит эти обращения к UIFeedbackGenerator.

Потому что, когда пользователь впоследствии взаимодействует с элементом пользовательского интерфейса, все вызовы tofeedbackGenerator.impactOccurred() запускаются одновременно, и в ответ на это взаимодействие с пользовательским интерфейсом предоставляется тактильная обратная связь. Что довольно сбивает с толку пользователя, который в тот момент не ожидал тактильной обратной связи. Кроме того, тактильная обратная связь может быть довольно интенсивной, если с течением времени накопилось достаточно звонков.

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

CAReportingClient.mm:295:-[CAReportingClient init]_block_invoke: не удалось связаться с вспомогательным приложением

В любом случае, это ожидаемое поведение в соответствии с документами Apple для UIFeedbackGenerator:

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

Мой вопрос

Есть ли у вас опыт определения того, меняет ли использование Core Bluetooth поведение CoreHaptics или UIFeedbackGenerator? Это моя отправная точка в отладке, потому что, когда я моделирую все части коммуникации локально, тактильная обратная связь работает просто отлично.

Что я уже пробовал

  • вызов UIFeedbackGenerator из основного/фонового потока
  • Использование UINotificationFeedbackGenerator вместо UIImpactFeedbackGenerator
  • Заранее позвоните prepare() по телефону UIFeedbackGenerator.

person JoRa    schedule 28.03.2020    source источник


Ответы (1)


Оказывается, я не уделял должного внимания своей реализации CoreBluetooth. Рабочий процесс, которому я запланировал постоянную отправку данных в характеристику, работал в DispatchQueue.global(qos: .userInitiated).

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

Мораль этой истории: помните, какие очереди вы используете.

person JoRa    schedule 05.04.2020