12

Я хочу, чтобы мое устройство iOS рекламировало сервис Bluetooth LE все время, даже когда приложение не работает, так что я могу проверить его на другое устройство iOS и найти его. Я следовал инструкциям Apple по составлению иллюстраций:iOS 7 Core Bluetooth Периферийное управление в фоновом режиме

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonPeripheralRoleTasks/PerformingCommonPeripheralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH4-SW1.

Я могу получить его для рекламы на переднем плане ok, а иногда и в фоновом режиме, но он не остается рекламой все время. Если у вас есть настройка для запуска в фоновом режиме, не следует ли начинать рекламу даже после перезапуска устройства, как и службы определения фона автоматически начинают работать после перезапуска? Являются ли их ограничения на фоне, которые не перечислены (или трудно найти) в документах Apple? У кого-нибудь есть пример базовой периферийной рекламы Bluetooth в фоновом режиме?

Спасибо ...

+0

Необходимо выполнить восстановление для периферийного менеджера. Посмотрите видео WWDC, чтобы увидеть, как это нужно сделать. Однако имейте в виду, что есть ошибка, которая приводит к сбою приложения, когда менеджер восстанавливается, если у него есть какие-либо периферийные устройства. – allprog

+0

Я смотрел видео. Это было для центрального, а не для периферийного. У кого-нибудь есть рабочий пример фонового периферийного устройства? Кроме того, что касается этой ошибки, это влияет на периферию? – jpcoder

+0

Это та же схема для обоих менеджеров. Ошибка влияет на периферию. – allprog

ответ

8

Фоновой реклама возможно, если вы добавите режим bluetooth-peripheral в фоновом режиме списка свойств приложения. Как только вы это сделаете, ваше приложение будет продолжать получать обратные вызовы, даже если они указаны.

Реклама - хитрый зверь, поскольку Apple реализовала несколько оптимизаций, чтобы снизить энергопотребление, и это снижает качество рекламы, как только приложение будет заложено. А именно: ставка резко снижается, рекламируемые услуги не включены и местное имя также не включено. После того, как приложение вернется на передний план, эти ограничения недействительны.

В общем случае для такого типа фоновой операции приложение должно работать. С iOS 7 был реализован процесс восстановления, который позволяет ОС действовать от имени приложения, когда он прекращен и восстанавливает приложение, когда какая-либо передача или другая операция неизбежны. Для этого вам необходимо добавить ключ восстановления к параметрам инициализации CBPeripheralManager/CBCentralManager. Запуск приложения один раз по-прежнему требуется, но после этого iOS будет продолжать действовать как фасад BLE по отношению к центрам/периферийным устройствам.

ОБНОВЛЕНИЕ: Я запустил петлю в списке bluetooth-dev от Apple также с этим вопросом и обнаружил, что основными менеджерами Bluetooth были declared to be not able to restore after reboot. Это не описано ни в одной документации, но, вероятно, упоминалось в видео WWDC. Мы должны подать ошибку и воспроизвести ее, чтобы повысить осведомленность Apple.

+0

Я сделал все, что вы здесь говорите, но я не видел его после перезагрузки. Без работы после перезагрузки я не вижу, чтобы восстановление фона/состояния было полезным. Вы знаете, где вы видели эти сообщения о рекламе после перезагрузки? – jpcoder

+0

Я искал список архивов списков Apple bluetooth и раздел основного Bluetooth ADF, но не смог найти это сообщение. Я не помню, где я его видел. Я только что проверил тест и не смог восстановить восстановление после перезагрузки, и реклама тоже не началась. – allprog

+0

Bummer. :) Спасибо за попытку. Может быть, это просто не работает. Возможно, они сделали это для энергосбережения, но это делает его намного менее полезным, если он не может перезагрузиться после перезагрузки. Знаете ли вы, что сканирование CBCentralManager работает одинаково? Если вы не можете продолжить сканирование в фоновом режиме после перезагрузки, которая также будет весьма ограничена. – jpcoder

0

Реализация может быть основан здесь: https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonPeripheralRoleTasks/PerformingCommonPeripheralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH4-SW5

его очень просто на самом деле.

<CBPeripheralManagerDelegate> 

@property (strong, nonatomic) CBPeripheralManager *peripheralManager; 

...

- (NSDictionary*) advertiseNotBeacon { 
    CBUUID *myCustomServiceUUID = [CBUUID UUIDWithString:@"MY_UUID"]; 

    CBMutableCharacteristic *myCharacteristic = [[CBMutableCharacteristic alloc] initWithType:myCustomServiceUUID 
                        properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify 
                         value:nil permissions:CBAttributePermissionsReadable]; 

    CBMutableService *myService = [[CBMutableService alloc] initWithType:myCustomServiceUUID primary:YES]; 
    myService.characteristics = @[myCharacteristic]; 

    self.peripheralManager.delegate = self; 
    [self.peripheralManager addService:myService]; 

    return @{CBAdvertisementDataServiceUUIDsKey : @[myService.UUID], 
      CBAdvertisementDataLocalNameKey: @"MY_NAME" 
      }; 
} 

...

[self.peripheralManager startAdvertising:[self advertiseNotBeacon]]; 

Делая это, вы начнете рекламировать периферийную услугу.

Теперь, если вы хотите сохранить службу работает в фоновом режиме, прочитайте документацию по этой ссылке: https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html#//apple_ref/doc/uid/TP40013257-CH7-SW1

Быстрые шаги: Open info.plist Добавить новый ключ пар/значение

Required background modes 
     App shares data using CoreBluetooth 

Apple говорит ctrl + кликнуть на любую клавишу/значение и добавить добавить следующее, но точно так же, как объяснялось ранее.

UIBackgroundModes 
     bluetooth-peripheral 

Dont забыл об ограничениях запуска службы в фоновом режиме:

  • Ключевой параметр сканирования CBCentralManagerScanOptionAllowDuplicatesKey игнорируется, и многочисленные открытия рекламной периферии являются соединялись в одном случае обнаружения. Если все приложения, которые сканируют периферийные устройства, находятся в фоновом режиме, увеличивается время, в течение которого ваше центральное устройство сканирует рекламные пакеты. В результате может потребоваться больше времени, чтобы обнаружить рекламную периферию.
  • Эти изменения помогают свести к минимуму использование радио и увеличить срок службы батареи на устройстве iOS.
Смежные вопросы