我正在尝试从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)
答案 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扫描选项键是 忽略,广告外围设备的多个发现 合并为一个发现事件。
- 如果所有正在扫描的应用 对于外围设备是在后台,你的间隔 中央设备扫描广告包增加。结果是, 发现广告外围设备可能需要更长时间。
快乐的编码。