【问题标题】:Core Bluetooth - startScanningForPeripherals not working in background after app terminated and started in background核心蓝牙 - 应用程序终止并在后台启动后,startScanningForPeripherals 无法在后台工作
【发布时间】:2017-11-15 12:08:21
【问题描述】:

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

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

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

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

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

  1. 应用程序正在运行并置于后台
  2. 应用程序收到地理围栏通知并连接到徽章(外围设备)更新 LED 并断开与徽章(外围设备)的连接。按要求工作。
  3. 一段时间后,iOS 会终止应用程序
  4. 地理围栏区域通知进来
  5. 应用程序自动重启,(注意:应用程序仍在后台) didFinishLaunchingWithOptions 被调用,我启动了 centralManager:

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. 然后使用它正在寻找的 serviceID 调用开始扫描,以便可以在后台进行扫描。

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 提交了我的第一个技术解决方案问题。这是他们的回应。我会保持更新。

虽然应用程序可能会出错并且无法运行的方式有很多 在后台扫描或连接,首先检查很重要, 如果灯亮了。

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

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

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

另外,您要扫描的服务 UUID 是很重要的 包含在第一个广告包 (ADV_IND) 中,以确保 在所有条件下都能成功发现外围设备。

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

【问题讨论】:

  • 扫描不起作用,因为您已经发现了外围设备。您应该能够保存外围设备的标识符并使​​用retrievePeripherals(withIdentifiers:) 来获得可以连接的CBPeripheral。您也不能在后台使用允许重复键。

标签: ios objective-c iphone swift core-bluetooth


【解决方案1】:

您是否在 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>

问候

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      相关资源
      最近更新 更多