2015-09-24 14 views
22

mia app tiene traccia di posizione, mentre in fondo ... la modalità della posizione in background è abilitata e io usoiOS9 non esegue il monitoraggio posizione, mentre in background

[self.locationManager startUpdatingLocation]; 

Questa grande opera su iOS7-8 ma smesso di funzionare sul iOS9

Nel simulatore funziona, ma sul dispositivo reale non ottengo la richiamata mentre in background ... quando eseguo lo stesso codice sul dispositivo iOS8 ottengo normali callback come prima

È documentato? Perché funziona nel simulatore e non nel dispositivo? E 'un errore?

Quando si utilizza startSignificantChangeUpdates funziona su iOS9, mi chiedo se questo è una sorta di risparmio della batteria caratteristica, che forse vietato startUpdatingLocation

+1

prega di consultare il belo http://stackoverflow.com/questions/30808192/allowsbackgroundlocationupdates-in-cllocationmanager-in-ios9 – Dipen

risposta

34

Usa:

if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { 
    [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 
} 

per evitare di utilizzare una macro che valuta la versione del sistema. Ciò richiederà setAllowsBackgroundLocationUpdates: su iOS 9, ma non su iOS 8.

+0

Questo salvato il mio week-end :) ed è strano che nel simulatore funzioni senza problemi –

15

Utilizzare seguito di riferimento per la posizione in ios 9

allowsBackgroundLocationUpdates in CLLocationManager in iOS9

Questa nuova struttura è spiegata nella sessione WWDC "Novità di Core Location".

Il valore di default è NO se collegare contro iOS 9.

Se l'applicazione utilizza posizione in background (senza mostrare la barra di stato blu) è necessario impostare allowsBackgroundLocationUpdates su YES oltre a impostare la modalità background funzionalità in Info.plist. In caso contrario, gli aggiornamenti di posizione vengono forniti solo in primo piano. Il vantaggio è che ora puoi avere gestori di località con aggiornamenti di posizione in background e altri gestori di località con solo aggiornamenti di posizione in primo piano nella stessa app. È inoltre possibile ripristinare il valore su NO per modificare il comportamento.

La documentazione è abbastanza chiaro a questo proposito:

Per impostazione predefinita, questo non è per le applicazioni collegate contro iOS 9.0 o versione successiva, a prescindere obiettivo minimo distribuzione.

Con UIBackgroundModes impostato per includere "posizione" in Info.plist, è necessario impostare questa proprietà su YES in fase di esecuzione ogni volta che si chiama -startUpdatingLocation con l'intento di continuare in background.

L'impostazione di questa proprietà su SÌ quando UIBackgroundModes non include "posizione" è un errore irreversibile.

Il ripristino di questa proprietà su NO equivale ad omettere "posizione" dal valore UIBackgroundModes. L'accesso alla posizione è ancora consentito ogni volta che l'applicazione è in esecuzione (cioè non sospesa) e ha un'autorizzazione sufficiente (cioè ha l'autorizzazione WhenInUse ed è in uso, oppure ha sempre l'autorizzazione). Tuttavia, l'app sarà comunque soggetta alle consuete regole di sospensione delle attività.

Vedere -requestWhenInUseAuthorization e -requestAlwaysAuthorization per ulteriori dettagli sui possibili valori di autorizzazione.

Grazie

+0

Grazie per upvote e accettare – Dipen

+2

Si noti che il programma si arresta in modo anomalo se si include questa proprietà su versioni di sistema inferiori alla 9.0. Verrà visualizzato: [CLLocationManager setAllowsBackgroundLocationUpdates:]: selettore non riconosciuto inviato all'istanza. Si prega di vedere la mia risposta per la gestione di questo. – mkabatek

+0

va bene grazie per suggeriscono – Dipen

8

Ho avuto lo stesso problema, è necessario aggiungere qualcosa di simile:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){ 

    [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 

} 

mio macro per controllare la versione del sistema è simile al seguente:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

Il seguente forum post mi ha aiutato:

https://forums.developer.apple.com/thread/6895