CoreBluetooth - didDiscoverPeripheral从不调用特定的serviceUUID,但适用于nil

时间:2017-07-26 12:58:06

标签: ios objective-c core-bluetooth cbcentralmanager

我正在扫描蓝牙设备。为此我使用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没有任何问题,但事实并非如此。有什么想法吗?

2 个答案:

答案 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在后台进行扫描。只能使用“核心位置”进行扫描。