2015-03-01 12 views
26

Ho cercato di capire come ottenere la posizione dell'utente quando l'app viene terminata come l'app che lo fa. L'unico modo che conosco per farlo è con le modifiche significative all'ubicazione. Tuttavia, con modifiche significative alla posizione, l'app viene svegliata solo ogni 500 metri e solo se sono trascorsi circa 5 minuti dall'ultimo aggiornamento.Posizione utente in background quando l'app viene interrotta/sospesa

Secondo Apple:

Apps può aspettare una notifica non appena il dispositivo si muove a 500 metri o più dalla sua precedente notifica. Non dovrebbe aspettarsi notifiche più frequenti di una volta ogni cinque minuti. Se il dispositivo è in grado di recuperare i dati dalla rete, è molto più probabile che il responsabile della posizione invii le notifiche in modo tempestivo.

Nell'app Mosse, anche con l'app terminata, è possibile recuperare la posizione dell'utente in modo molto accurato senza drenaggio eccessivo nella batteria. Inoltre, non sembra che la posizione in background sia attivata poiché la sua ragione nell'elenco di utilizzo della batteria mostra solo "Attività in background". Quindi mi chiedo come faccia una app come Moves. Qualsiasi aiuto sarebbe grande! Grazie.

risposta

0

Dalla mia attuale esperienza, hai 3 opzioni per farlo funzionare. Il primo è quello di avere una notifica silenziosa che richiede uno sforzo da parte del back-end. La notifica silenziosa è una sorta di notifica push ma notifica la tua app senza un avviso. La seconda soluzione sono i recuperi di sfondo. I recuperi di sfondo non richiedono una soluzione di back-end, ma purtroppo non è possibile controllare gli intervalli necessari per istanziarlo. Il terzo ha una notifica locale programmata senza messaggi.

+0

Moves Ah stavo assumendo stavo facendo alcune notifiche silenziose così ho spento le notifiche per l'applicazione ed era ancora in grado di recuperare abbastanza con precisione dove sono stata tutta la giornata con esso che è terminato. Lo spegnimento delle notifiche impedisce il verificarsi di notifiche silenziose o vuote? – Zack

+0

Beh, non lo so per certo. Hai provato la 'kCLLocationAccuracyBestForNavigation'? –

+0

quando un'app viene uccisa dal commutatore di app .. è possibile riavviare l'app utilizzando la notifica silenziosa ... –

0

Dalla documentazione

rilevamento della posizione dell'utente

Ci sono diversi modi per tracciare la posizione dell'utente in background, maggior parte dei quali in realtà non richiedono la vostra applicazione per funzionare continuamente in la sfondo:

The significant-change location service (Recommended) 

Foreground-only location services 

Background location services 

Background Execution

E per i dettagli - Getting the User’s Location

+0

Questo non spiega come l'app "move" possa tracciare con precisione la posizione degli utenti anche quando l'app viene uccisa. – gibo

+0

Ucciso come nel processo terminato manualmente dall'utente? A parte l'accesso al file dei dati di localizzazione dei telefoni e la ricerca di data/ora (dubito di ciò che è disponibile su sistemi non jailbroken), il processo non può monitorare la posizione stessa. – jarryd

+0

L'app 'Muove' lo fa. – gibo

2

L'unica soluzione è quella di utilizzare la modalità di sfondo con CoreLocation. Se la tua app richiede iOS 8, il sistema rilancerà la tua app, anche se l'utente interrompe la forzatura. Questo è documentato in Apple Docs:

Nella maggior parte dei casi, il sistema non rilanciare le applicazioni dopo che sono forza uscire dall'utente. Un'eccezione è rappresentata dalle app di localizzazione, che in iOS 8 e vengono successivamente rilanciate dopo la chiusura forzata dell'utente. Negli altri casi , tuttavia, l'utente deve avviare l'app esplicitamente o riavviare il dispositivo prima che l'app possa essere avviata automaticamente nello sfondo dal sistema.

4

È possibile registrarsi per regioni in un'area di 500 metri e registrarsi per la notifica della regione di notifica in esse. Quando raggiunge uno se li, la tua app viene lanciata in background. Quindi, registrati di nuovo per quelli nuovi mantenendo quella posizione al centro.

enter image description here

Da Apple's Documentation:

applicazioni che supportano l'esecuzione in background possono essere rilanciati dal sistema per gestire gli eventi in arrivo. Se un'applicazione viene risolto per qualsiasi ragione diversa forza utente smettere, il sistema avvia l'applicazione quando uno dei seguenti eventi accade:

Per applicazioni location:

  • Il sistema riceve un aggiornamento di posizione che soddisfa i criteri configurati della app per la consegna.

  • Il dispositivo è entrato o uscito da una regione registrata. (. Le regioni possono essere regioni o regioni IBeacon geografica)

3

Nel caso abbiate bisogno di aggiornamenti sulla posizione frequentemente, ma ancora voglia di salvare la vita della batteria, provate questo -

  1. aggiungere le autorizzazioni necessarie per l'utilizzo di posizione sullo sfondo.
  2. avvia l'aggiornamento utilizzando startUpdatingLocation
  3. Inizio aggiornamenti rimandando quando in background utilizzando allowDeferredLocationUpdatesUntilTraveled:timeout: specificare i filtri tempo e la distanza in questo metodo.
  4. Assicurati di leggere i documenti here e specifica tutte le proprietà correttamente per farlo funzionare.
1

in iOS 8 sono nuovi passaggi che dobbiamo prestare attenzione per rendere il lavoro di recupero posizione. Il primo passaggio consiste nell'aggiungere una o due chiavi nel file .Plp del progetto, in base alle funzionalità principali dell'app. Le due chiavi sono NSLocationWhenInUseUsageDescription e NSLocationAlwaysUsageDescription, dovrai quindi aggiungere una stringa che spieghi all'utente perché l'app deve accedere alla sua posizione, qualcosa tra le righe di "Questa app utilizza la posizione in background/in primo piano a causa di A, B e C ". Ognuna di queste stringhe ha un metodo di autorizzazione corrispondente che deve essere chiamato, WhenInUse o Alway (ad esempio Sfondo).

- (void)startStandardUpdates 
{ 
    // Create the location manager if this object does not 
    // already have one. 
    if (nil == locationManager) 
     locationManager = [[CLLocationManager alloc] init]; 

    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; 

    // Set a movement threshold for new events. 
    locationManager.distanceFilter = 500; // meters 

    [locationManager startUpdatingLocation]; 
} 
Problemi correlati