iOS - CoreBluetooth didDiscoverPeripheral 只调用了一次

iOS - CoreBluetooth didDiscoverPeripheral called only once

我实际上正在使用低功耗蓝牙制作应用程序。

到目前为止,我的应用程序获得了 3 个视图,每个视图都显示了一些 BLE 信息。

当我的蓝牙协议代码在第一个视图时,没有问题。但我决定制作一个 class 并将我的蓝牙代码放入其中,这样我就可以为我的其他 2 个视图制作一个全局 class。我用过:

self.bluetoothManager = [BluetoothManager getInstance];

BluetoothManager,作为我的全局 class。

问题来了:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

此方法不再循环,只在开始时调用一次。我担心其他服务,如 discoverCharacteristics 或 Notifications 也不会循环。

编辑:这就是我创建 class

的方式
+(BluetoothManager *)getInstance {
    @synchronized(self)
    {
        if(instance==nil)
        {
            instance= [[BluetoothManager alloc] init];
        }
    }
    return instance;
}

- (id) init {
    self.CentralManager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
    self.activePeripheral = [CBPeripheral alloc];
    self.discoveredPeripherals = [NSMutableArray new];
    self.resultValue = [[NSString alloc] init];
    return self;
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    if (central.state != CBCentralManagerStatePoweredOn) {
        return;
    }

    if (central.state == CBCentralManagerStatePoweredOn) {
        // Scan for devices
        [self.CentralManager scanForPeripheralsWithServices:nil options:nil];
        NSLog(@"Scanning started");
     }
}

编辑 2:到目前为止,我没有 post 所有 class 方法来得到一个正确的问题,但是来自 CBCentralManager 委托的每个方法都被实现到我的 class.

到目前为止,我认为我的问题是关于线程的,因为唯一的区别是我的 class 不再在主队列中了?我确实尝试了一些事情,但我对线程不太满意,如果有人有解决此问题的解决方案或想法,请提前致谢。

如果 didDiscoverPeripheral:... 回调调用成功,这意味着你做的一切都是正确的。当您调用 scanForPeripheralsWithServices:options: 时,iOS 开始扫描周围环境以搜索 BLE 设备。它会一直这样做,直到您显式调用 stopScan 或禁用 BT 或终止您的 CBCentralManager 实例。有些外围设备会立即找到,有些则需要更多时间。每次发现设备时,都会调用 didDiscoverPeripheral: 回调。发生这种情况时,您有责任决定是否对它感兴趣、连接它并发现它的服务。