iOS:在后台模式下未调用didDiscoverPeripheral

时间:2015-08-21 12:54:08

标签: ios bluetooth-lowenergy

我正在研究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方法在后台应用时不会调用?

4 个答案:

答案 0 :(得分:2)

扫描nilscanForPeripheralsWithServices: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;背景模式

enter image description here

答案 3 :(得分:0)

来自官方Apple参考

  

您可以提供表示服务的CBUUID对象数组   UUIDs-在serviceUUIDs参数中。当你这样做时,中央经理   仅返回通告您指定的服务的外围设备   (推荐的)。如果serviceUUIDs参数为nil,则全部被发现   无论支持的服务是什么,都会返回外围设备(不是   推荐的)。如果中央管理员已经在扫描   不同的参数,提供的参数替换它们。当。。。的时候   中央管理器对象发现一个外围设备,它称之为   centralManager:didDiscoverPeripheral:advertisementData:RSSI:方法   它的委托对象。

     

指定了蓝牙中央后台模式的应用是   允许在后台扫描。那说,他们必须   通过在中指定它们来显式扫描一个或多个服务   serviceUUIDs参数。 CBCentralManagerOptionShowPowerAlertKey   在后台扫描时会忽略扫描选项。

这里

允许指定蓝牙中央背景模式的应用在后台扫描。也就是说,他们必须通过在serviceUUIDs参数中指定一个或多个服务来显式扫描。

所以scanForPeripheralsWithServices:nil为nil它在后台不起作用,你需要指定UUIDS列表