iOS - CoreBluetooth didDiscoverPeripheral只调用一次

时间:2016-02-03 12:40:17

标签: ios bluetooth bluetooth-lowenergy core-bluetooth

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

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

当我的蓝牙protocole代码在第一个视图中时,没有问题。但我决定上课并将我的蓝牙代码放入其中,因此我可以为我的另外两个观点制作一个全球课程。我用过:

self.bluetoothManager = [BluetoothManager getInstance];

BluetoothManager,是我的全球级。

问题在于:

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

此方法不再循环,仅在开始时调用一次。我很害怕其他服务,例如discoverCharacteristics或Notifications也不会循环。

编辑:这就是我创建课程的方式

+(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:到目前为止,我没有发布所有类方法来获得正确的问题,但CBCentralManager委托中的每个方法都被实现到我的类中。

到目前为止,我认为我的问题是关于线程的,因为唯一的区别是我的类不在主队列中了?我确实尝试过一些东西,但是如果有人有解决方案或想法来解决这个问题,我就不会对线程感到满意,提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果成功调用didDiscoverPeripheral:...回调,则表示您已正确执行所有操作。当您致电scanForPeripheralsWithServices:options:时,iOS会开始扫描周围环境以搜索BLE设备。在您明确调用stopScan或禁用BT或终止CBCentralManager实例之前,它会这样做。一些外围设备将立即被发现,其中一些将需要更多时间。每次发现设备时,都会调用didDiscoverPeripheral:回调。当这种情况发生时,您有责任决定是否对它感兴趣,连接它并发现它的服务。