Сканирование периферийных устройств, когда приложение работает в фоновом режиме (например, при заблокированном экране) - PullRequest
0 голосов
/ 07 мая 2020

У меня есть приложение, работающее в фоновом режиме. Я использую CBPeripheralManager to Advertising и CBCentralManager для сканирования. Я использую два устройства ıos (IOS 11.3 и IOS 13.4.1). Первый - это рекламный передний план и задний план. Второй - сканирование переднего и заднего планов. Я могу сканировать;

Приложение в фоновом режиме, телефон разблокирован - Работает идеально

Приложение в фоновом режиме, телефон заблокирован, экран горит - Отлично работает

Приложение в фоновом режиме , телефон заблокирован, экран выключен - не работает!

/ * Проверяю Рекламное приложение, которое запускает фоновое отображение на Android устройстве * /

В чем проблема. Пожалуйста, дайте мне знать. Как решить эту проблему? Я хочу сканировать оба в фоновом режиме. Мой код приведен ниже;

let scanOptions = [
        CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber(value: true)
    ]

let services = [CBUUID(string: "e2c56db5-dffb-48d2-b060-d0f5a71096e0")]

let advertisingData = [
        CBAdvertisementDataLocalNameKey: "xxx",
        CBAdvertisementDataServiceUUIDsKey:[CBUUID(string: "e2c56db5-dffb-48d2-b060-d0f5a71096e0")]
        ] as [String : Any]

func initLocal() {

        peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil)
        cbCentralManager = CBCentralManager(delegate: self, queue: nil,options: nil)

    }

func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {

        if peripheral.state == .poweredOn {
            peripheralManager.startAdvertising(advertisingData)
        }
       else if peripheral.state == .poweredOff {
            peripheralManager.stopAdvertising()
        }
    }

func centralManagerDidUpdateState(_ central: CBCentralManager) {

        if central.state == .poweredOn{

            central.scanForPeripherals(withServices: services,options:scanOptions)
            print("scanning...")

        }
        else {
            print("Bluetooth is not active")
        }
    }

func centralManager(_ central: CBCentralManager,didDiscover peripheral: CBPeripheral,advertisementData: [String : Any],
                        rssi RSSI: NSNumber)
    {

        print("RSSI   : \(RSSI)")

    }

Это мой info.plist; enter image description here

1 Ответ

1 голос
/ 07 мая 2020

Похоже, вы ожидаете дубликатов, так как вы установили CBCentralManagerScanOptionAllowDuplicatesKey. Этот ключ игнорируется в фоновом режиме. Если вы ожидаете увидеть одно и то же устройство более одного раза в рекламе, это невозможно. Однако обнаружение новых устройств, которых вы раньше не видели, должно сработать. У вас с этим проблемы? (Вы должны подробно объяснить, как именно вы это тестируете, какое именно поведение вы видите и что ожидаете увидеть. Bluetooth - это очень тонкая вещь. Детали имеют большое значение, а «не работает» слишком расплывчато. )

...