API Google Directions

Пытаюсь использовать Google Directions API в моем простом проекте. Но работа вернуть меня не удастся. Что с этим не так? Пример кода от Google на GitHub

В файле MDDirectionService.m у нас есть метод "setDirectionsQuery", но сегодня запрос google api имеет другую структуру. Я изменил запрос, чтобы использовать API KEY, но код не работает

static NSString *kMDDirectionsURL = @"https://maps.googleapis.com/maps/api/directions/json?";

    - (void)setDirectionsQuery:(NSDictionary *)query
                  withSelector:(SEL)selector
                  withDelegate:(id)delegate
    {
        NSArray *waypoints = query[@"waypoints"];
        NSString *origin = waypoints[0];
        int waypointCount = [waypoints count];
        int destinationPos = waypointCount - 1;
        NSString *destination = waypoints[destinationPos];
        NSString *key = @"my key";
        NSMutableString *url =
        [NSMutableString stringWithFormat:@"%@&origin=%@&destination=%@&key=%@",
         kMDDirectionsURL, origin, destination, key];
        if(waypointCount > 2) {
            [url appendString:@"&waypoints=optimize:true"];
            int wpCount = waypointCount-2;
            for(int i=1;i<wpCount;i++){
                [url appendString: @"|"];
                [url appendString:[waypoints objectAtIndex:i]];
            }
        }
        url = [[url
                stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding] mutableCopy];
        _directionsURL = [NSURL URLWithString:url];
        [self retrieveDirections:selector
                    withDelegate:delegate];
    }

в вызове метода файла ViewController.m в func "didTapAtCoordinate"

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:
                (CLLocationCoordinate2D)coordinate {

  CLLocationCoordinate2D position = CLLocationCoordinate2DMake(
                                    coordinate.latitude,
                                    coordinate.longitude);
  GMSMarker *marker = [GMSMarker markerWithPosition:position];
  marker.map = mapView_;
  [waypoints_ addObject:marker];
  NSString *positionString = [[NSString alloc] initWithFormat:@"%f,%f",
                              coordinate.latitude,coordinate.longitude];
    [waypointStrings_ addObject:positionString];
  if([waypoints_ count]>1){
    NSString *sensor = @"false";
    NSArray *parameters = [NSArray arrayWithObjects:sensor, waypointStrings_,
                           nil];
    NSArray *keys = [NSArray arrayWithObjects:@"sensor", @"waypoints", nil];
    NSDictionary *query = [NSDictionary dictionaryWithObjects:parameters
                                                      forKeys:keys];
    MDDirectionService *mds=[[MDDirectionService alloc] init];
    SEL selector = @selector(addDirections:);
    [mds setDirectionsQuery:query
               withSelector:selector
               withDelegate:self];
  }
}

Как мне нужно изменить этот код, для правильной работы

NSDictionary *query = @{ @"sensor" : @"false", @"waypoints" : self.waypointStrings };
        DirectionService *mds = [[DirectionService alloc] init];
        SEL selector = @selector(addDirections:);
        [mds setDirectionsQuery:query
                   withSelector:selector
                   withDelegate:self];

Когда я пытаюсь использовать его, есть ошибка в этом коде:

-(void)addDirections:(NSDictionary *)json
{

    NSDictionary *routes = [json objectForKey:@"routes"][0];
    NSDictionary *route = [routes objectForKey:@"overview_polyline"];
    NSString *overview_route = [route objectForKey:@"points"];
    GMSPath *path = [GMSPath pathFromEncodedPath:overview_route];
    GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
    polyline.map = self.mapView;
}

С сообщением об ошибке вроде:

вы нажали на -73.254689, 40.840717

вы нажали на -73.253745, 40.837211

* Завершение работы приложения из-за невыполненной исключительной ситуации 'NSRangeException', причина: '* - [__ NSArray0 objectAtIndex:]: индекс 0 выходит за границы для пустого NSArray' *** Стек первого вызова вызова:

1 ответ

Исходя из этого потока SO, вы получаете сообщение об ошибке NSRangeException, потому что вы пытаетесь получить доступ к массиву [0] для пустого массива NSArray.

Это может быть вызвано отключением одной ошибкой.

Эта тема также может помочь.

Код предполагает, что response В массиве всегда есть хотя бы один элемент. Это прерывается, когда массив пуст, поэтому вам нужно добавить код для проверки:

NSArray *response = [responseObject objectForKey:@"results"];
if (response.count == 0) {
    // Continue loading more data:
    [self loadLatLong];
    return;
}
NSDictionary *geo = [response[0] objectForKey:@"geometry"];

Это разбилось, потому что response не имеет никакого объекта Вы должны проверить это перед звонком response[0], Что-то вроде этого if ([response count] == 0) return;,

Другие вопросы по тегам