Вмешиваются ли Core Haptics и Core Bluetooth? - PullRequest
0 голосов
/ 28 марта 2020

Настройка

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

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

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

Поведение

Во время звонка никакой обратной связи не происходит c. Но система, тем не менее, запоминает эти вызовы на UIFeedbackGenerator.

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

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

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

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

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

Мой вопрос

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

То, что я уже пробовал

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

1 Ответ

0 голосов
/ 05 апреля 2020

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

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

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

...