2012-03-29 14 views
7

Estoy tratando de mostrar la ubicación actual del usuario estableciendo la propiedad de MKMapView es decir setShowsUserLocation a YES. Como por defecto aparece una flecha en la parte superior izquierda de la pantalla del iPhone cuando la aplicación comienza a actualizar la ubicación del usuario. Pero luego de mostrar la ubicación actual, la flecha debería desaparecer, pero aún está presente mientras la aplicación esté funcionando, lo que significa que la aplicación actualizar la ubicación en el fondo? Entonces, ¿cómo puedo dejar de actualizar la ubicación actual? He implementado el delegado, que es llamada de inmediato ..¿Mostrar la ubicación actual del usuario con MKMapView?

Respuesta

15

Si el mapa es visible y tiene showUserLocation establecido en SÍ, continúa actualizándose en segundo plano.

Debe desactivar esto cuando la vista desaparece o cuando la aplicación se pone en segundo plano. Probablemente la mejor forma sea registrar su viewController para recibir notificaciones de UIApplicationDidEnterBackgroundNotification y 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]; 
} 

Luego, en el método llamado de la presente notificación, cambiar las propiedades de vista de mapa con respecto userLocation:

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

Y

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

Compruebe que estos métodos son de hecho llamados por el establecimiento de un punto de interrupción allí y volviendo a la pantalla de inicio.

+2

He estado utilizando este método, pero estoy obteniendo lo que parece ser un accidente de condición de carrera cuando se ingresa el fondo: '[MKMapView (UserPositioning) stopUpdatingUserLocation]' llama '[MKMapView (UserPositioningInternal) removeUserLocation]' que explota con un SIGSEGV. ¿No crees que ya has visto/resuelto esto? –

+0

necesita eliminar el observador cuando 'viewDidUnload'? – Raptor

+1

@MichaelKernahan Estoy recibiendo el mismo problema. ¿Encontraste alguna solución? – horsejockey

0

Puede detener la actualización de la ubicación mediante el envío de un mensaje al administrador de la ubicación [self.locationManager stopUpdatingLocation];

cuanto a su caso, ¿trató de dejar de mostrar la ubicación de los usuarios?

+0

no estoy usando ningún administrador de ubicación ... si lo detengo, también oculta la anotación (ubicación) – hemant

+0

Intenta implementar 'CLLocationManagerDelegate', tendrás una mejor manera de controlar CoreLocation Framework. Puede encontrar un buen tutorial de inicio aquí: http://www.switchonthecode.com/tutorials/getting-your-location-in-an-iphone-application –

1

Estoy de acuerdo con Michael Kernahan, estoy bastante seguro de que hay una condición de carrera dentro de MKMapView.

MKMapView parece que intenta eliminar el userLocationAnnotation (el punto azul) por sí solo tan pronto como se da cuenta de que ha perdido el acceso a los servicios de ubicación.

Sin embargo, eso no parece protegida y si el desarrollador también emite un [mapView setShowsUserLocation:NO], es muy probable que obtenga un accidente debido a la carrera entre la rosca interior MKMapView 's tratando de eliminar el userLocationAnnotation, y el hilo que está llamando setShowsUserLocation:NO.

+0

De acuerdo. Esto parece ser un problema en iOS 7.x en particular. No creo haberlo visto todavía en 8.x. – Kevin

Cuestiones relacionadas