我实际上正在使用蓝牙低功耗制作应用程序。
我的应用程序到目前为止有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
委托中的每个方法都被实现到我的类中。
到目前为止,我认为我的问题是关于线程的,因为唯一的区别是我的类不在主队列中了?我确实尝试过一些东西,但是如果有人有解决方案或想法来解决这个问题,我就不会对线程感到满意,提前谢谢。
答案 0 :(得分:1)
如果成功调用didDiscoverPeripheral:...
回调,则表示您已正确执行所有操作。当您致电scanForPeripheralsWithServices:options:
时,iOS会开始扫描周围环境以搜索BLE设备。在您明确调用stopScan
或禁用BT或终止CBCentralManager
实例之前,它会这样做。一些外围设备将立即被发现,其中一些将需要更多时间。每次发现设备时,都会调用didDiscoverPeripheral:
回调。当这种情况发生时,您有责任决定是否对它感兴趣,连接它并发现它的服务。