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

Kyl*_*uth 30 iphone cocoa-touch bluetooth ios core-bluetooth

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

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

// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData]; 
Run Code Online (Sandbox Code Playgroud)

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

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

[centralManager scanForPeripheralsWithServices:services options:nil];
Run Code Online (Sandbox Code Playgroud)

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

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*ren 46

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

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

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

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

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

这已经在Apple蓝牙邮件列表上多次讨论过.

  • 谢谢达伦.这是非常不幸的,也有点让人感到不安的是,苹果公司对此并不十分清楚.您知道在两个设备的后台使用BLE有任何变通方法吗?另外,你知道为什么当我的iphone在锁定屏幕上时扫描工作(并且在手机上做其他事情而不是在应用程序中)?我认为这被视为背景行为,因此不起作用? (3认同)

Tom*_*voy 8

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

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

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

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

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

  • @KyleRosenbluth我只是通过打开和关闭BT来测试类似的东西. (2认同)

Öme*_*Gül 5

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

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