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蓝牙邮件列表上多次讨论过.
你应该详细说明你是如何测试它的,因为理论上它看起来应该可行.您可能面临两个主要问题:
1.)当iOS设备在后台时,扫描会受到限制.
2.)您的设备在进入后台之前可能已经相互发现.
CBCentralManagerScanOptionAllowDuplicatesKey当我们进入后台时,Apple会禁用扫描标记.由于您甚至没有指定此标志,因此无论如何都默认为NO.因此,如果他们甚至曾经见过一次,那么当他们在后台时,你将不会得到另一个回调.