2014-11-12 4 views
9

Есть много связанных вопросов, но (по-видимому) нет ответов. SO ...iOS Как подключиться к устройству BLE в фоновом режиме?

My iOS app делает получает обновления с моего устройства BLE, когда приложение находится в фоновом режиме. Если я потеряю связь с устройством BLE, то в centralManager:didDisconnectPeripheral: я звоню - [CBCentralManager cancelPeripheralConnection:] - иначе я никогда не буду снова подключаться к утерянному периферийному устройству. Затем я вызываю вызов [(re) »- [CBCentralManager scanForPeripheralsWithServices:options:].

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

Так что я могу общаться с подключенным устройством BLE в фоновом режиме (yay!), Но не для повторного подключения. Это очень важно для моего приложения, и (можно подумать) для других приложений. Предложения приветствуются.

ответ

5

Paul был прав, что мне не нужно было отменять соединение, и мне не нужно было повторно сканировать, и, что все, что мне нужно было сделать, это позвонить connectPeripheral. НО ... что я не делал, было это:

_manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)]; 

Я проходил ноль для очереди, а это означает, мои CBCentralManagerDelegate обратные вызовы были запущены в основном потоке.

8

Вам не нужно отменять соединение - оно уже отключено Не требуется повторное сканирование для периферийного устройства - вы уже определили свое периферийное устройство.

В didDisconnectPeripheral вы можете просто позвонить

[central connectPeripheral:peripheral options:nil]; 

Ядро Bluetooth будет восстановить после того, как периферийное видна снова

Полный образец здесь - https://github.com/paulw11/BTBackground

+0

К сожалению, не для меня. Фактически, используя connectPeripheral (вместо повторного вызова scanForPeripherals), мое приложение не пересоединяется, даже если оно все еще находится на переднем плане. Соединение никогда не восстанавливается.Если я вызываю scanForPeripheral в didDisconnectPeripheral, я * do * повторно подключаюсь, если на переднем плане, но все еще не в фоновом режиме. Grr. –

+0

Устройство TI SensorTag, FWIW. –

+0

Хорошо. Теги датчиков раздражают - они закрываются через несколько минут, поэтому я не уверен, что это ваша проблема. Устройства iOS также трудно работать, поскольку они меняют MAC-адрес каждые несколько минут. У меня есть сенсорный тег, поэтому я буду играть и посмотреть, что произойдет. Это может занять меня день или два ... – Paulw11

0

В закладке "Возможности" -> История Режимы, выберите «Пользователи Bluetooth LE аксессуары» и «Действует как аксессуар Bluetooth LE». Я не уверен, что он может работать, но вы можете попробовать.

+0

Благодарим вас за предложение. Я уже использовал аксессуары Bluetooth LE. Я добавил Acts As, но это ничего не изменило. Хорошая идея. Всегда нужно пробовать вещи, которые * не должны * работать. Потому что они могут работать! –

3

Я знаю, что вы, вероятно, уже все выяснили. Я сам тоже наткнулся на эту проблему. Выполнение следующих действий в одиночку не будет полностью решить эту проблему (по крайней мере для меня):
[central connectPeripheral:peripheral options:nil];

Вместо «ноль» для опций, вам необходимо будет предоставить «варианты» в описанном выше способе. Есть и другие вещи, которые вам нужно настроить (например, info.plist для вашего приложения). После прочтения инструкции Apple о том, как включить фоновый режим работы bluetooth для приложения. Я смог заставить его работать и получать события для подключения, отключения, обновления и т. Д., Даже сканирование может работать на заднем плане. Чтобы не повторять все, о чем писал документ Apple, вы можете ознакомиться по следующей ссылке:
Core Bluetooth Background Processing for iOS Apps

Надеюсь, это поможет.

+0

Для меня ключ передавал соответствующий параметр для очереди, как указано выше. Тем не менее, варианты определенно актуальны. Благодарю. –

Смежные вопросы