Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Show Current User Location with MKMapView?

Tags:

ios

iphone

mapkit

I am trying to show current location of user by setting the property of MKMapView i.e setShowsUserLocation to YES. As by default an arrow appears on the top left of iPhone screen when the application starts updating the user location.But after showing the current location the arrow should disappear but its still present as long as the app is running which would mean the app is still updating the location in the background? so how can i stop updating the current location? i have implemented the delegate which gets called up immediately..

like image 712
hemant Avatar asked Mar 29 '12 11:03

hemant


2 Answers

If the map is visible and has showUserLocation set to YES, it continues to update in the background.

You need to unset this when the view disappears or when the Application goes to background. The best way would probably be to register your viewController to be notified for UIApplicationDidEnterBackgroundNotification and 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];
} 

Then in the method called by this notification, change the map view properties regarding userLocation:

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

And

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

Check that these methods are indeed called by setting a breakpoint there and returning to the home screen.

like image 88
Cyril Godefroy Avatar answered Nov 08 '22 07:11

Cyril Godefroy


I agree with Michael Kernahan, I'm pretty sure there is a race condition inside MKMapView.

MKMapView appears to try to remove the userLocationAnnotation (the blue dot) by itself as soon as it realises it lost access to location services.

However, that does not seems protected and if the developer also issues a [mapView setShowsUserLocation:NO], it is very likely to get a crash because of the race between MKMapView's internal thread trying to remove the userLocationAnnotation, and the thread that is calling setShowsUserLocation:NO.

like image 42
make.it.floss Avatar answered Nov 08 '22 07:11

make.it.floss