2014-11-22 4 views
1

Я работаю над этим проектом довольно долгое время. Необходимо периодически собирать данные с устройства bluetooth, когда приложение находится в переключателе приложений в фоновом режиме.iOS Core Bluetooth уведомляет приложение, когда устройство Bluetooth подключается

Моя последняя мысль заключается в использовании Core Bluetooth для уведомления моего приложения, когда подключено устройство Bluetooth, поэтому я могу проверить, работает ли его устройство, а затем делать то, что мне нужно.

Или я пропущу интерпретацию документов, когда он говорит: «didConnectPeripheral»?

У меня возникли проблемы с поиском функции в моем объекте CBCentralManager, чтобы запустить «наблюдателя», чтобы дать мне эти уведомления.

Я здесь по неправильному пути?

Спасибо.

попытка кода использовать ядро ​​Bluetooth:

CBCentralManager *mgr; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; 

    mgr = [CBCentralManager alloc]; 
    CBPeripheral *peripheral = [CBPeripheral alloc]; 
    [mgr connectPeripheral:peripheral options:nil]; 
    // Override point for customization after application launch. 
    return YES; 
} 

- (void) mgr:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{ 
    NSLog(@"Device Connected!"); 
} 
- (void) mgr:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{ 
    NSLog(@"Device Disconnected!"); 
} 
- (void)mgr:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 
    NSLog(@"Did discover peripheral. peripheral: %@ rssi: %@, UUID: %@ advertisementData: %@ ", peripheral, RSSI, peripheral.UUID, advertisementData); 
    //Do something when a peripheral is discovered. 
} 

получает сообщение об ошибке:

2014-11-21 23:30:27.730 TelematicsService[436:185202] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]' 
*** First throw call stack: 
(0x286db49f 0x35e91c8b 0x285fb873 0x285fb657 0x283adb85 0xf005f 0x2bc084f1 0x2bdfd43f 0x2bdff98b 0x2be0a209 0x2bdfe217 0x2ee6c0d1 0x286a1d7d 0x286a1041 0x2869fb7b 0x285ed3c1 0x285ed1d3 0x2bc021bf 0x2bbfcfa1 0xf2a29 0x36411aaf) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Благодаря периферическая не полностью определено Я считаю

+0

Просто введите «подключиться» к вашему периферийному устройству. Когда периферийное устройство находится в диапазоне, будет вызываться 'didConnectPeripheral', даже если ваше приложение находится в фоновом режиме. Если вы хотите, чтобы он работал через перезапуск приложений/устройств, то посмотрите на восстановление состояния в руководстве по программированию ядра Bluetooth. – Paulw11

+0

Интересно, что я использую библиотеку, предоставляемую аппаратным обеспечением, которое заботится обо всех протоколах Bluetooth и связи с устройством. Когда вы говорите «connect», вы имеете в виду connectPeripheral объекта CBCentralManager? – theshadow124

+0

Да. Руководство по программированию ядра Bluetooth обсуждает фоновые соединения - https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Концептуальные/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html # // apple_ref/doc/uid/TP40013257 – Paulw11

ответ

3

Есть по крайней мере две проблемы в этом коде ,

  1. Вы не должны сами создавать CBPeripheral экземпляров. Это приводит к вашему сбою. Если вам нужно подключиться к Bluetooth-устройства делают это в

    centralManager:didDiscoverPeripheral:advertisementData:RSSI: 
    

    или

    centralManager:didRetrievePeripherals: 
    

    Эти методы дают вам действительный CBPeripheral экземпляра.

    В вашем реальном приложении вы должны создать пользовательский интерфейс, в котором пользователь может выбрать одно из обнаруженных устройств. Вы не хотите подключаться ко всем обнаруженным устройствам.

  2. Методы, которые должны быть определены как CBCentralManagerDelegate, называются неправильными, поэтому их никогда не назовут. Вы не можете изменить селектор (т. Е. «Имя») этих методов.

    правильные методы названы:

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

    Вы должны выполнять другие, а также.

+0

будет ли это работать с дополнительными устройствами? – theshadow124

+0

Нет. Core-Bluetooth - это способ подключения устройств с низкой энергией Bluetooth. –