2014-11-12 14 views
9

Ci sono molte domande correlate ma (apparentemente) nessuna risposta. SO ...iOS come riconnettersi al dispositivo BLE in background?

La mia app per iOS fa riceve aggiornamenti dal mio dispositivo BLE mentre l'app è in background. Se perdo il contatto con il dispositivo BLE, quindi in centralManager:didDisconnectPeripheral: chiamo - [CBCentralManager cancelPeripheralConnection:] - altrimenti non riconnetterò mai alla periferica persa. Quindi chiamo [(ri) chiamata - [CBCentralManager scanForPeripheralsWithServices:options:].

La registrazione mi mostra che la chiamata didDisconnectPeripheral e le sue chiamate contenute stanno entrambi accadendo mentre nello sfondo. Tuttavia, la riconnessione avviene solo quando l'app si riattiva dallo sfondo.

Quindi sono in grado di comunicare con il dispositivo BLE collegato mentre è in background (sì!) Ma non riconnettere. Questo è abbastanza importante per la mia app e (si potrebbe pensare) per altre app. Suggerimenti benvenuto

risposta

5

Paul era corretto, che non avevo bisogno di cancellare la connessione, e che non avevo bisogno di ripetere la scansione, e che tutto quello che dovevo fare era chiamare connectPeripheral. MA ... quello che non stavo facendo era questo:

_manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)]; 

stavo passando pari a zero per la coda, il che significava il mio callback CBCentralManagerDelegate erano in esecuzione sul thread principale.

8

Non è necessario annullare la connessione - è già scollegato Non è necessario eseguire nuovamente la scansione per la periferica - è già stata identificata la periferica.

In didDisconnectPeripheral si può semplicemente chiamare

[central connectPeripheral:peripheral options:nil]; 

Nucleo Bluetooth ricollegherà una volta che la periferica è di nuovo visibile

Un campione completo è qui - https://github.com/paulw11/BTBackground

+0

Sfortunatamente non per me. Infatti, usando connectPeripheral (invece di richiamare scanForPeripherals) la mia app non si riconnette nemmeno se è ancora in primo piano. La connessione non viene mai ristabilita.Considerando che se chiamo scanForPeripheral in didDisconnectPeripheral, I * do * si riconnetterà se in primo piano, ma ancora non in background. Grr. –

+0

Il dispositivo è un TI SensorTag, FWIW. –

+0

Ok. I tag dei sensori sono fastidiosi - si spengono dopo pochi minuti, quindi non sono sicuro che questo sia il tuo problema. Anche i dispositivi iOS sono difficili da utilizzare perché cambiano l'indirizzo MAC ogni pochi minuti. Ho un tag del sensore, quindi avrò un gioco e vedrò cosa succede. Potrebbe volerci un giorno o due ... – Paulw11

0

Nella scheda "Capacità" -> Sfondo Modalità, scegli "Accessori Bluetooth LE degli utenti" e "Funziona come accessorio Bluetooth LE". Non sono sicuro che funzioni, ma puoi provare.

+0

Grazie per il suggerimento. Ho già utilizzato gli accessori Bluetooth LE. Ho aggiunto Atti come, ma non ha cambiato le cose. Buona idea però. Si dovrebbe sempre provare cose che * non dovrebbero * funzionare. Perché potrebbero funzionare! –

3

So che probabilmente hai già capito tutto. Anch'io sono incappato in questo problema. Facendo il seguente da solo non risolverebbe completamente il problema (almeno per me):
[central connectPeripheral:peripheral options:nil];

Invece di "zero" per le opzioni, sarà necessario fornire "opzioni" nel metodo di cui sopra. Ci sono altre cose che devi impostare (come info.plist per la tua app). Dopo aver letto le istruzioni di Apple su come abilitare l'operazione bluetooth in background per un'app. Sono stato in grado di farlo funzionare e ricevere eventi per la connessione, la disconnessione, l'aggiornamento ecc., Anche la scansione può funzionare in secondo piano. Per non ripetere tutto ciò di cui ha scritto il documento Apple, puoi dare un'occhiata al seguente link:
Core Bluetooth Background Processing for iOS Apps

Spero che questo aiuti.

+0

Per me, la chiave stava passando il parametro appropriato per la coda, come indicato sopra. Tuttavia, le opzioni sono sicuramente rilevanti. Grazie. –

Problemi correlati