我有一个定制的BLE外围设备,当一个人进入建筑物时将LED变为绿色,并在他们离开建筑物时关闭LED。 iOS应用程序使用Geofence区域在人员进入和离开建筑物时向应用程序发送通知。在区域更改时调用locationManger didDetermineState
,并调用BadgeHandler类来更新徽章。一切都在前台和后台运行良好,直到iOS终止应用程序。
当iOS在后台终止应用程序,以后稍后会出现地理围栏区域通知时,startScanningForPeripherals无法正常工作。
徽章(外围设备)使用2块手表电池,为了减少电池消耗,我们只连接外围设备(徽章)以更新LED,然后再断开外设。
这在前台和后台运行得很好,直到iOS在后台杀死应用程序。当应用在地理围栏区域的后台开始备份时,更改startScanningForPeripherals
在调用后不会产生任何委托通知。
我有一个委托方法:willRestoreState
这不会打电话。它没有被调用的原因是当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)
}
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 ms,211.25 ms,318.75 ms,417.5 ms,546.25 ms,760 ms,852.5 ms,1022.5 ms,1285 ms
此外,您正在扫描的服务UUID非常重要 包含在第一个广告包(ADV_IND)中以确保 在所有条件下成功发现外围设备。
所以,请检查这些广告要求,如果这些是好的, 然后我们可以看到应用程序中是否有错误。
答案 0 :(得分:1)
正如Apple技术支持所提到的,我们确定我们正在扫描的服务UUID未包含在外围设备的第一个广告包中。
一旦我们使用此修复程序更新了外围设备的固件,iOS应用程序终止后在后台进行扫描效果很好。
答案 1 :(得分:-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>
此致