Настройка
Мое приложение 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
.