Вот официальный способ Apple:
// 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"];
// Pass the map item to the Maps app
[mapItem openInMapsWithLaunchOptions:nil];
}
Если вы хотите получить вождение или ходьбу инструкции к месту, вы можете включить mapItemForCurrentLocation
с MKMapItem
массивом в +openMapsWithItems:launchOptions:
, и установить параметры запуска правильно.
// 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 "Walking"
// Can use MKLaunchOptionsDirectionsModeDriving instead
NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeWalking};
// 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];
}
else
После этого вы можете сохранить исходный код iOS 5 и более низкий код в выписке if
. Обратите внимание, что если вы измените порядок элементов в openMapsWithItems:
массиве, вы получите направление от координаты к вашему текущему местоположению. Вы, вероятно, могли бы использовать его, чтобы получить направление между любыми двумя местоположениями, передавая построенный MKMapItem
вместо текущего элемента карты местоположения. Я не пробовал это.
Наконец, если у вас есть адрес (в виде строки), на который вы хотите направить маршрут, используйте геокодер для создания MKPlacemark
, посредством CLPlacemark
.
// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:@"Piccadilly Circus, London, UK"
completionHandler:^(NSArray *placemarks, NSError *error) {
// Convert the CLPlacemark to an MKPlacemark
// Note: There's no error checking for a failed geocode
CLPlacemark *geocodedPlacemark = [placemarks objectAtIndex:0];
MKPlacemark *placemark = [[MKPlacemark alloc]
initWithCoordinate:geocodedPlacemark.location.coordinate
addressDictionary:geocodedPlacemark.addressDictionary];
// Create a map item for the geocoded address to pass to Maps app
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:geocodedPlacemark.name];
// 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];
}];
}
currentLocationMapItem
.Нашел ответ на свой вопрос. Apple документирует формат URL своих карт здесь . Похоже , вы можете существенно заменить
maps.google.com
сmaps.apple.com
.Обновление: Оказывается, то же самое верно для MobileSafari на iOS 6; При нажатии на ссылку
http://maps.apple.com/?q=...
открывается приложение «Карты» с этим поиском, какhttp://maps.google.com/?q=...
и в предыдущих версиях. Это работает и задокументировано на странице, указанной выше.ОБНОВЛЕНИЕ: Это отвечает на мой вопрос, касающийся формата URL. Но здесь ответ Невана Кинга (см. Ниже) - это отличная сводка фактического API Карт.
источник
Лучший способ сделать это - вызвать новый метод iOS 6 на
MKMapItem
openInMapsWithLaunchOptions:launchOptions
Пример:
Это запустит навигацию для вождения из текущего местоположения.
источник
MKMapItem
когда у меня есть только адрес? Этот API кажется немного сложным для этого простого варианта использования.Я вижу, вы нашли "схему" URL-адреса maps.apple.com. Это хороший выбор, поскольку он автоматически перенаправляет старые устройства на maps.google.com. Но для iOS 6 есть новый класс, которым вы можете воспользоваться: MKMapItem .
Два метода, которые вас интересуют:
источник
init
MKMapItem
с помощьюMKPlacemark
пары широта / долгота и словаря адресов. Кажется проще просто открытьhttp://maps.apple.com/?q=1+infinite+loop+cupertino+ca
. Есть ли преимущество в использовании,MKMapItem
когда все, что вы хотите сделать, это показать адрес в Картах?MKMapItem
если у вас еще нет ссылки на тот, который вы хотели бы использовать. Просто используйте метод класса,+openMapsWithItems:launchOptions:
на ,MKMapItem
чтобы сделать то же самое.MKMapItem
API, и он отбрасывает точку на карте с надписью «Неизвестное местоположение». Есть ли способ заставить его отображать название места? Я не вижу ключей для этого в параметрах словаря адресов ...Вот класс, использующий решение Невана Кинга, выполненное в Swift:
источник
Меня раздражает, что использование ссылки http://maps.apple.com?q= ... открывает браузер Safari первым на старых устройствах.
Так что для устройства iOS 5, открывающего ваше приложение со ссылкой на maps.apple.com, шаги выглядят следующим образом:
Я думаю, что (очень очевидные и запутанные) шаги 2 и 3 раздражают пользователей. Поэтому я проверяю версию os и запускаю maps.google.com или maps.apple.com на устройстве (соответственно для версий ios 5 или ios 6).
источник
Мои исследования по этому вопросу привели меня к следующим выводам:
источник
Если вы хотите открыть Google Карты вместо этого (или предложить в качестве дополнительного варианта), вы можете использовать схемы URL
comgooglemaps://
иcomgooglemaps-x-callback://
URL, описанные здесь .источник
Перед запуском url удалите любой специальный символ из url и замените пробелы на +. Это избавит вас от головной боли:
источник
// VKJ
источник
Обновлен до Swift 4, основываясь на ответе @ PJeremyMalouf:
источник
Не используя карты, просто программно используя действие UiButton, это отлично сработало для меня.
Вы могли бы немного распространить этот код. Например, я поместил переменную как переменную уровня класса, заполнил ее другой функцией, а затем, когда нажал кнопку, просто взял то, что было в переменной, и очистил ее для использования в URL.
источник