Swift 3 CoreBluetooth后台数据接收

时间:2017-07-06 08:41:19

标签: ios swift bluetooth

我正在尝试从Arduino接收一些数据,当我按下按钮时会发出一些数据。

现在我注意到它在一段时间后没有收到。我没有杀死 应用程序。怎么会?我已经添加了

<key>UIBackgroundModes</key>
<array>
    <string>bluetooth-central</string>
    <string>bluetooth-peripheral</string>
    <string>external-accessory</string>
</array>

我的设备已配对。

编辑:

我想和Tile App做同样的事情,它在那里工作得非常好。

编辑2:

我像这样实例化我的经理:

centralManager = CBCentralManager(delegate:self, queue:nil)

1 个答案:

答案 0 :(得分:0)

您需要通过传递恢复密钥标识符的选项参数来初始化CBCentralManager。

let central = CBCentralManager(delegate: self, queue: nil, options: [CBCentralManagerOptionRestoreIdentifierKey: "yourkey"])

“你的钥匙”可以是你想要的任何东西,只是为了理解你的应用程序被唤醒以处理BLE消息是有用的。如果应用程序被系统杀死,当新的BLE消息将导致它在您的应用程序委托中复活时,didFinish启动此密钥将在options参数中传递。

为了使其正常工作,您必须实现委托方法

optional public func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any])

如果应用程序被系统杀死(或者通过崩溃而不是用户的方式),将会调用此方法,以便通知您发生了新的BLE事件。在将恢复状态字典中,您将获得恢复BLE会话所需的所有信息。

Here你会发现所有苹果的建议都是在后台使用BLE。

请记住,如果用户执行任何自动导致连接关闭的操作,例如应用已杀死,蓝牙已禁用,则与外围设备的连接将始终被切断。 iOS会在崩溃的情况下继续唤醒/恢复你的应用程序,在后台使用应用程序然后被系统杀死。

将导致应用程序被唤醒的事件是来自已注册通知特征,新外围设备发现,特征读取的通知。 (基本上是CoreBluetooth委托的任何回调)

请记住,在后台进行扫描操作有局限性。

之前链接的苹果文档:

  

虽然您可以在应用程序处于后台时执行许多与蓝牙相关的任务,但请记住在此时扫描外围设备   您的应用在后台运行的方式与您的应用时不同   在前台。特别是,当您的应用扫描时   设备在后台:

     
      
  • CBCentralManagerScanOptionAllowDuplicatesKey扫描选项键是   忽略,广告外围设备的多个发现   合并为一个发现事件。
  •   
  • 如果所有正在扫描的应用   对于外围设备是在后台,你的间隔   中央设备扫描广告包增加。结果是,   发现广告外围设备可能需要更长时间。
  •   

快乐的编码。