Cómo invocar iPhone Maps para obtener direcciones con la ubicación actual como dirección de inicio

votos
72

Sé que es posible iniciar la aplicación de mapas de iPhone llamando openURLa una URL de Google Maps con parámetros saddry daddrcon cadenas de ubicación o Lat / Long (ver ejemplo a continuación).

Pero me pregunto si es posible hacer que la dirección de inicio sea el marcador de mapas Ubicación actual para que pueda usar el código de manejo de ubicación de la aplicación Mapas . Mi búsqueda en Google ha sido bastante infructuosa.

Por ejemplo:

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

Excepto con algo para invocar el marcador de ubicación actual en lugar de myLatLong.

Publicado el 23/02/2009 a las 08:11
fuente por usuario
En otros idiomas...                            


16 respuestas

votos
133

Pre iOS 6

Necesita utilizar Core Location para obtener la ubicación actual, pero con ese par lat / long, puede hacer que Maps lo dirija desde allí, a una dirección o ubicación. Al igual que:

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]];

Finalmente, si desea evitar el uso de CoreLocation para encontrar explícitamente la ubicación actual, y desea utilizar la @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"url en su lugar, consulte este enlace que proporcioné en los comentarios a continuación sobre cómo localizar la cadena Current + Location . Sin embargo, está aprovechando otra característica no documentada, y como señala Jason McCreary a continuación, es posible que no funcione de manera confiable en versiones futuras.


Actualización para iOS 6

Originalmente, Maps usaba mapas de Google, pero ahora, Apple y Google tienen aplicaciones de mapas por separado.

1) Si desea enrutar usando la aplicación Google Maps, use el esquema de URL de comgooglemaps :

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

2) Para usar Apple Maps, puedes usar la nueva MKMapItemclase para iOS 6. Ver los documentos de la API de Apple aquí

Básicamente, usarás algo como esto, si enrutas a las coordenadas de destino ( 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];

Para admitir iOS 6+ y pre iOS 6 en el mismo código, recomendaría utilizar algo como este código que Apple tiene en la MKMapItempágina de documentación de la API:

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

Esto supondría que su Xcode Base SDK es iOS 6 (o Último iOS ).

Respondida el 08/06/2009 a las 10:49
fuente por usuario

votos
21
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];

Esto funciona, pero sólo cuando el idioma iPhone / iPod está configurado en Inglés. Si quieres apoyar a otros idiomas que tendrá que utilizar una cadena localizada para que coincida con el nombre del marcador Maps.

Respondida el 01/12/2010 a las 11:05
fuente por usuario

Respondida el 01/11/2010 a las 15:46
fuente por usuario

votos
10

Puede utilizar un preprocesador #define como:

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

para entender su versión de IOS. Entonces, puedo utilizar este código para apoyar a iOS 6, también:

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];
Respondida el 30/09/2012 a las 10:51
fuente por usuario

votos
5

Debido al sandboxing, no tiene acceso a los marcadores de la aplicación Map.

En su lugar, use Core Location para determinar la ubicación actual usted mismo. Luego use esa ubicación (lat y long) en la URL que construye para abrir Maps.

Respondida el 23/02/2009 a las 16:07
fuente por usuario

votos
4

Te recomiendo que compruebes CMMapLauncher , una mini-biblioteca que he construido para lanzar Apple, Google y otras aplicaciones de mapeo de iOS con una solicitud de asignación específica. Con CMMapLauncher, el código para obtener las direcciones en su pregunta sería:

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

Como se puede ver, también encapsula verificaciones requeridas entre la versión iOS 6 y otros.

Respondida el 07/09/2013 a las 13:37
fuente por usuario

votos
3

Hey ya iOS6 está fuera!

Apple hizo algo notable en un mal camino (desde mi punto de vista).

Los mapas de Apple se ponen en marcha y para dispositivos con iOS 6 no se debe utilizar maps.google.com/?q=si desea que el iDevice para abrir la aplicación del Plan nativa. Ahora bien, sería maps.apple.com/?q=.

Para que los desarrolladores no tienen que mucho trabajo, el servidor redirige maps.apple.com usar todos los dispositivos no son de Apple a maps.google.com por lo que el cambio es transparente.

De esta manera nosotros los desarrolladores de sólo tienen que cambiar todas las cadenas de Google consulta a los manzanos. Esto es lo que me gusta mucho.

