2015-03-15 2 views
0

С момента обновления до iOS 8.2 у меня, похоже, возникают проблемы с CoreBluetooth. У меня было предыдущее приложение, работающее с подклассом CBCentralManager для сканирования требуемых UUID. Теперь я не могу получить обратный вызов делегата до didDiscoverPeripherals.iOS 8.2 CoreBluetooth - CentralManager, не вызывающий делегат didDiscoverPeripherals

Я проверил, что периферийные устройства правильно передают через LightBlue. Я проверил, что состояние CentralManager включено до вызова сканирования. Я попробовал сканирование как с моим UUID, так и с нолем. Опять же, я работал над этим кодом несколько недель до обновления. Кто-нибудь еще испытывал это или имел какое-то представление о том, что может происходить?

EDIT - добавлен код 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 тождественно и что работает (проверено Светло-голубым).

+0

Вы сохраняете ссылку на свой 'CBCentralManager' в свойстве? Можете ли вы показать код, в котором вы настраиваете центральное устройство и сканируете периферийные устройства? – Paulw11

+0

Я добавил некоторый соответствующий код выше. Да, я сохраняю свой подкласс класса CBCentralManager' в свойстве «AppDelegate». –

+0

Вы пытались выключить и снова включить устройство? У меня возникли проблемы, когда Bluetooth не работает без видимых причин и выключается & снова исправляет его. – Paulw11

ответ

0

Похоже, что проблема связана с подклассом CBCentralManager. Возможно, из-за этих последних changes в iOS 8.2, потому что он работал отлично раньше. Быстрое исправление заключается в добавлении ivar manager в подкласс и инициализации CBCentralManager. Затем позвоните в этот менеджер scan. Хотя это, вероятно, не чистый подход, он подчеркивает эту проблему.

+0

@ Paulw11, если вы хотите опубликовать ответ, чтобы пролить свет на то, что здесь происходит (например, почему подкласс «CBCentralManager» не работает так, как я изначально имел его), я мог бы отметить его как принятый ответ. –

Смежные вопросы