ios - Core Bluetooth 在后台广告和扫描

标签 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

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

最佳答案

恐怕您正在尝试做的事情不会奏效。 我试图实现同样的目标。

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

周边: 作为外围设备的广播在前台和后台的工作方式又有所不同。 在前台,它像任何普通的 BT 外围设备一样工作。在后台,它的工作空间非常有限,所以你的外围设备 UUID 被隐藏起来而不是广播。只有当中央设备(前台的 iPhone)请求它的信息时,它才会唤醒您的应用程序并显示它的 UUID。

所以两者相互抵消。由于您的后台扫描只能扫描具有特定 UUID 的设备,而您的后台外围设备无法公布其 UUID,因此它们无法看到对方。

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

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

关于ios - Core Bluetooth 在后台广告和扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20427230/

相关文章:

iphone - AVPlayerStatus 与 AVPlayerItemStatus

ios - 代码 : Text Field to String

iOS:如果应用程序未打开,苹果通用链接?

javascript - 如何以编程方式在 UIWebView 中输入 'selection mode'?

iphone - 如何通过网络链接在 Google map iPhone 应用程序上放置图钉?

iphone - 应使用鼠标在特定区域移动图像

ios - 如何从标签栏打开相机?

iOS SDK - 使用动画影响相邻对象?

iphone - 最好使用全局或自定义命名的 GCD 队列?

objective-c - NSUndoManager 会撤消后台发生的更改吗?