2015-08-21 2 views
3

Я работаю над проектом BLE, все работает отлично, когда приложение находится на переднем плане. Он может обнаруживать и подключаться к периферии, все методы обратного вызова работают отлично.iOS: didDiscoverPeripheral не вызывается в фоновом режиме

Но проблема в том, что приложение в фоновом режиме (я нажимаю кнопку «домой»). Вызывается только метод делегата centralManagerDidUpdateState.

- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ 
    switch (central.state) { 
     case CBCentralManagerStatePoweredOn: 
      [self.cbCentralManager scanForPeripheralsWithServices:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }]; 
      break; 
     default: 
      break; 
    } 
} 

Я использую scanForPeripheralsWithServices:nil вариант, но если приложение в фоновом режиме, didDiscoverPeripheral обратный звонок никогда не звонил. Я редактировал свой файл plist с опцией «bluetooth-central», чтобы поддерживать центральную роль в фоновом режиме.

Любая идея, почему didDiscoverPeripheral метод не звонит, когда приложение в фоновом режиме?

+0

'didConnwctPeripheral' будет вызван в ответ на' connect', а не 'scanForPeripheralsWithServices'. Получаете ли вы вызов 'didDiscoverPeripheral'? Обратите внимание, что опция дубликатов игнорируется в фоновом режиме, и вы получите только одно событие обнаружения для каждого периферийного устройства. – Paulw11

+1

Да, проблема в том, что 'didDiscoverPeripheral' не называется фактически, я отредактировал мой вопрос. Если приложение на переднем плане уже начнет сканирование периферийных устройств, когда приложение в фоновом режиме вызывает вызов «scanForPeripheralsWithServices», вызываемый для того же периферийного устройства? IOS игнорирует дубликаты, когда обнаруживает периферию на переднем плане? – ding

+1

Правильно, если уведомление об обнаружении для данного периферийного устройства уже доставлено на переднем плане или в фоновом режиме, вы не получите никаких дополнительных уведомлений об обнаружении для этого периферийного устройства в фоновом режиме. – Paulw11

ответ

1

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

Для получения дополнительной информации о поведении IOS BLE в фоновом режиме. Вы можете проверить этот ответ What exactly can CoreBluetooth applications do whilst in the background?

1

Сканирование на nil (scanForPeripheralsWithServices:nil) услуг не будет работать в фоновом режиме. Вы должны искать определенную услугу в фоновом режиме.

Вы должны установить UUID в методе scanForPeripheralsWithServices:, который рекламирует устройство периферийных устройств/устройств BLE.

0

Из официальной справки Apple,

Вы можете создать массив объектов CBUUID-представляющий Service UUID,-в параметре serviceUUIDs. Когда вы это сделаете, центральный менеджер возвращает только периферийные устройства, которые рекламируют указанные вами услуги. (рекомендуется). Если параметр serviceUUID равен нулю, все обнаруженные периферийные устройства возвращаются независимо от их поддерживаемых услуг (не рекомендуется ). Если центральный менеджер уже сканирует с помощью различных параметров, предоставленные параметры заменяют их. Когда объект центрального менеджера обнаруживает периферийное устройство, он вызывает centralManager: didDiscoverPeripheral: advertData: RSSI: метод его объект-делегат.

Приложения, которые указали bluetooth-центральный фоновый режим, разрешено сканировать в фоновом режиме. Тем не менее, они должны явно сканировать одну или несколько служб, указав их в параметре serviceUUIDs . Параметр сканирования CBCentralManagerOptionShowPowerAlertKey игнорируется во время сканирования в фоновом режиме.

Здесь

Приложения, указавшие фоновый режим Bluetooth-центральный разрешено сканировать в фоновом режиме. Тем не менее, они должны явно сканировать одну или несколько служб, указав их в параметре serviceUUID.

Так scanForPeripheralsWithServices:nil с нулевым он не будет работать в фоновом режиме, вам необходимо указать список UUIDs

0

я работал над маяками типа Estimote Nearable. После обновления iOS10 SDK, я сталкиваюсь исключение из CBCentralManager заявив:

<CBCentralManager: 0x17009e050> has provided a restore identifier but the delegate doesn't implement the centralManager:willRestoreState: method

Чтобы это исправить, Turn "Фоновый режим" ВКЛ,

В Xcode -> возможности -> Режим

фона enter image description here

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