Откройте приложение «Карты» из кода - Где / Как найти «Текущее местоположение»? - PullRequest
7 голосов
/ 04 января 2011

Я открываю приложение "Карты", чтобы показать направления от текущего местоположения пользователя до координаты пункта назначения из моего кода.Я использую следующий код, чтобы открыть приложение Карты.Я вызываю этот код при нажатии кнопки.getCurrentLocation - это метод, который возвращает недавно обновленное местоположение.

- (void)showDirectionsToHere {

    CLLocationCoordinate2D currentLocation = [self getCurrentLocation];  // LINE 1
    NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f", 
                                                  currentLocation.latitude,
                                                  currentLocation.longitude, 
                                                  destCoordinate.latitude, 
                                                  destCoordinate.longitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}

Здесь [self getCurrentLocation] in LINE 1 использует CLLocationManager для определения текущего местоположения и возвращает значение.

Примечание : я еще не реализовал код в LINE1 .Я только что планировал сделать это таким образом.

Мои вопросы:

  1. Является ли это хорошей практикой для расчета текущего местоположения во время вызова приложения Карты?
  2. Будет ли [self getCurrentLocation] возвращать текущее местоположение до вызова openURL?
  3. Нужно ли определять текущее местоположение задолго до открытия приложения "Карты"?

Я немного запутался в этих вещах.Пожалуйста, ведите меня.Спасибо.

Ответы [ 4 ]

11 голосов
/ 04 января 2011

Вам не нужно самим определять текущее местоположение пользователя, приложение «Карты» позаботится об этом.

Вместо передачи пары широта / долгота вы можете передать Current%%20Location, и приложение «Карты» определит текущее местоположение пользователя.

%20 является символом пробела в кодировке URL, а дополнительный % экранирует фактический %, поэтому он не будет интерпретироваться как замена формата.


Спасибо @ Carlos P за указание на мою грубую ошибку в исходном ответе.

7 голосов
/ 08 февраля 2011

Использование «Текущего местоположения» в качестве saddr работает только в том случае, если пользователь установил системный язык на английский.Наилучший вариант - получить текущую позицию из основного местоположения и использовать ее как saddr.

5 голосов
/ 04 мая 2011

Как указал pazustep, «Текущее местоположение» работает только для английского языка. Например, в итальянском языке правильной строкой является «Posizione attuale».

Обнюхивание прошивки iPhone Я обнаружил все переводы "Текущее местоположение" и написал класс, который предоставляет правильную строку, необходимую для любого (в настоящее время) поддерживаемого языка.

В моем блоге есть пост об этом (включая исходный код): http://www.martip.net/blog/localized-current-location-string-for-iphone-apps.

2 голосов
/ 22 сентября 2012

Вы можете использовать новый класс MKMapItem для iOS 6. См. Документы Apple API здесь

В принципе, вы будете использовать что-то подобное, если будете направлять к месту назначения координаты (destCoordinate):

    MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate: destCoordinate addressDictionary: nil];
    MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark: place];
    destination.name = @"Name Here!";
    NSArray* items = [[NSArray alloc] initWithObjects: destination, nil];
    NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:
                                 MKLaunchOptionsDirectionsModeDriving, 
                                 MKLaunchOptionsDirectionsModeKey, nil];
    [MKMapItem openMapsWithItems: items launchOptions: options];

Чтобы поддерживать iOS 6+ и pre iOS 6 в одном коде, я бы рекомендовал использовать что-то вроде этого кода, который Apple имеет наMKMapItem Страница документации API:

Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
   // iOS 6 MKMapItem available
} else {
   // use pre iOS 6 technique
}

Предполагается, что ваш SDK Xcode Base - это iOS 6 (или Последняя версия iOS ).

В этомдругой ответ, я предлагаю надежную технику для iOS 5.1 и ниже

...