iOS 8.2 CoreBluetooth - CentralManager没有调用委托didDiscoverPeripherals

时间:2015-03-15 22:44:30

标签: ios core-bluetooth

自从升级到iOS 8.2后,我似乎遇到了CoreBluetooth问题。我有一个以前的应用程序工作,运行CBCentralManager子类来扫描我想要的UUID。现在,我无法获得didDiscoverPeripherals的委托回调。

我已经验证外围设备是通过LightBlue正确广播的。在调用扫描之前,我已经验证了CentralManager状态是否已打开电源。我尝试使用我的UUID和nil进行扫描。再次,我在升级之前已经使用了几周的代码。有没有其他人经历过这个或者知道会发生什么?

编辑 - 添加了代码CBCentralManager子类代码

@implementation CentralManager

-(id) initWithDelegate:(id<CBCentralManagerDelegate>)delegate queue:(dispatch_queue_t)queue {
    self = [super initWithDelegate:delegate
                             queue:queue
                           options:nil];
    _items = [NSMutableDictionary new];
    _discoveredPeripherals = [NSMutableArray new];
    _app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    return self;
}

-(void) startScan {
    if (!_isScanning && self.state == CBCentralManagerStatePoweredOn && _app.loggedIn) {
        [self scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:APP_SERVICE_UUID]] options:nil];
        _isScanning = YES;
        NSLog(@"Scanning started");
    }
}

-(void) stopScan {
    [super stopScan];
    _isScanning = NO;
    NSLog(@"Scanning stopped");
}

在AppDelegate中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (!_centralManager) {
    _centralQueue = dispatch_queue_create("centralQueue", nil);
    _centralManager = [[CentralManager alloc]initWithDelegate:self queue:_centralQueue];
}
    [_peripheralManager beginAdvertising];
    [_centralManager startScan];
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    if (central.state == CBCentralManagerStatePoweredOn) {
        [_centralManager startScan];
    }
}

startScan被调用两次,具体取决于用户是否已登录或centralManager是否已启动。我基本上同等对待peripheralManager并且有效(由浅蓝色验证)。

1 个答案:

答案 0 :(得分:0)

看起来问题与子类化CBCentralManager有关。也许是因为iOS 8.2中最近的changes,因为之前它运行良好。快速解决方法是在子类中添加ivar manager并初始化CBCentralManager。然后在该经理上拨打scan。虽然这可能不是一个干净的方法,但它突出了这个问题。