核心蓝牙 - 应用程序终止并在后台

时间:2017-06-13 15:46:04

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

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

当iOS在后台终止应用程序,以后稍后会出现地理围栏区域通知时,startScanningForPeripherals无法正常工作。

徽章(外围设备)使用2块手表电池,为了减少电池消耗,我们只连接外围设备(徽章)以更新LED,然后再断开外设

这在前台和后台运行得很好,直到iOS在后台杀死应用程序。当应用在地理围栏区域的后台开始备份时,更改startScanningForPeripherals在调用后不会产生任何委托通知。

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

  1. 应用程序正在运行并置于后台
  2. 应用程序收到地理围栏通知并连接到徽章(外围设备)更新LED并断开徽章(外围设备)。按要求工作。
  3. 经过一段时间后,iOS终止应用程序
  4. 地理围栏区域通知
  5. 应用程序会自动重启(注意:应用程序仍在后台) didFinishLaunchingWithOptions被调用,我启动了centralManager:
  6. 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被调用:
    2. else if central.state == .poweredOn{ startScanningForPeripherals(central) }

      1. 然后使用它正在寻找的serviceID调用开始扫描,以便在后台进行扫描。
      2. 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)中以确保   在所有条件下成功发现外围设备。

             

        所以,请检查这些广告要求,如果这些是好的,   然后我们可以看到应用程序中是否有错误。

2 个答案:

答案 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>

此致