Открытие карт с текущим местоположением и направлениями в iOS 6

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

- (id)resolveDirectionsFromCoordinate:(CLLocationCoordinate2D)startCoordinate toCoordinate:(CLLocationCoordinate2D)endCoordinate
{
    NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f",
                 startCoordinate.latitude, startCoordinate.longitude,
                 endCoordinate.latitude, endCoordinate.longitude];
    [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

    return nil;
}

Thos хорошо работает в iOS 5.x. Однако в iOS 6 это приводит к появлению Safari, поскольку Карты больше не используют Карты Google.

Кто-нибудь знает, какой URL я должен позвонить в iOS 6?

Ответ 1

Apple Documentation рекомендует использовать эквивалентную схему URL-адресов maps.apple.com

поэтому используйте

http://maps.apple.com/maps?saddr=%f,%f&daddr=%f,%f

вместо

http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f

для обратной совместимости ваш код будет

    NSString* versionNum = [[UIDevice currentDevice] systemVersion];
    NSString *nativeMapScheme = @"maps.apple.com";
    if ([versionNum compare:@"6.0" options:NSNumericSearch] == NSOrderedAscending){
        nativeMapScheme = @"maps.google.com";
    }
    NSString* url = [NSString stringWithFormat: @"http://%@/maps?saddr=%f,%f&daddr=%f,%f", nativeMapScheme startCoordinate.latitude, startCoordinate.longitude,
                 endCoordinate.latitude, endCoordinate.longitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; 

В качестве альтернативы вы также можете использовать схему maps://saddr=%f,%f&daddr=%f,%f, но она не поддерживает полный диапазон параметров.

Ответ 2

Использовать метод + (BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)launchOptions. Из Ссылка на класс MKMapItem:

Этот метод используется для передачи одного или нескольких элементов карты в приложение "Карты". Например, вы можете использовать этот метод, чтобы попросить приложение "Карты" отобразить результаты поиска на основе местоположения, созданные вашим приложением. Карты отображают контакты в каждом указанном вами месте и используют содержимое каждого объекта элемента карты для отображения дополнительной информации.

Ответ 3

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass     respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) 
{
    // Create an MKMapItem to pass to the Maps app
    CLLocationCoordinate2D coordinate = 
                CLLocationCoordinate2DMake(16.775, -3.009);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate 
                                        addressDictionary:nil];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem setName:@"My Place"];

    // Set the directions mode to "Driving"
    // Can use MKLaunchOptionsDirectionsModeWalking instead
    NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey :   MKLaunchOptionsDirectionsModeDriving };
    // Get the "Current User Location" MKMapItem
    MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];
   // Pass the current location and destination map items to the Maps app
   // Set the direction mode in the launchOptions dictionary
   [MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] 
                launchOptions:launchOptions];
   }

Вот и все:)

Ответ 4

Я рекомендую проверить CMMapLauncher, мини-библиотеку, которую я создал для запуска приложений Apple, Google и других приложений для сопоставления iOS. конкретный запрос сопоставления. С CMMapLauncher код для получения указаний в вашем вопросе будет следующим:

[CMMapLauncher launchMapApp:CMMapAppAppleMaps
          forDirectionsFrom:[CMMapPoint mapPointWithName:@"Origin"
                                              coordinate:startCoordinate]
                         to:[CMMapPoint mapPointWithName:@"Destination"
                                              coordinate:endCoordinate]];

Как вы можете видеть, он также инкапсулирует проверку версий, требуемую между iOS 6 и другими.