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