【发布时间】:2017-11-15 12:08:21
【问题描述】:
我有一个定制的 BLE 外围设备,当有人进入建筑物时,它会将 LED 变为绿色,并在他们离开建筑物时将 LED 关闭。当人进入和离开建筑物时,iOS 应用程序使用地理围栏区域向应用程序发送通知。 locationManger didDetermineState 在区域更改时被调用,并且 BadgeHandler 类被调用以更新徽章。在 iOS 终止应用程序之前,一切都在前台和后台运行良好。
当应用程序在后台被 iOS 终止,并且稍后有地理围栏区域通知进来时,startScanningForPeripherals 不起作用。
徽章(外设)使用 2 节手表电池,为了最大限度地减少电池消耗,我们连接到外设(徽章)只是为了更新 LED,然后然后断开与外设的连接。
这在前台和后台都可以正常工作,直到 iOS 在后台杀死应用程序。当应用程序在地理围栏区域更改startScanningForPeripherals 在后台启动备份时,调用后不会导致任何委托通知。
我确实有一个委托方法:willRestoreState
这不接电话。它没有被调用的原因是当应用程序在后台被 iOS 终止时,它没有扫描设备或连接到设备。以下是事件的顺序以及我如何调用这些方法:
- 应用程序正在运行并置于后台
- 应用程序收到地理围栏通知并连接到徽章(外围设备)更新 LED 并断开与徽章(外围设备)的连接。按要求工作。
- 一段时间后,iOS 会终止应用程序
- 地理围栏区域通知进来
- 应用程序自动重启,(注意:应用程序仍在后台)
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])
- 委托方法:
centralManagerDidUpdateState被调用:
else if central.state == .poweredOn{
startScanningForPeripherals(central)
}
- 然后使用它正在寻找的 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