我一直试图设置一个应用程序,让设备扫描外围设备并作为外围设备做广告。目标是当两个设备通过蓝牙发现彼此靠近时在后台唤醒。从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
永远不会在任何一个设备上调用。我怎样才能解决这个问题? 感谢
答案 0 :(得分:44)
我担心你要做的事情是行不通的。 我试图达到同样的目的。
问题是前景和背景扫描的差异。 当您在前台扫描设备时,您可以扫描任何内容。在后台,您必须指定要扫描的实际服务UUID。好的,这实际上不是问题,因为你知道你正在寻找的UUID。
外围设备: 作为外围设备的广播再次在前景和背景中有所不同。 在前台,它像任何普通的BT外围设备一样工作在后台,它的工作空间非常有限,因此您的外围设备UUID被隐藏起来而不是广播。只有当中央设备(前台的iPhone)从中请求信息时,它才会唤醒您的应用并显示其UUID。
所以2互相取消了。由于您的后台扫描只能扫描具有特定UUID的设备,并且您的后台外围设备无法通告其UUID,因此它们无法相互看到。
您的设备中的一个(外围设备或中央设备)必须位于前台才能工作。
这已在Apple蓝牙邮件列表中多次讨论过。
答案 1 :(得分:8)
你应该详细说明你是如何测试它的,因为理论上它看起来应该可行。您可能面临两个主要问题:
1。)当iOS设备在后台时,扫描会受到限制。
2。)您的设备在进入后台之前可能已经相互发现。
CBCentralManagerScanOptionAllowDuplicatesKey
扫描标记。由于您甚至没有指定此标志,因此无论如何都默认为NO。因此,如果他们甚至曾经见过一次,那么当他们在后台时你就不会再收到回调。答案 2 :(得分:5)
我个人需要这样的功能,我开发了一个开源组件:https://github.com/omergul123/Discovery
即使对等应用程序在后台运行,如果您想要交换ID也可能非常有用。