Мешают ли 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 решает, что лучше не воспроизводить обратную связь сразу.
Мораль истории: помните, какие очереди вы используете.