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

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

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

Например:

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

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

Комментарии к вопросу (1)

До iOS 6

Для получения текущего местоположения необходимо использовать Core Location, но с помощью пары lat/long можно заставить Maps проложить маршрут от этого места до адреса улицы или местоположения. Например:

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 для явного поиска текущего местоположения и хотите вместо этого использовать @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@" url, то см. эту ссылку, которую я дал в комментариях ниже о том, как локализовать строку 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 doc:

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 (или Latest iOS).

Комментарии (12)
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 язык находится на английском языке. Если вы хотите поддержать другие языки, которые вы'll должны использовать локализованную строку, чтобы соответствовать карты имя закладки.

Комментарии (6)

Вы можете использовать препроцессор #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];
Комментарии (0)

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

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

Комментарии (3)

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

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

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

Комментарии (1)

Эй, так как в iOS6 вышла!

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

Яблоко'стартовала с карты и на устройствах под управлением iOS 6 Вы не должны использовать maps.google.com/?q= если вы хотите, чтобы чтения компакт-дисков, чтобы открыть приложение план. Теперь это будет maps.apple.com/?q=`.

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

Таким образом, мы разработчики просто должны переключить все строки запросов Google для яблок. Это то, что я не люблю много.

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

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

Просто используйте isiPad метод псевдо как логическое геттер и вы'повторно сделано, вы не будете конвертировать Google в Apple ;-)

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

Ура!

Комментарии (0)

Если вы Don'т хотим, чтобы попросить разрешения на месте, и Дон'Т есть лат и СПГ, используйте следующую.

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.рамки и MapKit с.рамки

Комментарии (0)

Для iOS6 в Apple документы рекомендуем использовать эквивалентную схему 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, карты : Ссылка схема Яблока УРЛ

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

Комментарии (1)

Настоящее решение может быть найдено здесь. Как 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]];
}
Комментарии (0)

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

Комментарии (0)

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

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

Используя 'текущее местоположение' Не'т, кажется, работают, так что я остался с координатами.

Antother хорошая вещь: Она'с обратная совместимость: устройства с iOS5, он запускает приложение "Google Карты".

Комментарии (0)

С текущей версией карт Google, просто не указывайте параметр Садра:

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

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

Комментарии (0)

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

Установить использование: под "и OpenInGoogleMaps"`в

Требуют в заголовке файла через: #импорт "и OpenInGoogleMapsController.ч"в

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

/*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];       
Комментарии (0)

Если вы Don'т предоставить информацию о местоположении источника, он будет принимать текущее местоположение в качестве источника. Попробовать ниже код-

пусть urlString = "http://maps.apple.com/maps?daddr=\(destinationLocation.latitude),\(destinationLocation.longitude)&dirflg=d" }

UIApplication.общая.openURL(url(строка: urlString)!)

Комментарии (0)

Я ответил на это в другом потоке. (Текущее местоположение не'т работать с Apple Карты в iOS 6). Вам нужно получить координаты текущего местоположения, а затем использовать его, чтобы создать URL-адрес карты.

Комментарии (0)