Как вызывать Карты iPhone для маршрутов с текущим местоположением в качестве начального адреса

Я знаю, что можно запустить приложение iPhone maps, вызвав openURL на URL-адрес карты Google с параметрами saddr и daddr с строками местоположения или Lat/Long (см. пример ниже).

Но мне интересно, можно ли задать начальный адрес в качестве закладки "Текущее местоположение" , чтобы я мог использовать код обработки местоположения приложения Карты. Мой поиск в Google был довольно бесплодным.

Например:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@", myLatLong, latlong]]];

За исключением того, чтобы вызвать текущую закладку местоположения вместо myLatLong.

Ответ 1

Пред iOS 6

Вам нужно использовать Базовое местоположение, чтобы получить текущее местоположение, но с этой широтой/длинной парой вы можете получить Карты, чтобы направить вас оттуда, к адресу или адресу улицы. Вот так:

CLLocationCoordinate2D currentLocation = [self getCurrentLocation];
// this uses an address for the destination.  can use lat/long, too with %f,%f format
NSString* address = @"123 Main St., New York, NY, 10001";
NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%f,%f&daddr=%@",
                    currentLocation.latitude, currentLocation.longitude,
                    [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

Наконец, если вы не хотите использовать CoreLocation для явного нахождения текущего местоположения и хотите использовать вместо этого URL-адрес @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@", посмотрите эта ссылка, которую я предоставил в комментариях ниже, как локализовать строку Current + Location. Однако вы пользуетесь другой недокументированной функцией, и, как отмечает Джейсон МакКрири ниже, она может не работать надежно в будущих выпусках.


Обновление для iOS 6

Первоначально Карты использовали карты Google, но теперь у Apple и Google есть отдельные приложения для карт.

1) Если вы хотите выполнить маршрутизацию с помощью приложения Google Maps, используйте схему URL-адреса comgooglemaps:

NSString* url = [NSString stringWithFormat: @"comgooglemaps://?daddr=%@&directionsmode=driving",
                    [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
BOOL opened = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

2) Чтобы использовать Apple Maps, вы можете использовать новый класс MKMapItem для iOS 6. См. Документацию Apple API здесь

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

    MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate: latlong 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+ и предыдущую iOS 6 в одном и том же коде, я бы рекомендовал использовать что-то вроде этого кода, который есть у Apple на MKMapItem документации API MKMapItem:

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

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

Ответ 2

NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=Current Location&saddr=%@",startAddr];
NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
[url release];

Это работает, но только когда язык iPhone/iPod установлен на английском языке. Если вы хотите поддерживать другие языки, вам нужно будет использовать локализованную строку в соответствии с именем закладки Карты.

Ответ 4

Вы можете использовать препроцессор #define, например:

#define SYSTEM_VERSION_LESS_THAN(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

чтобы понять вашу версию iOS. Затем я могу использовать этот код для поддержки iOS 6:

NSString* addr = nil;
if (SYSTEM_VERSION_LESS_THAN(@"6.0")) {
   addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
} else {
   addr = [NSString stringWithFormat:@"http://maps.apple.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
}

NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];

Ответ 5

Из-за песочницы вы не имеете доступа к закладкам приложения Карты.

Вместо этого используйте Core Location, чтобы определить текущее местоположение самостоятельно. Затем используйте это местоположение (lat и long) в URL-адресе, который вы создаете, чтобы открыть Карты.

Ответ 6

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

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

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

Ответ 7

Эй, поскольку iOS6 не работает!

Apple сделала что-то замечательное плохо (с моей точки зрения).

Карты Apple запущены, а для устройств под управлением iOS 6 вам не следует использовать maps.google.com/?q=, если вы хотите, чтобы iDevice открывал собственное приложение Plan. Теперь это будет maps.apple.com/?q=.

Чтобы разработчикам не приходилось много работать, дружественный сервер maps.apple.com перенаправляет все устройства, отличные от Apple, на maps.google.com, поэтому изменение прозрачно.

Таким образом, разработчикам просто нужно переключить все строки запросов google на Apple. Это то, что мне не нравится.

Мне пришлось реализовать эту функцию сегодня, поэтому я сделал это. Но я чувствовал, что не должен просто переписывать каждый URL-адрес, лежащий на мобильном веб-сайте, для целевого сервера Apple maps, поэтому я решил, что просто обнаружил сервер iDevices и подал бы яблочные URL-адреса только для них. Я думал, что поделюсь.

Я использую PHP, поэтому я использовал библиотеку Mobile Detect с открытым исходным кодом: http://code.google.com/p/php-mobile-detect/

Просто используйте псевдо-метод isiPad как булевский getter, и вы закончили, вы не конвертируете google в apple; -)

