Хотите запустить рекламную периферию в фоновом режиме iOS Swift - PullRequest
0 голосов
/ 21 апреля 2020

Я просто создаю свою рекламную периферию с помощью Service & Characteristi c UUID

Вот мой Service & Characteristi c UUID

let kTRANSFER_SERVICE_UUID                = “29ada058-c7d6-4ed5-bc7f-1c7b0458b3b8”                                   
let kTRANSFER_CHARACTERISTIC_UUID = “91e032f2-c915-47c6-a8d9-6b3bc6c8e73d”

Теперь я создаю экземпляр CBPeripheralManager

private var peripheralManager: CBPeripheralManager!
private let beaconOperationsQueue = DispatchQueue(label: "beacon_operations_queue")
private let option = [CBCentralManagerScanOptionAllowDuplicatesKey:true]

// Assign peripheralManager with Queue & Option
peripheralManager = CBPeripheralManager(delegate: self, queue: beaconOperationsQueue, options: option)

Затем я вызываю этот метод StartAdvertising, но он будет работать только в режиме переднего плана. Теперь я хочу разрешить в фоновом режиме, чтобы добавить ключ UIBackgroundModes в Info.plist

 public func startAdvertising(serviceID: String, name: String) {

        let valueData = name.data(using: .utf8)

        self.serviceID = CBUUID(string: serviceID)
        self.peripheralName = name

        let CustomChar = CBMutableCharacteristic(type: CBUUID(string: kTRANSFER_CHARACTERISTIC_UUID), properties: [.read], value: valueData, permissions: [.readable])

        let myService = CBMutableService(type: self.serviceID, primary: true)
        myService.characteristics = [CustomChar]

        peripheralManager.add(myService)

        if self.peripheralManager.isAdvertising{

            self.peripheralManager.stopAdvertising()
        }
        peripheralManager.startAdvertising([
            CBAdvertisementDataServiceUUIDsKey: [serviceID],
            CBAdvertisementDataOverflowServiceUUIDsKey:[serviceID],
            CBAdvertisementDataLocalNameKey: peripheralName!])
    }

Таким образом, при переходе в фоновый режим это произойдет

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

Все UUID службы, содержащиеся в значении рекламного ключа CBAdtactDataServiceUUIDsKey размещаются в специальной области «переполнения»; они могут быть обнаружены только устройством iOS, которое явно сканирует их.

Также мне был задан режим «OverFlow», но он по-прежнему не работает в фоновом режиме,

Может ли кто-нибудь помочь с то же самое

1 Ответ

0 голосов
/ 02 мая 2020

Apple накладывает ограничения на работу рекламы и сканирования CoreBluetooth, когда приложения работают в фоновом режиме. К сожалению, это поведение сложное. Пожалуйста, потерпите меня.

Для целей данного обсуждения под фоном подразумевается любой случай, когда приложение не отображается на экране. (Телефон заблокирован, экран выключен, показан трамплин, еще одно приложение показано во всех случаях, когда приложение находится в фоновом режиме.)

CBPeripheralManager GATT Сервисная реклама

  • На заднем плане - сервисная реклама изменяет собственный формат Apple, который использует рекламные объявления производителей, которые выглядят следующим образом: 0b ff 4c 00 10 06 57 1e fc 8a e1 7c. Не имеет значения, запускается ли реклама на переднем плане, а приложение перемещается в фоновый режим или реклама запускается в фоновом режиме. Когда реклама приложений BLE находится в фоновом режиме, это объявление использует этот собственный формат.
  • Вышеуказанное объявление не содержит UUID службы. Независимо от того, что указано в CBAdvertisementDataServiceUUIDsKey, оно не будет отображаться в объявлении.
  • Вышеуказанное объявление не содержит локального названия. Независимо от того, что находится в CBAdvertisementDataLocalNameKey, оно не будет отображаться в объявлении.
  • Это объявление предназначено для передачи указанных UUID службы с CBAdvertisementDataServiceUUIDsKey только на другие устройства iOS с предварительно установленным приложением сканирование с CBCentralManager. Это работает с использованием фирменной техники Apple. Фактические сервисные UUIDS предоставляются iOS только в «области переполнения» по запросу операционной системы, когда происходит предварительное сканирование приложения iOS. Если нет предварительного сканирования iOS приложения, оно не будет работать , поскольку фактические UUID службы никогда не будут запрашиваться из «области переполнения».

CBCentralManager GATT Service Scanning

  • В фоновом режиме сканирование без указания UUID службы не дает результатов. Если у вас есть такой код: centralManager?.scanForPeripherals(withServices: nil, options: nil), ничего не будет совпадать. Вы должны явно указать UUIDs службы.

  • Попытка запросить обратные вызовы для нескольких рекламных объявлений с одного устройства ничего не дает, поскольку опция CBCentralManagerScanOptionAllowDuplicatesKey игнорируется в фоновом режиме. Вы получите только один обратный вызов при первом появлении устройства.

  • Сканирование для определенного UUID c службы будет успешно выполнено максимум с одним обратным вызовом в соответствии с вышеуказанным ограничением, только при условии рекламы устройство не является фоновым iOS приложением.

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

Тогда конечным результатом этого будет то, что реклама и обнаружение GATT от iOS до iOS работают только тогда, когда одно из двух приложений bluetooth находится в передний план . Если оба приложения находятся в фоновом режиме, новые открытия не будут работать. Однако существующие подключения будут продолжать работать и повторно подключаться, когда оба приложения находятся в фоновом режиме, и если устройство исчезнет и появится снова, будет предоставлен новый обратный вызов для обнаружения. Ключевым моментом является то, что обнаружение должно было завершиться успешно один раз, когда одно из двух приложений находилось на переднем плане.

Чтобы вышеприведенное сработало, вам не нужно устанавливать CBAdvertisementDataOverflowServiceUUIDsKey при начале рекламы. Apple автоматически поместит любые значения для ключа CBAdvertisementDataServiceUUIDsKey в область переполнения, если рекламное приложение находится в фоновом режиме. CBAdvertisementDataOverflowServiceUUIDsKey только для чтения - вы можете получить доступ к этой информации после получения результата сканирования. Вы не используете его для рекламы.

Интересное примечание: если в этой ситуации у вас есть более двух устройств iOS, центральное и периферийное устройства могут обнаруживать друг друга, когда оба находятся в фоновом режиме, если есть третий iOS сканирование приложений в качестве центрального на переднем плане. Это третье устройство iOS может затем запросить «область переполнения», позволяя фоновому устройству iOS прослушивать это и извлекать выгоду из перехвата.

Android или других не iOS устройства могут сканировать проприетарную iOS рекламу, описанную выше, и, хотя они не могут видеть UUID службы или запрашивать их из «области переполнения», они все равно могут подключиться и затем запросить UUID службы внутри соединения. Это неэффективно, но может работать.

...