24

Utilizzo la struttura core-bluetooth per la mia app in Iphone-4s.
In genere deve essere un'app in background che può essere eseguita il più a lungo possibile.Problema nel tempo di sfondo per l'app Bluetooth LE per Iphone 4s

Ora funziona solo per 40 min - 1 ora max.

Sto sperando per almeno 1 giorno o così.

Per questo valore "bluetooth-centrale" è aggiunto in "Modalità sfondo richiesto" digitare il file .plist.

Sembra che la mia app stia "sospendendo", alla fine. da quando apro di nuovo l'app (lo sfondo in primo piano) sta inviando nuovamente la notifica, significa che la connessione bluetooth è ancora connessa e il dispositivo BLE sta ancora inviando notifiche. Se premo il tasto home e l'app arriva in background, NON riceve di nuovo la notifica.

Qualcuno può dirmi perché la mia app è attiva in modalità background solo per un massimo di 1 ora. Dovrebbe continuare a funzionare come una normale app musicale in background per sempre.

Apple dice qualcosa di specifico su quale condizione un'app di sfondo (che è una di quelle app in esecuzione continua in background rientrante nelle 5 categorie) in mancanza di quale andrà in modalità di sospensione?

Riferendosi sezione "Communicating with a Bluetooth Accessory", "iPhoneAppProgrammingGuide", su vengo a sapere che, per molto tempo in esecuzione di sfondo compito per l'applicazione Bluetooth LE 2 implementazioni sono necessory:

1 chiave UIBackgroundModes) dovrebbe essere "Bluetooth-centrale "nel file Info.plist. 2) Qualsiasi app che supporti l'elaborazione in background dei dati Bluetooth deve essere basata sulla sessione.

Quindi per la mia app è stata incorporata la PRIMA implementazione e con tale applicazione è possibile eseguire in background e svolgere tutte le attività per la durata massima di 1 ora per .

Ora ho bisogno di implementare la 2a implementazione. cioè basato sulla sessione. Che consentirà di ottenere gli eventi anche se l'app è in stato "sospensione" in base alla documentazione. Ho cercato di trovare una sessione adatta specifica per Bluetooth LE (Core Bluetooth framework) come il"EASession" presente per Classic Bluetooth (External Accessory framework). Ma non l'ho trovato.

Fondamentalmente non sono sicuro di quale classe di sessione devo usare per lo scopo BLE. Per audio/video, collegamento in rete e Internet, accessorio esterno, , sono disponibili classi di sessioni individuali. Non ce n'è per il framework Bluetooth Core.

Qualcuno potrebbe aiutarmi con quale classe di sessione è adatta per BLE.

+0

Si dovrebbe essere in grado di eseguire in background per tutto il tempo che vuoi, hai mai farlo funzionare? –

+2

Sto vedendo la stessa cosa. La mia periferica potrebbe perdere la connettività al dispositivo iOS per diversi minuti e quando tornerà nel raggio d'azione, l'app in background lo troverà e continuerà. Ma se perde la connettività per ore, l'app in background cessa di provare a riconnettersi di nuovo. – Jonathan

+0

Se è necessario modificarlo, è possibile attivare anche la riproduzione del suono di sottofondo e riprodurre continuamente un breve suono silenzioso quando l'app entra in background e interromperla quando diventa attiva. –

risposta

5

Credo che il problema è semplice cercare di implementare voi info.plist come il mio schermo:

enter image description here
E se volete potete aggiungere la funzione sul AppDelegate.m sotto la didFinishLaunchingWithOptions attivare Bluetooth, AirPlay Wi-Fi e di più, questo è solo un codice di esempio, ma penso che possa aiutarti.

NSError *sessionError = nil; 
[[AVAudioSession sharedInstance] setDelegate:self]; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

Spero che questo possa aiutarti.