我们的应用程序目前使用CoreBluetooth与智能手表进行通信。问题是,如果应用程序是(假设)jetsammed (可能是在隔夜背景下),那么似乎唤醒应用程序并启动重新连接的唯一蓝牙事件就是关闭/启动iOS上的蓝牙功能。
我确实实现了以下方法以确保重新连接发生,并且当应用程序检索连接的外围设备时发生连接(代码已经被删除为必要的):
NSArray * connectedPeripherals = [_centralManager retrieveConnectedPeripheralsWithServices:@[kMyServiceUUID]];
for ( CBPeripheral * peripheral in connectedPeripherals )
{
if ( peripheral.state == CBPeripheralStateConnected )
continue;
else
[_centralManager connectPeripheral:peripheral options:@{CBConnectPeripheralOptionNotifyOnDisconnectionKey:[NSNumber numberWithBool:TRUE]}];
}
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
[_centralManager connectPeripheral:peripheral options:@{CBConnectPeripheralOptionNotifyOnDisconnectionKey:[NSNumber numberWithBool:TRUE]}];
}
如果我的应用已经在后台,我怎么能确保我的应用能够重新连接到手表,比如过夜?
同样,如果应用程序实际上已被jetsammed,我如何确保应用程序唤醒或能够从手表接收数据?
答案 0 :(得分:1)
CBConnectPeripheralOptionNotifyOnDisconnectionKey
告诉Core Bluetooth您在事件模式下使用外围设备。也就是说,每个事件都由iOS处理,当事情发生时会向用户显示通知,但只有当用户刷过/轻击通知时,您的应用才会被唤醒。这个枚举的文档中描述了这一点:
此键的值是NSNumber对象。对于未指定蓝牙中央后台模式的应用,此密钥非常有用,并且无法显示自己的警报。如果多个应用程序已请求给定外围设备的通知,则最近在前台的应用程序会收到警报。如果未指定密钥,则默认值为NO。
相反,您需要连接模式。在您应用的plist中指定bluetooth-central
后台处理模式,并相应地实施您的业务逻辑。此外,您还应考虑实施恢复功能。所有这些都在SO和n Core Bluetooth Programming Guide的问题中有很好的记录。