Aqui está a maneira oficial da 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];
}
Se você deseja obter instruções de direção ou caminhada para o local, pode incluir um mapItemForCurrentLocation
com o MKMapItem
na matriz +openMapsWithItems:launchOptions:
e definir as opções de inicialização adequadamente.
// 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];
}
Você pode preservar o iOS 5 original e o código inferior em uma else
declaração depois disso if
. Observe que, se você reverter a ordem dos itens na openMapsWithItems:
matriz, obterá instruções da coordenada para o seu local atual. Você provavelmente poderia usá-lo para obter direções entre dois locais, passando por um MKMapItem
item de mapa de localização construído em vez do atual. Eu não tentei isso.
Por fim, se você tiver um endereço (como uma sequência) para o qual deseja obter direções, use o geocoder para criar um MKPlacemark
, por meio de 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
.Encontrei a resposta para minha própria pergunta. A Apple documenta seu formato de URL de mapas aqui . Parece que você pode essencialmente substituir
maps.google.com
pormaps.apple.com
.Atualização: acontece o mesmo no MobileSafari no iOS 6; tocar em um link para
http://maps.apple.com/?q=...
abrir o aplicativo Maps com essa pesquisa, da mesma formahttp://maps.google.com/?q=...
que nas versões anteriores. Isso funciona e está documentado na página vinculada acima.UPDATE: Isso responde à minha pergunta relacionada ao formato do URL. Mas a resposta de nevan king aqui (veja abaixo) é um excelente resumo da API do Google Maps real.
fonte
A melhor maneira de fazer isso é chamar o novo método iOS 6 em
MKMapItem
openInMapsWithLaunchOptions:launchOptions
Exemplo:
Isso iniciará a navegação para dirigir a partir do local atual.
fonte
MKMapItem
quando tudo o que tenho é um endereço? Essa API parece um pouco complicada para esse caso de uso simples.Vejo que você encontrou o "esquema" do maps.apple.com. É uma boa escolha, pois ele redireciona automaticamente os dispositivos mais antigos para maps.google.com. Mas para o iOS 6, há uma nova classe que você pode aproveitar: MKMapItem .
Dois métodos que são do seu interesse:
fonte
init
MKMapItem
umMKPlacemark
, que você obtém fornecendo um par de latitude / longitude e um dicionário de endereço. Parece mais simples de abrirhttp://maps.apple.com/?q=1+infinite+loop+cupertino+ca
. Existe uma vantagem em usarMKMapItem
quando tudo o que você deseja fazer é mostrar um endereço no Google Maps?MKMapItem
caso ainda não tenha uma referência a uma que gostaria de usar. Basta usar o método de classe,+openMapsWithItems:launchOptions:
emMKMapItem
fazer a mesma coisa.MKMapItem
API e ela solta um ponto no mapa chamado "Local desconhecido". Existe uma maneira de fazê-lo exibir um nome para o local? Eu não vejo nenhum chaves para isso nas opções para o dicionário endereço ...Aqui está uma classe usando a solução de nevan king concluída em Swift:
fonte
Achei irritante que o uso da configuração do link http://maps.apple.com?q= ... abra o navegador safari primeiro em dispositivos mais antigos.
Portanto, para um dispositivo iOS 5 que abre seu aplicativo com uma referência a maps.apple.com, as etapas são:
Eu acho que as etapas 2 e 3 (muito óbvias e confusas) são irritantes para os usuários. Portanto, verifico a versão do sistema operacional e executo maps.google.com ou maps.apple.com no dispositivo (para as versões do SO iOS 5 ou iOS 6).
fonte
Minha pesquisa sobre esse assunto me levou às seguintes conclusões:
fonte
Se você deseja abrir o Google Maps (ou oferecer como opção secundária), use os esquemas
comgooglemaps://
ecomgooglemaps-x-callback://
URL documentados aqui .fonte
Antes de iniciar o URL, remova qualquer caractere especial do URL e substitua os espaços por +. Isso poupará algumas dores de cabeça:
fonte
// VKJ
fonte
Atualizado para o Swift 4 com base na resposta de @ PJeremyMalouf:
fonte
Não usando mapas, apenas programaticamente usando uma ação UiButton, isso funcionou muito bem para mim.
Você pode espalhar um pouco desse código. Por exemplo, eu coloquei a variável como variável de nível de classe, tive outra função para preenchê-la e, quando pressionada, o botão simplesmente pegava o que estava na variável e esfregava para ser usado em um URL.
fonte