首页 > 解决方案 > 在 ios 上后台进行 BLE 扫描

问题描述

我有 2 台设备 .. 广告和扫描 UUID。在前台和后台。下面是广告和扫码。

问题很简单。2 台设备在后台做广告和扫描并尝试发现彼此。

在前台,两个设备都能够很好地发现彼此。

但是,当我们将两个设备都放在后台时,它们不会相互发现/重新发现。Apple 文档已经表明 CBperipheralallowduplicates 键在后台被忽略,因此它不会重新发现已发现的设备。

但是,通过stackoverflow上的其他一些帖子,我发现如果您在后台重新启动扫描,扫描会被重置。

为此,我发送了一个外部推送通知(已正式收到)并在后台重新启动扫描。

然而,它只在“某些情况下”产生重新发现。我已经用许多设备对此进行了测试:6s、7、7 plus、8、iphoneX、ipad 等以及其他多部手机。

它对某些人有效,对其他人无效。 ios 版本都是 12.3.1

这里也没有出现任何模式 - 它适用于某些 7 和某些 7 它不,它适用于某些 iphone 6s 和一些它不。

有人可以帮助了解这里的问题吗?是什么导致了这种行为?我们怎样才能使重新发现保持一致?

我们已经尝试过的其他事情: 1. 延迟停止和启动扫描 2. 记录以查看中央管理器的状态是否更改 - 未检测到。

let serviceUUID = CBUUID(string: "8D38A460-2F8A-4D1C-8509-324B0377AE44") let service = CBMutableService(type: serviceUUID, primary: true)
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var centralManager: CBCentralManager!
    var peripheralManager: CBPeripheralManager! }

extension AppDelegate: CBPeripheralManagerDelegate {
    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) 
{
        switch peripheral.state {
        case .poweredOn:
            os_log("advertising")
            peripheralManager.add(service)
            peripheralManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey: [serviceUUID]])
        default:
            break
        }
    }
}

below is scan code:

func scan() {
        centralManager.stopScan()
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0)
        {let scanOptions = [CBCentralManagerScanOptionAllowDuplicatesKey: true] as [String : Any]

            self.centralManager.scanForPeripherals(withServices: [serviceUUID], options: scanOptions)

        }

    }
}


    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        os_log("discover: %{public}s", peripheral.description)
    }
}

我希望它能够在所有设备上始终如一地显示重新发现

标签: iosswiftbluetooth-lowenergy

解决方案


推荐阅读