核心蓝牙在后台进行广告和扫描

时间:2013-12-06 15:10:18

标签: ios iphone cocoa-touch bluetooth core-bluetooth

我一直试图设置一个应用程序,让设备扫描外围设备并作为外围设备做广告。目标是当两个设备通过蓝牙发现彼此靠近时在后台唤醒。从Apple文档中,您似乎应该能够在后台运行BLE(启用蓝牙 - 中央和蓝牙 - 外设背景模式),并且当一台设备位于前台时,我的应用程序可以运行。 首先,我这样宣传数据:

NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"my-peripheral",
                              CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:identifier]]};

// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData]; 

然后我将设备设置为扫描数据:

NSArray *services = @[[CBUUID UUIDWithString:identifier]];

[centralManager scanForPeripheralsWithServices:services options:nil];

然而,当两者都进入后台(设备必须被锁定)时,蓝牙无法发现并

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

永远不会在任何一个设备上调用。我怎样才能解决这个问题? 感谢

3 个答案:

答案 0 :(得分:44)

我担心你要做的事情是行不通的。 我试图达到同样的目的。

问题是前景和背景扫描的差异。 当您在前台扫描设备时,您可以扫描任何内容。在后台,您必须指定要扫描的实际服务UUID。好的,这实际上不是问题,因为你知道你正在寻找的UUID。

外围设备: 作为外围设备的广播再次在前景和背景中有所不同。 在前台,它像任何普通的BT外围设备一样工作在后台,它的工作空间非常有限,因此您的外围设备UUID被隐藏起来而不是广播。只有当中央设备(前台的iPhone)从中请求信息时,它才会唤醒您的应用并显示其UUID。

所以2互相取消了。由于您的后台扫描只能扫描具有特定UUID的设备,并且您的后台外围设备无法通告其UUID,因此它们无法相互看到。

您的设备中的一个(外围设备或中央设备)必须位于前台才能工作。

这已在Apple蓝牙邮件列表中多次讨论过。

答案 1 :(得分:8)

你应该详细说明你是如何测试它的,因为理论上它看起来应该可行。您可能面临两个主要问题:

1。)当iOS设备在后台时,扫描会受到限制。

  • 虽然在前台扫描可能会立即发现旁边的设备广告,但在后台发现可能需要长达60倍的时间。 iOS系统不假设用户希望一个应用程序具有比另一个应用程序更好的蓝牙功能(或者只有一个应用程序想要使用它)。由于它是共享功能,因此他们希望用户在各种应用中获得统一的体验。您应查看有关广告和扫描间隔的technical specifications,以便更好地了解Apple必须执行的操作。

2。)您的设备在进入后台之前可能已经相互发现。

  • 我们必须记住,当我们进入后台时,Apple会禁用CBCentralManagerScanOptionAllowDuplicatesKey扫描标记。由于您甚至没有指定此标志,因此无论如何都默认为NO。因此,如果他们甚至曾经见过一次,那么当他们在后台时你就不会再收到回调。

答案 2 :(得分:5)

我个人需要这样的功能,我开发了一个开源组件:https://github.com/omergul123/Discovery

即使对等应用程序在后台运行,如果您想要交换ID也可能非常有用。