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;
,