Tenía que poner en práctica esa Funcionalidad hoy así que lo hice. Pero sentí que no sólo debería reescribir cada url acostado en la página web móvil para apuntar servidor de mapas de Apple, así que pensé que acababa de detectar iDevices del lado del servidor y servir direcciones URL de manzana sólo para ellos. Pensé que me gustaría compartir.

Estoy usando PHP, así que utiliza el código abierto móvil Detectar biblioteca: http://code.google.com/p/php-mobile-detect/

Sólo tiene que utilizar el isiPadmétodo de pseudo como un captador de Boole y ya está, usted no convertir Google en manzana ;-)

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

¡Aclamaciones!

Respondida el 21/09/2012 a las 18:57
fuente por usuario

votos
2

Si no quiera pedir permisos de ubicación y no tienen el lat y lng, utilice la siguiente.

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]];
}

Para IOS5, la ubicación actual tiene que estar en el idioma correcto. Yo uso el LocalizedCurrentLocation de este post http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

Para iOS6, utilizo el CLGeocoder para obtener la marca de posición y abra el mapa con ella y la ubicación actual.

Recuerde agregar CoreLocation.framework y MapKit.framework

Respondida el 06/12/2012 a las 13:14
fuente por usuario

votos
2

Para iOS6 los documentos manzana recomiendan usar el esquema de URL equivalente maps.apple.com

a fin de utilizar

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

en lugar de

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

para ser compatible con versiones anteriores del código sería

    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]];

hay toda una carga de otros parámetros admitidos para el esquema de URL Apple Maps: Manzana URL Esquema de Referencia

puede utilizar estas macros de detección de versión de iOS si tiene código condicional en otras partes de su código. macros versión de IOS

Respondida el 20/09/2012 a las 11:53
fuente por usuario

votos
2

La verdadera solución se puede encontrar aquí. Conceptos Z5 iOS Desarrollo Fragmento de código

Sólo requiere un poco de codificación.

- (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]];
}
Respondida el 02/06/2012 a las 17:51
fuente por usuario

votos
2

Puede hacer esto ahora en html sólo desde una dirección URL en su dispositivo móvil solamente. He aquí un ejemplo . Lo interesante es que puede convertir esto en un código QR que tiene una forma de alguien que consigue direcciones para que desde cualquier lugar con sólo escanearlo en su teléfono.

Respondida el 27/05/2010 a las 00:34
fuente por usuario

votos
1

Mi sugerencia sería utilizar OpenInGoogleMaps-IOS ya que es una opción hasta la fecha (noviembre de 2015), es compatible con la instalación vainas de cacao y ya está listo para ir en unos pocos clics.

Instalar usando: pod "OpenInGoogleMaps"

Exigir en el archivo de cabecera usando: #import "OpenInGoogleMapsController.h"

Código de ejemplo a continuación:

/*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];       
Respondida el 10/11/2015 a las 10:35
fuente por usuario

votos
1

Con la versión actual de Google Maps, simplemente omitir el sadrparámetro:

saddr: ... Si el valor se deja en blanco, se utilizará la ubicación actual del usuario.

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

Respondida el 15/12/2013 a las 19:30
fuente por usuario

votos
1

Para iOS6 aplicación Mapas, sólo puede utilizar la misma URL publicado anteriormente http://maps.google.com/maps?saddr=%f,%f&daddr=%@

pero en lugar de la URL mapas de Google, utiliza la dirección URL con maps://lo que resulta en la siguiente URL:maps://saddr=%f,%f&daddr=%@.

El uso de 'Ubicación actual' no parece funcionar, así que me quedé con las coordenadas.

Antother Lo bueno: Es compatible con versiones anteriores: En iOS5, que pone en marcha la aplicación de Google Maps.

Respondida el 13/09/2012 a las 13:21
fuente por usuario

votos
0

Si usted no proporciona la ubicación de origen, que tomará la ubicación actual como fuente. Pruebe a continuación código-

dejar que urlString = " http://maps.apple.com/maps?daddr=(destinationLocation.latitude),(destinationLocation.longitude)&dirflg=d "}

UIApplication.shared.openURL (URL (cadena: urlString))

Respondida el 18/09/2017 a las 09:06
fuente por usuario

votos
0

Respondí esto en un hilo diferente. ( Ubicación actual no funciona con Apple Mapas de IOS 6 ). Que necesita para obtener las coordenadas de la ubicación actual en primer lugar, a continuación, utilizarlo para crear el mapa url.

Respondida el 11/01/2013 a las 06:37
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more