2016-02-19 16 views
6

Sto provando a fare un'app per tenere traccia del GPS dell'utente in ogni momento, questa app è una sorta di tracker GPS per auto per ottenere la posizione del guidatore tutto il tempo e inviarla a server.Applicazione di localizzazione GPS iOS che funziona sempre

Ho provato ad aggiungere "aggiornamenti di posizione" alle "modalità sfondo", ma l'app si sospende automaticamente dopo 10 minuti quando si passa in background.

C'è un modo per far funzionare questa app sempre e ottenere la posizione GPS?

Grazie.

risposta

7

Sono disponibili due opzioni:

1) Monitoraggio della posizione regolare.
Questo tipo di rilevamento funziona con le autorizzazioni kCLAuthorizationStatusAuthorizedWhenInUse e kCLAuthorizationStatusAuthorizedAlways. Quando CLLocationManager ha avviato il percorso di rilevamento una volta che riceverà gli aggiornamenti di posizione in modalità delegato locationManager:didUpdateLocations:. L'app può passare allo stato sospeso, ma quando il gestore località riceve una nuova app di localizzazione passa allo stato in background e gestisce la nuova posizione in modalità delegato. Come installare location manager:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.locationManager = [[CLLocationManager alloc] init]; 

    // Setup location tracker accuracy 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 

    // Distance filter 
    self.locationManager.distanceFilter = 50.f; 

    // Assign location tracker delegate 
    self.locationManager.delegate = self; 

    // This setup pauses location manager if location wasn't changed 
    [self.locationManager setPausesLocationUpdatesAutomatically:YES]; 

    // For iOS9 we have to call this method if we want to receive location updates in background mode 
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){ 
     [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 
    } 

    [self.locationManager startUpdatingLocation]; 
} 


2) posizione significazione tenere traccia delle modifiche.
Questo tipo di tracciamento funziona solo con l'autorizzazione kCLAuthorizationStatusAuthorizedAlways. Riceve una nuova posizione solo ogni 500 metri, quindi il filtro della distanza e l'accuratezza desiderata non funzionano qui. L'app può andare in stato sospeso e può anche essere terminata dal sistema, ma quando l'app per l'aggiornamento della posizione passa allo stato in background e riceve la posizione nel metodo delegato locationManager:didUpdateLocations:.
Se l'applicazione è stata interrotta dal sistema, verrà riavviata in background con la chiave UIApplicationLaunchOptionsLocationKey nelle opzioni di avvio nel metodo di delegazione dell'app didFinishLaunchingWithOptions. Come installare questo tipo di localizzazione:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.locationManager = [[CLLocationManager alloc] init]; 

    // Assign location tracker delegate 
    self.locationManager.delegate = self; 

    // For iOS9 we have to call this method if we want to receive location updates in background mode 
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){ 
     [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 
    } 

    [self.locationManager startMonitoringSignificantLocationChanges]; 
} 


si dovrebbe notare che entrambi questi metodi non garantisce che l'applicazione non va a stato di sospensione.
Inoltre, se l'app è stata interrotta dall'utente (ad esempio dal commutatore di app tramite scorrimento) il rilevamento della posizione in background non funzionerà.


UPDATE (corrispondente ai commenti)

Ecco i miei esempi di codice che lavorano per me:
For Regular tracking. Esegui l'esempio, fornisci l'accesso alla posizione dell'utente, tocca Avvia il pulsante per avviare gli aggiornamenti della posizione. Per testare le posizioni nel simulatore, selezionare nel menu del simulatore Debug> Posizione> Freeway Drive. Ora puoi spingere l'app sullo sfondo con il tasto home (Command + Shift + H). Lascia il simulatore per più di 10 minuti e tutte le app per questa volta riceveranno le posizioni. Quando torni all'app vedrai puntine rosse sulla mappa.
For Significant changes. Esegui l'app e esegui il test come per l'esempio precedente.
il monitoraggio dei cambiamenti significativi possono essere avviati solo con il metodo [self.locationManager startMonitoringSignificantLocationChanges];

UPDATE (iOS 11)

Modifiche a rilevamento della posizione in iOS 11

iOS 11 fa anche alcune importanti modifiche alla API esistenti. Una delle aree interessate è il rilevamento della posizione. Se l'app utilizza solo la posizione mentre l'app è in primo piano, come la maggior parte delle app, potrebbe non essere necessario modificare nulla; tuttavia, se si tratta di una di quelle app che monitorano continuamente la posizione dell'utente nell'arco della giornata, è consigliabile prenotare un po 'di tempo quest'estate per apportare alcune modifiche al modo in cui esegui il monitoraggio e testare possibili scenari di utilizzo.

segui questo link: https://mackuba.eu/2017/07/13/changes-to-location-tracking-in-ios-11/

+0

Grazie per la risposta, per l'opzione 1, lei ha detto che quando si riceve nuova posizione, lo stato passa da sospensione a fondo, ho testato per giorni e questo caso non è mai successo a me, l'applicazione ritorna rivivere SOLO quando si esegue l'app manualmente, quindi si sospende dopo 10 minuti, perché ??? – TMMDev

+0

Per l'opzione 2, c'è un modo per far sì che startMonitoringSignificantLocationChanges esegua in qualche modo [self.locationManager startUpdatingLocation]? questo renderà almeno possibile eseguire ogni 500 metri almeno – TMMDev

+1

Risposta aggiornata per i tuoi commenti. Non vedo il tuo codice, quindi ho fornito collegamenti ai miei esempi di codice qui per entrambe le opzioni 1 e 2. – shpasta

0

In risposta al commento 1 nella soluzione (non posso commentare da nessuna parte): non avete sembra risolvere il problema come la vostra applicazione viene sospeso e non aggiorna la posizione più dopo 10 minuti.

ho avuto lo stesso problema: avevo impostato setAllowsBackgroundLocationUpdates-YES, e ho avuto la chiave NSLocationAlwaysUsageDescription nel mio Info.plist, ma il mio App anche usato per fermare il monitoraggio posizione dopo 10 minuti.

ho risolto con l'aggiunta sia NSLocationAlwaysUsageDescription e NSLocationWhenInUseUsageDescription al file Info.plist in modo che assomiglia a questo:

<key>NSLocationAlwaysUsageDescription</key> 
    <string>This app needs to use your location</string> 

    <key>NSLocationWhenInUseUsageDescription</key> 
    <string>This app needs to use your location</string> 
0

set it.it prendere il potere della batteria, ma la corsa in applicazione Background.OS non sospendere la vostra App

[self.locationManager setPausesLocationUpdatesAutomatically:NO]; 
Problemi correlati