核心蓝牙 - 启动扫描外围设备在应用程序终止并在后台启动后不在后台工作



我有一个定制的BLE外设,当一个人进入建筑物时,它会将LED变为绿色,并在他们离开建筑物时关闭LED。iOS 应用程序使用地理围栏区域在人员进入和离开建筑物时向应用程序发送通知。locationManger didDetermineState在区域更改时调用,BadgeHandler 类被调用以更新徽章。前台和后台一切正常,直到iOS终止应用程序。

当应用程序在后台被 iOS 终止,并且稍后出现地理围栏区域通知时,startScanningForPeripherals 不起作用。

徽章(外围设备)使用2个手表电池,为了最大程度地减少电池消耗,我们连接到外围设备(徽章)只是为了更新LED,然后断开与外围设备的连接

这在前台和后台工作得很好,直到iOS在后台杀死应用程序。当应用在地理围栏区域更改的后台启动备份时startScanningForPeripherals调用后不会导致任何委托通知。

我确实有一个委托方法:willRestoreState这没有接到电话。它没有被调用的原因是,当应用程序在后台被iOS终止时,它没有扫描设备或连接到设备。以下是事件的顺序以及我如何调用这些方法:

  1. 应用正在运行并放置在后台
  2. 应用接收地理围栏通知并连接到锁屏提醒(外围设备)更新 LED 并与锁屏提醒断开连接(外围设备)。根据需要工作。
  3. 一段时间后,iOS 会终止该应用程序
  4. 收到地理围栏区域通知
  5. 应用程序
  6. 会自动重新启动(注意:应用程序仍在后台) 调用didFinishLaunchingWithOptions,我启动中央管理器:

let cmQueue = DispatchQueue( label: "com.serial-queue") centralManager = CBCentralManager(delegate:self, queue: cmQueue, options: [CBCentralManagerOptionRestoreIdentifierKey:"com.TrueAccess.BLEConnect.CentralManager",CBCentralManagerOptionShowPowerAlertKey:true,CBCentralManagerScanOptionAllowDuplicatesKey:true])

  1. 委托方法:centralManagerDidUpdateState被调用:

else if central.state == .poweredOn{ startScanningForPeripherals(central) }

  1. 然后使用它正在查找的服务 ID 调用启动扫描,以便可以在后台进行扫描。

if central.state == .poweredOn { let serviceUUID:[CBUUID] = [CBUUID(string: "ID Number here")] central.scanForPeripherals(withServices: serviceUUID, options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])

在此之后不会收到委托方法,即: didDiscover didConnect didFailToConnect

任何帮助将不胜感激。

更新到问题。我在 8 年的 iOS 编程中向 Apple 提交了我的第一个技术解决方案问题。这是他们的回应。我会保持更新。

尽管应用程序可能以多种方式出错并且无法 要在后台扫描或连接,首先检查很重要, 如果灯亮着。

也就是说,在您的应用程序时外围广告是否正确 开始在后台扫描?

遵循广告间隔和 当应用程序在 背景。什么可能在前台工作,即使超出规范, 当应用程序在后台或 终止状态。

外围设备的广告间隔会影响 发现和连接性能。 具有很高的概率 被苹果产品发现,您应该首先使用 建议播发间隔为 20 毫秒,至少持续 30 秒。 如果 在最初的 30 秒内未被发现,您可以切换到 使用以下较长的间隔之一来增加 发现: 152.5 毫秒、211.25 毫秒、318.75 毫秒、417.5 毫秒、546.25 毫秒、760 毫秒、852.5 毫秒、1022.5 毫秒、1285 毫秒

此外,您正在扫描的服务 UUID 是 包含在第一个广告包 (ADV_IND) 中,以确保 在所有条件下成功发现外设。

因此,请检查这些广告要求,如果这些要求可以, 然后我们可以看看应用程序中是否有问题。

正如 Apple 技术支持所提到的,我们确定我们正在扫描的服务 UUID 不包含在外围设备的第一个广告包中。

一旦我们使用此修复程序更新了外围设备的固件,在应用程序被iOS终止后在后台扫描效果很好。

您是否在 info.plist 中添加了正确的权限?

<key>NSBluetoothPeripheralUsageDescription</key>
<string>BLE required</string>
<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
<string>bluetooth-peripheral</string>
<string>location</string>
</array>

问候

最新更新