$server=$detect->isiPad()?"apple":"google";
$href="http://maps.{$server}.com/?q=..."

Ура!

Ответ 8

Вы можете сделать это сейчас в html только с URL-адреса вашего мобильного устройства. Здесь пример. Самое интересное, если вы превратите это в код qr, у вас есть способ получить от вас указания, где бы они ни находились, сканируя их на своем телефоне.

Ответ 9

Реальное решение можно найти здесь. Концепции Z5 Фрагмент кода разработки iOS

Это просто требует немного кодирования.

- (IBAction)directions1_click:(id)sender
{
    NSString* address = @"118 Your Address., City, State, ZIPCODE";
    NSString* currentLocation = @"Current Location";
    NSString* url = [NSStringstringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@",[currentLocation stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    UIApplication *app = [UIApplicationsharedApplication];
    [app openURL: [NSURL URLWithString: url]];
}

Ответ 10

Для iOS6 в яблочных документах рекомендуется использовать эквивалентную схему 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]];

существует целая нагрузка других поддерживаемых параметров для схемы URL-адресов Apple Maps: Ссылка на URL-адрес Apple

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

Ответ 11

Если вы не хотите запрашивать разрешения на размещение и не имеете lat и lng, используйте следующее.

NSString *destinationAddress = @"Amsterdam";

Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:destinationAddress completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count] > 0) {

            MKPlacemark *placeMark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];

            MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:placeMark];

            MKMapItem *mapItem2 = [MKMapItem mapItemForCurrentLocation];


            NSArray *mapItems = @[mapItem, mapItem2];

            NSDictionary *options = @{
        MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,
        MKLaunchOptionsMapTypeKey:
            [NSNumber numberWithInteger:MKMapTypeStandard],
        MKLaunchOptionsShowsTrafficKey:@YES
            };

            [MKMapItem openMapsWithItems:mapItems launchOptions:options];

        } else {
            //error nothing found
        }
    }];
    return;
} else {

    NSString *sourceAddress = [LocalizedCurrentLocation currentLocationStringForCurrentLanguage];

    NSString *urlToOpen = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=%@&daddr=%@",
                 [sourceAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                 [destinationAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

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

Для ios5 текущее местоположение должно быть на правильном языке. Я использую LocalizedCurrentLocation из этого сообщения http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

Для ios6 я использую CLGeocoder, чтобы получить метку, а затем открыть карту с ней и текущее местоположение.

Не забудьте добавить CoreLocation.framework и MapKit.framework

Ответ 12

Для приложения iOS6 Maps вы можете использовать тот же URL-адрес, указанный выше http://maps.google.com/maps?saddr=%f,%f&daddr=%@

но вместо URL карты Google вы используете URL-адрес с maps://, в результате получится следующий URL-адрес: maps://saddr=%f,%f&daddr=%@.

Использование "Current Location" не работает, поэтому я остался с координатами.

Antother хорошая вещь: она обратно совместима: на iOS5 он запускает приложение Google Maps.

Ответ 13

В текущей версии Google Maps просто опустите параметр sadr:

saddr:... Если значение оставлено пустым, будет использоваться текущее местоположение пользователей.

https://developers.google.com/maps/documentation/ios/urlscheme

Ответ 14

Мое предложение будет использовать OpenInGoogleMaps-iOS, поскольку это современный выбор (к ноябрю 2015 года), он поддерживает cocoa pods и вы готовы пойти за несколько кликов.

Установите с помощью: pod "OpenInGoogleMaps"

Требовать в файле заголовка, используя: #import "OpenInGoogleMapsController.h"

Пример кода ниже:

/*In case the user does NOT have google maps, then apple maps shall open*/
[OpenInGoogleMapsController sharedInstance].fallbackStrategy = kGoogleMapsFallbackAppleMaps;    

/*Set the coordinates*/
GoogleMapDefinition *definition = [[GoogleMapDefinition alloc] init];   
CLLocationCoordinate2D metsovoMuseumCoords;     //coordinates struct
metsovoMuseumCoords.latitude = 39.770598;
metsovoMuseumCoords.longitude = 21.183215;
definition.zoomLevel = 20;
definition.center = metsovoMuseumCoords;        //this will be the center of the map

/*and here we open the map*/
[[OpenInGoogleMapsController sharedInstance] openMap:definition];