Получение «Направления недоступны» вызов Google Maps с URLWithString - PullRequest
1 голос
/ 26 марта 2012

У меня есть приложение, которое довольно успешно использует Apple Maps: у меня есть список с некоторыми достопримечательностями, и если я коснусь одного из них, сначала приложение отобразит его на карте, а затем, если я коснусь его, откроется Apple Maps. Приложение для навигации.

Проблема в том, что при первом же нажатии / запуске приложение открывает Apple Maps, но ни в том случае, если оно не запрашивает разрешение на использование местоположения пользователя, а если нет, Apple Maps не работает и возвращает: «Указания недоступны» Не удалось найти направление между этими местами ". но в общих настройках служба определения местоположения для моего приложения включена.

Я подумал, что должен был использовать своего рода тайм-аут, потому что моему приложению требуется слишком много времени для анализа данных для навигации (я получаю данные из XML), но при втором нажатии все работает нормально, даже если я запускаю его с Mac в режим отладки (и он анализирует xml даже во второй раз) ...

Надеюсь, я хорошо объяснил. Есть намеки?

   -(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation 
{
    MKPinAnnotationView *pinView = nil; 
    if(annotation != mapView.userLocation) 
    {
    static NSString *defaultPinID = @"com.invasivecode.pin";
    pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
    if ( pinView == nil ) pinView = [[[MKPinAnnotationView alloc]
                                      initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];

    pinView.pinColor = MKPinAnnotationColorRed; 


    UIButton *myAccessoryButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
    [myAccessoryButton setBackgroundColor:[UIColor clearColor]];
    [myAccessoryButton setImage:[UIImage imageNamed:@"flag.png"] forState:UIControlStateNormal];
    pinView.rightCalloutAccessoryView = myAccessoryButton;
    pinView.canShowCallout = YES;
    pinView.animatesDrop = YES;
    [myAccessoryButton release];
} 
else {
    [mapView.userLocation setTitle:@"You're here"];
}
return pinView;
}

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
[locationManager startUpdatingLocation];

CLLocation *location = [locationManager location];

// Configure the new event with information from the location
CLLocationCoordinate2D coordinate = [location coordinate];

NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude]; 
NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];


CLLocationCoordinate2D start = { [latitude floatValue], [longitude floatValue] };
CLLocationCoordinate2D end = {[posto.latitude floatValue], [posto.longitude floatValue]};

NSString *googleMapsURLString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%1.6f,%1.6f&daddr=%1.6f,%1.6f", start.latitude, start.longitude, end.latitude, end.longitude];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:googleMapsURLString]];
}

1 Ответ

2 голосов
/ 26 марта 2012

В calloutAccessoryControlTapped вы используете [locationManager location] сразу после вызова startUpdatingLocation.

. location обычно недоступен сразу после начала поиска текущего местоположения (и, если это так,это может быть ненадежным или устаревшим).

Когда location доступен, менеджер местоположения вызовет его метод делегата didUpdateToLocation, и вам нужно переместить весь код после startUpdatingLocation.

(даже в этомделегировать метод, возможно, было бы неплохо проверить, если newLocation равно nil, прежде чем использовать его. Иногда это происходит с представлением карты, пока он ожидает, когда пользователь предоставит разрешение на услуги определения местоположения (см. этот вопрос )).

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation];
}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    if (newLocation == nil)
    {
        NSLog(@"didUpdateToLocation: newLocation is nil");
        return;
    }

    //May want to check newLocation.horizontalAccuracy and 
    //newLocation.timestamp to see if the location is accurate 
    //enough for you.  If not, return and wait for a more 
    //accurate location (which may never come).

    //all the code currently after "startUpdatingLocation" goes here...
    CLLocation *location = [locationManager location];
    ...
}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"locationManager:didFailWithError: %@", error);
}

Возможно, вы также захотите внедрить didFailWithError для решения любой проблемы с получением местоположения или, по крайней мере, для его получения.

...