2012-03-29 1 views
7

Sto tentando di mostrare la posizione corrente dell'utente impostando la proprietà di MKMapView, ovvero setShowsUserLocation a YES. Come impostazione predefinita, una freccia appare in alto a sinistra sullo schermo dell'iPhone quando l'applicazione inizia ad aggiornare il percorso dell'utente. Ma dopo aver mostrato la posizione corrente, la freccia dovrebbe scomparire ma è ancora presente finché l'app è in esecuzione, il che significa che l'app è ancora aggiornare la posizione in background? quindi, come posso interrompere l'aggiornamento della posizione corrente? Ho implementato il delegato che viene richiamato immediatamente ..Mostra la posizione attuale dell'utente con MKMapView?

risposta

15

Se la mappa è visibile e ha showUserLocation impostato su SÌ, continua ad aggiornare in background.

È necessario annullare l'impostazione quando la vista scompare o quando l'applicazione passa allo sfondo. Il modo migliore sarebbe probabilmente registrare il tuo ViewController per essere notificato per UIApplicationDidEnterBackgroundNotification e UIApplicationDidBecomeActiveNotification.

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appToBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appReturnsActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 
} 

Poi nel metodo chiamato da questa notifica, modificare le proprietà di visualizzazione mappa riguardanti userLocation:

- (void)appToBackground{ 
    [mapview setShowsUserLocation:NO]; 
} 

E

- (void)appReturnsActive{ 
    [mapview setShowsUserLocation:YES]; 
} 

Verificare che questi metodi sono infatti chiamati impostando un punto di interruzione lì e tornare alla schermata principale.

+2

Sto usando questo metodo, ma sto ottenendo quello che sembra essere un arresto della condizione di gara quando si entra in background: '[MKMapView (UserPositioning) stopUpdatingUserLocation]' chiama '[MKMapView (UserPositioningInternal) removeUserLocation]' che esplode con un SIGSEGV. Non pensi di aver già visto/risolto questo? –

+0

necessario rimuovere observer quando 'viewDidUnload'? – Raptor

+1

@MichaelKernahan Sto ricevendo lo stesso problema. Hai mai trovato una soluzione? – horsejockey

0

È possibile interrompere l'aggiornamento della posizione inviando un messaggio al manager della posizione [self.locationManager stopUpdatingLocation];

Per quanto riguarda il tuo caso, hai cercato di interrompere la visualizzazione della posizione degli utenti?

+0

non sto utilizzando alcun gestore di posizione .. se lo interrompo, nasconde anche l'annotazione (posizione) – hemant

+0

Provate ad implementare 'CLLocationManagerDelegate', avrete un modo migliore di controllare CoreLocation Framework. Puoi trovare un buon tutorial iniziale qui: http://www.switchonthecode.com/tutorials/getting-your-location-in-an-iphone-application –

1

Sono d'accordo con Michael Kernahan, sono abbastanza sicuro che ci sia una condizione di gara all'interno di MKMapView.

MKMapView sembra provare a rimuovere lo userLocationAnnotation (il punto blu) da solo non appena si rende conto di aver perso l'accesso ai servizi di localizzazione.

Tuttavia, che non sembra protetto e se lo sviluppatore rilascia anche una [mapView setShowsUserLocation:NO], è molto probabile che per ottenere un arresto a causa della gara tra filettatura interna MKMapView s' cercando di rimuovere il userLocationAnnotation, e il thread che chiama setShowsUserLocation:NO.

+0

concordato. Questo sembra essere un problema in iOS 7.x in particolare. Non penso di averlo ancora visto su 8.x. – Kevin