我正在扫描蓝牙设备。为此我使用CBCentralManager
,就像这样
- (void)startScanning
{
[self.centralManager scanForPeripheralsWithServices:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
}
- (void)centralManager:(CBCentralManager *)central
didDiscoverPeripheral:(CBPeripheral *)peripheral
advertisementData:(NSDictionary *)advertisementData
RSSI:(NSNumber *)RSSI
{
NSLog(@"\n%@, rssi: %@", peripheral.identifier.UUIDString, RSSI);
// do stuff
}
我正在使用Estimote app在其他设备上模拟Beacon。控制台输出如下所示:
2017-07-26 14:43:56.711830 ExampleApplication [445:55698]周边:
6A3E0CB4-74BB-4472-98AA-0C9DEB1D4551,rssi:-28
到目前为止,一切都很好。
现在,我想在应用程序处于后台时扫描蓝牙设备。为此,我将此属性添加到Info.plist
<key>UIBackgroundModes</key>
<string>bluetooth-central</string>
此外,我已经读过,当nil
作为serviceUUIDs
传递时,无法在后台扫描蓝牙设备,因此我将先前发现的外围设备的UUID传递给{{1} }
CBCentralManager
而且存在问题 - 即使应用程序位于前台,也不会再调用CBUUID *uuid = [CBUUID UUIDWithString:@"6A3E0CB4-74BB-4472-98AA-0C9DEB1D4551"];
[self.centralManager scanForPeripheralsWithServices:@[uuid] options:options];
。是什么原因?我使用之前发现的设备的UUID没有任何问题,但事实并非如此。有什么想法吗?
答案 0 :(得分:0)
-(void)centralManagerDidUpdateState:(CBCentralManager *)central {
if (central.state != CBCentralManagerStatePoweredOn) {
return;
}
if (central.state == CBCentralManagerStatePoweredOn) {
[_centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"0x180A"]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
NSLog(@"Start scanning");
}
}
你可以这样检查。它可以帮助您找出问题所在
编辑:
好吧,如果您已经尝试过以上代码。
然后理想的方法是使用swift中的新代码片段,因为scanForPeripheralsWithServices已弃用。
使用:这样的东西可以查看 func scanForPeripherals(withServices serviceUUIDs:[CBUUID] ?, 选项:[String:Any]? =零)
否则,您的硬件现在可能正确或正确广播。
答案 1 :(得分:0)
iBeacon,如果它们不宣传任何其他服务,则无法使用Core Bluetooth在后台进行扫描。只能使用“核心位置”进行扫描。