Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:DidDiscoveryPeripheral未在后台模式下调用_Ios_Bluetooth Lowenergy - Fatal编程技术网

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

iOS:DidDiscoveryPeripheral未在后台模式下调用,ios,bluetooth-lowenergy,Ios,Bluetooth Lowenergy,我正在从事BLE项目,当应用程序在前台时,一切正常。它可以发现并连接到外围设备,所有回调方法都能完美工作 但问题是,当应用程序处于后台模式时(我按home按钮)。仅调用CentralManagerDipDateStatedelegate方法 - (void)centralManagerDidUpdateState:(CBCentralManager *)central{ switch (central.state) { case CBCentralManagerState

我正在从事BLE项目,当应用程序在前台时,一切正常。它可以发现并连接到外围设备,所有回调方法都能完美工作

但问题是,当应用程序处于后台模式时(我按home按钮)。仅调用
CentralManagerDipDateState
delegate方法

- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
          [self.cbCentralManager scanForPeripheralsWithServices:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
            break;
        default:
            break;
    }
}
我使用
scanForPeripheralsWithServices:nil
选项,但当应用程序在后台运行时,
didiscoverperipheral
回拨从未调用。我已经用“bluetooth central”选项编辑了我的plist文件,以支持在后台扮演ble central角色

你知道为什么应用程序在后台运行时,
didDiscoveryPeripheral
方法不调用吗?

扫描
nil
scanforPeripherswithServices:nil
)服务在后台不起作用。您必须在后台搜索特定的服务


您必须在
scanForPeripheralsWithServices:
方法中设置外设/BLE设备广告的
UUID

如果您的应用程序在前台找到外设,Paulw11说的是对的。当它进入后台时,不会为相同的外围设备调用
didiscoverperipheral

有关后台模式下iOS可编程行为的更多信息。你可以检查这个答案

来自苹果官方参考

您可以提供表示服务的CBUUID对象数组 serviceUUIDs参数中的UUID。当你这样做的时候,中央经理 仅返回播发指定服务的外围设备 (推荐)。如果serviceUUIDs参数为nil,则会发现所有 将返回外围设备,而不管其支持的服务(不是 推荐)。如果中央管理器已在使用 不同的参数,提供的参数将替换它们。当 中央管理器对象发现外围设备时,会调用 centralManager:DidDiscoveryPeripheral:advertisementData:RSSI:搜索方法 它的委托对象

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

这里

已指定蓝牙中央后台模式的应用程序可以在后台进行扫描。也就是说,他们必须通过在serviceUUIDs参数中指定一个或多个服务来显式扫描这些服务。


因此,
scanForPeripheralsWithServices:nil
如果使用nil,它将无法在后台工作,您需要指定UUID列表

我正在使用估计的可接近类型信标。iOS10 SDK更新后,我遇到了
CBCentralManager
中的异常,声明:

提供了还原标识符,但委托未实现centralManager:willRestoreState:method

要解决此问题,Xcode->Capabilities->Background Mode中打开“后台模式”


didConnwctPeripheral
将被调用以响应
连接
,而不是
扫描外设服务
。有人打电话给你吗?请注意,在后台忽略了duplicates选项,每个外围设备只会得到一个发现事件。是的,问题是没有调用
DidDiscoveryPeripheral
,实际上,我已经编辑了我的问题。如果前台的应用程序已经开始扫描外围设备,那么当后台的应用程序开始扫描外围设备时,
scanForPeripheralsWithServices
callback是否会为同一外围设备调用?iOS在前台发现外设时是否会忽略重复的内容?正确,如果给定外设的发现通知已在前台或后台发送,您将不会在后台收到该外设的任何进一步发现通知。如果我仍希望在后台收到同一外设的
didDiscoveryPeripal
回调,我该怎么办?我是否初始化一个新的中心类以重新启动扫描?当应用程序在后台运行时,我实际上想重新连接相同的外围设备。如果未调用
发现外围设备
,我如何重新连接。在《苹果蓝牙指南》中,我可以使用
检索外设识别器:
来恢复外设。但是我从
检索外围设备标识符:
方法中获取空外围设备。如果要连接,只需发出一个connect。一旦外围设备回到范围内,连接将完成,您将接到对
didconnectperipal
的呼叫。基本上,在
didDisconnectPeripheral
中,只需使用其外围对象调用connect即可