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

Настроить

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

В попытке поддержать старые телефоны, такие как iPhone 7, я решил использовать UIFeedbackGeneratorв частности UIImpactFeedbackGenerator для этого.

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

Поведение

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

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

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

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

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

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

Мой вопрос

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

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

  • вызов UIFeedbackGenerator из основного / фонового потока
  • С помощью UINotificationFeedbackGenerator вместо того UIImpactFeedbackGenerator
  • Вызов prepare() на UIFeedbackGenerator заблаговременно.

1 ответ

Решение

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

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

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

Другие вопросы по тегам