我正在研究BLE项目,当应用程序位于前台时,一切正常。它可以发现并连接到外围设备,所有回叫方法都能正常工作。
但问题是,当应用程序处于后台模式时(我按下主页按钮)。只调用centralManagerDidUpdateState
委托方法。
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
switch (central.state) {
case CBCentralManagerStatePoweredOn:
[self.cbCentralManager scanForPeripheralsWithServices:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
break;
default:
break;
}
}
我使用scanForPeripheralsWithServices:nil
选项,但当应用程序在后台时,didDiscoverPeripheral
回调从未调用过。我用“bluetooth-central”选项编辑我的plist文件,以支持后台的中心角色。
任何想法为什么didDiscoverPeripheral
方法在后台应用时不会调用?
答案 0 :(得分:2)
扫描nil
(scanForPeripheralsWithServices:nil
)服务无法在后台运行。您必须在后台搜索某些特定服务。
您必须在UUID
方法中设置scanForPeripheralsWithServices:
外围设备/ BLE设备正在宣传的广告。
答案 1 :(得分:1)
Paulw11说是对的,如果您的应用程序在前台找到外围设备。当它进入后台时,它不会为didDiscoverPeripheral
调用相同的外围设备。
有关后台模式中iOS BLE行为的更多信息。你可以查看这个答案 What exactly can CoreBluetooth applications do whilst in the background?
答案 2 :(得分:1)
我正在开发Estimote Nearable类型的信标。 iOS10 SDK更新后,我遇到了来自CBCentralManager
的异常:
<CBCentralManager: 0x17009e050> has provided a restore identifier but the delegate doesn't implement the centralManager:willRestoreState: method
要解决此问题,请 Xcode - &gt;中的开启“背景模式”。能力 - &gt;背景模式
答案 3 :(得分:0)
来自官方Apple参考
您可以提供表示服务的CBUUID对象数组 UUIDs-在serviceUUIDs参数中。当你这样做时,中央经理 仅返回通告您指定的服务的外围设备 (推荐的)。如果serviceUUIDs参数为nil,则全部被发现 无论支持的服务是什么,都会返回外围设备(不是 推荐的)。如果中央管理员已经在扫描 不同的参数,提供的参数替换它们。当。。。的时候 中央管理器对象发现一个外围设备,它称之为 centralManager:didDiscoverPeripheral:advertisementData:RSSI:方法 它的委托对象。
指定了蓝牙中央后台模式的应用是 允许在后台扫描。那说,他们必须 通过在中指定它们来显式扫描一个或多个服务 serviceUUIDs参数。 CBCentralManagerOptionShowPowerAlertKey 在后台扫描时会忽略扫描选项。
这里
允许指定蓝牙中央背景模式的应用在后台扫描。也就是说,他们必须通过在serviceUUIDs参数中指定一个或多个服务来显式扫描。
所以scanForPeripheralsWithServices:nil
为nil它在后台不起作用,你需要指定UUIDS列表