Question

I set the mapView.delegate, etc.
Everything is ok but when I leave and few minutes after I resume my app, it quits.

The console gives me this but I haven't been able to fix it:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'Invalid Region <center:-180.00000000, -180.00000000 span:+0.09000000, +0.09000000>'

Send setRegion in didUpdateUserLocation method after userLocation was updated

 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    [mapView removeAnnotations: [mapView annotations]];
    for (TOJSearchItem *searchItem in _searchItems) {
        TOJPlaceRequest *request = [TOJPlaceRequest new];
        [request execute:SERVER_URL coordinate:userLocation.coordinate searchItem:searchItem delegate:self];
    }
    MKCoordinateRegion region = {{userLocation.coordinate.latitude , userLocation.coordinate.longitude}, {0.09f , 0.09f}};
    [mapView setRegion:region animated: YES];
}

make request

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    if (_lastLocation != nil) {
        CLLocationDistance meters = [newLocation distanceFromLocation:_lastLocation];
        if (meters < DISTANCE_MINI) {
//            CALCUL tout les points par rapport a current location
//            NSLog(@"%f, %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
        } else {
            for (TOJSearchItem *searchItem in _searchItems) {
                TOJPlaceRequest *request = [TOJPlaceRequest new];
                [request execute:SERVER_URL coordinate:newLocation.coordinate searchItem:searchItem delegate:self];
            }
            MKCoordinateRegion region = {{newLocation.coordinate.latitude , newLocation.coordinate.longitude}, {0.09f , 0.09f}};
            [_mapView setRegion: region animated: YES];
            NSLog(@"reconnection");
        }
    }
    _lastLocation = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
}

reset the region after clicked on an annotation

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    if ([view class] == TOJClusterPushPinView.class) {
        TOJClusterPushPinView *clusterPushPinView = (TOJClusterPushPinView *)view;
        CLLocationCoordinate2D topLeftCoordinate;
        topLeftCoordinate.latitude = -90;
        topLeftCoordinate.longitude = 180;
        CLLocationCoordinate2D bottomRightCoordinate;
        bottomRightCoordinate.latitude = 90;
        bottomRightCoordinate.longitude = -180;
        for (TOJPushPin *pushPin in clusterPushPinView.clusterPushPin.pushPins) {
            topLeftCoordinate.longitude = fmin(topLeftCoordinate.longitude, pushPin.coordinate.longitude);
            topLeftCoordinate.latitude = fmax(topLeftCoordinate.latitude, pushPin.coordinate.latitude);
            bottomRightCoordinate.longitude = fmax(bottomRightCoordinate.longitude, pushPin.coordinate.longitude);
            bottomRightCoordinate.latitude = fmin(bottomRightCoordinate.latitude, pushPin.coordinate.latitude);
        }
        MKCoordinateRegion region;
        region.center.latitude = topLeftCoordinate.latitude - (topLeftCoordinate.latitude - bottomRightCoordinate.latitude) * 0.5;
        region.center.longitude = topLeftCoordinate.longitude + (bottomRightCoordinate.longitude - topLeftCoordinate.longitude) * 0.5;
        region.span.latitudeDelta = fabs(topLeftCoordinate.latitude - bottomRightCoordinate.latitude) * 2.0; // Add a little extra space on the sides
        region.span.longitudeDelta = fabs(bottomRightCoordinate.longitude - topLeftCoordinate.longitude) * 2.0; // Add a little extra space on the sides
        region = [mapView regionThatFits:region];
        [mapView setRegion:region animated:YES];
    }
}
Was it helpful?

Solution

If your didUpdateToLocation method you should check that the location variable you are being given is valid.

 if (userLocation.location.horizontalAccuracy >= 0) {

It is known behaviour, though I don't see the logic in it, that the first location it gets after a resume may be invalid. Any location with an accuracy < 0 should be discarded.

Ref: http://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLLocation_Class/CLLocation/CLLocation.html#//apple_ref/occ/instp/CLLocation/horizontalAccuracy

OTHER TIPS

change to

 if (userLocation.location.horizontalAccuracy >= 1) {

 .......

 }

it works

You should check in didUpdateUserLocation if

userLocation.location != nil

In my application, when returning from an applicationDidBecomeActive event, the first coordinate is always invalid.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top