Sé que es posible iniciar la aplicación mapas del iPhone llamando openURL en un google maps URL con parámetros saddr y daddr con la ubicación de las cadenas o Lat/Long (ver ejemplo a continuación).

Pero me pregunto si es posible hacer que la dirección de inicio será el «Ubicación Actual» mapas marcador para que pueda utilizar el Mapas de la aplicación de la ubicación de código de control. Mi búsqueda de Google ha sido bastante infructuoso.

Por ejemplo:

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

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

  • Estoy tratando de hacer esta misma funcionalidad exacta y tengo los mapas de carga bien con el destino, sin embargo, cuando me carga los mapas de google me da la última lectura del GPS, incluso si es de horas o días de la fecha. A veces me da la ubicación de las lecturas que están a una milla o más… ¿Cómo puedo recibir información precisa de la Ubicación Actual de las lecturas? Me estoy perdiendo algo con CoreLocation la exactitud? thx
InformationsquelleAutor eriaac | 2009-02-23

16 Comentarios

  1. 133

    Pre iOS 6

    Que usted necesita para utilizar Core Ubicación para obtener la ubicación actual, pero con la lat/long par, usted puede obtener los Mapas de ruta desde allí, a la dirección de una calle o localidad. Así:

    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 se desea evitar el uso de CoreLocation explícitamente encontrar la ubicación actual, y desea utilizar el @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@" url lugar, a continuación, ver en este enlace que he proporcionado en la sección de comentarios de abajo de cómo localizar la Actual+Ubicación cadena. Sin embargo, se están aprovechando de otro indocumentados característica, y como Jason McCreary señala a continuación, puede no funcionar de forma fiable en futuras versiones.


    Actualización para iOS 6

    Originalmente, Mapas utiliza los mapas de Google, pero ahora, Apple y Google han separado de las aplicaciones de mapas.

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

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

    2) el uso De Mapas de Apple, puede utilizar la nueva MKMapItem clase para iOS 6. Ver la Manzana de la API docs aquí

    Básicamente, usted tendrá que usar algo como esto, si el enrutamiento de destino coordenadas (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];

    Con el fin de apoyar tanto a iOS 6+ y pre iOS 6 en el mismo código, me gustaría recomendar el uso de algo como este código que Apple tiene en el MKMapItem API doc página:

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

    Esto sería asumir que su Xcode Base SDK de iOS 6 (o más Reciente de iOS).

    • Esto es más complicado de lo necesario. Véase la respuesta de @bob debajo de donde se pasa «Actual+Ubicación» como un parámetro
    • Si alguien puede averiguar cómo obtener la Ubicación Actual y el trabajo como un parámetro en el iPad, me venden!!
    • En realidad, Willster .. no es más complicada de lo necesario. Mira la fecha de este hilo. No hubo OS 4.0. En 3.x, usted necesita para pasar en las coordenadas. Como Joe alude, todavía tienes un montón de iPads todavía en 3.2, por no hablar de un iPod touch, o iphone, donde los usuarios simplemente no se consigue en torno a la actualización. Además, existe el problema de la localización. Si el usuario no utiliza el inglés, Actual+Ubicación no funciona. Por lo tanto, si usted quiere que su solución sea sólida, es necesario pasar de las coordenadas.
    • Consulte stackoverflow.com/questions/4590972/… por la parte acerca de la localización.
    • «Sabes, creo que he aprendido algo hoy.» Abrazar las coordenadas. 🙂
    • Lo siento- @Nate: estás en lo correcto. La Actual+Ubicación técnica no es robusto. Esta solución es probablemente el mejor.
    • Parece que alguien tuvo la amabilidad de publicar una lista de los localizados en los equivalentes de «+Location». (martip.net/blog/…) por Lo tanto, que parte de ahora puede ser un problema menor.
    • Aunque Current+Location trabajado antes, esto ya no parece funcionar en iOS 5.1.1.
    • gracias por la actualización. Estoy de acuerdo en que mantenerse alejado de Current+Location parece más robusto, especialmente debido a que el código de obtener sólo la lat/long ubicación actual de CLLocationManager, o MKMapView no es muy complicado. He actualizado mi respuesta con tu comentario!
    • 5.1.1 aquí (4S), funciona bien.
    • podemos añadir una anotación de dirección/ubicación mientras que la apertura de este mapa.
    • por favor utilice la Pregunta botón para hacer una nueva pregunta. Las secciones de comentarios no son para nuevas preguntas. Gracias.

  2. 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 iPhone/iPod idioma está configurado en inglés. Si usted desea apoyar a otros idiomas, usted tendrá que usar una cadena localizada para que coincida con los Mapas nombre del marcador.

    • A mi me funciona en el iPhone, pero no en el iPad. En el último caso me acaban de iniciar en el Actual, MO. 🙁
    • No tengo un iPad a prueba de eso, pero ¿cuál es el nombre de un marcador de posición actual en el iPad app de Mapas ?
    • En inglés americano (por lo menos), se muestra como «Ubicación Actual» … a menos que ya establecer como inicio/extremo … entonces es ausente de la lista de marcadores.
    • Qué lástima que necesita traducir …estoy seguro de que hay un código especial, pero que …
    • Aunque funcionó antes, esto ya no parece funcionar en iOS 5.1.1.
    • podemos establecer nombre de destino así?

  3. 11

    Esto funciona en el iPhone:

    http://maps.google.com/maps?saddr=Current Ubicación&daddr=123 Main St,Ottawa,ON

    • Usted tiene que codificar los espacios, pero sí, esto funciona. ver aquí: stackoverflow.com/questions/4590972/…
    • Funciona muy bien en el iPhone! En el iPad me administrar a la tierra en – no estoy bromeando – Actual, MO. 😮
    • esto no funciona. acabo de probar en mi iphone (4.2.6). docs decir que debería, pero no
    • Uso «Actual+de Ubicación» en su lugar. Trabajó para mí.
    • Esta solución sólo funciona si el usuario ha establecido su teléfono idioma inglés.
    • Usted no puede tener espacios en la dirección, tienen que ser codificados

  4. 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. A continuación, puede utilizar este código para apoyar a iOS 6, y 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];
  5. 5

    Porque de sandboxing, usted no tiene acceso a la aplicación de Mapas favoritos.

    Su lugar, utilice el Núcleo de Localización para determinar la ubicación actual a ti mismo. A continuación, utilice esa ubicación (lat y long) en la URL que construir para abrir la aplicación Mapas.

    • Yo no puedo ver cómo sandboxing sería relevante para pedir Mapas para utilizar la Ubicación Actual. Esto es una tontería respuesta.
    • Creo que la respuesta se refiere al hecho de que «Ubicación Actual» es uno de los favoritos en la aplicación de Mapas, y que las aplicaciones no tienen acceso a los marcadores. No es una tontería, sólo falta esa conexión.
    • Sospecho que el uso de «Ubicación Actual» (o el URI-codificado variante) es equivalente a un «accidente feliz» en el iPhone/iPod touch, en que sólo pasa a trabajar a pesar de sí mismo. (Que no es I18N a cuenta es suficiente para convencerme de – palo con coordenadas!)
  6. 4

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

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

    Como se puede ver, también encierra la comprobación de la versión necesaria entre iOS 6 & otros.

    • Realmente útil. Muy bien hecho. Bien hecho chicos
  7. 3

    Hola desde iOS6 está!

    Apple hizo algo extraordinario en una mala manera (desde mi punto de vista).

    De Apple mapas están en marcha y para los dispositivos que ejecutan iOS 6 usted no debe usar maps.google.com/?q= si desea que el iDevice para abrir el nativo Plan de aplicación. Ahora sería maps.apple.com/?q=.

    Para que los desarrolladores no tienen mucho trabajo, el ambiente agradable maps.apple.com servidor redirige todos los no-dispositivos de Apple a maps.google.com así que el cambio es transparente.

    De esta manera nos desarrolladores sólo tienen que cambiar todos los servicios de google cadenas de consulta para apple.
    Esto es lo que no me gusta mucho.

    Tuve que implementar que functionnality de hoy, así que lo hizo. Pero yo sentía que no sólo debe reescribir cada url de la mentira en el sitio móvil de destino de Apple mapas del servidor, así que pensé que acababa de detectar los iDevices en el lado del servidor y servir de apple url sólo para aquellos. Pensé que me gustaría compartir.

    Estoy usando PHP así que he usado el opensource Móvil Detectar biblioteca : http://code.google.com/p/php-mobile-detect/

    Solo uso el isiPad pseudo método como un valor booleano getter y ya está, no te los vas a convertir google en apple 😉

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

    Saludos!

  8. 2

    Puede hacerlo en html sólo a partir de una url en tu dispositivo móvil sólo. He aquí un ejemplo. Lo interesante es que si usted convertir esto en un código qr usted tiene una manera de que alguien se apropie de las direcciones desde donde quiera que estén sólo mediante el escaneo de su teléfono.

  9. 2

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

    Solo requiere de 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]];
    }
  10. 2

    Para iOS6 de apple docs recomienda utilizar el equivalente maps.apple.com Esquema de URL

    para uso

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

    lugar de

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

    a ser compatible el 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 un montón de otros parámetros admitidos por los Mapas de Apple esquema de URL : Apple Esquema de URL de Referencia

    puede utilizar estos la versión de iOS de detección de macros si usted tiene código condicional en otras partes de su código. la versión de iOS macros

    • Buen post en los mapas esquema de URL, pero en general usted debe no de prueba de la versión del sistema operativo de este modo. systemVersion no es un flotador (por ejemplo, 5.1.1 no es un float), y que la comparación puede en realidad producir el resultado incorrecto.
  11. 2

    Si usted no desea pedir permisos de ubicación y no tienen la lat y lng, utilice el 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 Actual Ubicación debe ser 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, yo uso el CLGeocoder para obtener la marca de posición y, a continuación, abra el mapa y la ubicación actual.

    Recuerde agregar CoreLocation.marco y MapKit.marco

  12. 1

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

    pero en lugar de Google maps dirección, puede utilizar la dirección url con maps:// resultante en la siguiente URL: maps://saddr=%f,%f&daddr=%@.

    Usando «Ubicación Actual» no parece funcionar, así que me quedé con las coordenadas.

    Antother lo bueno: Es compatible con versiones anteriores: En iOS5, se inicia la aplicación de Google Maps.

  13. 1

    Mi sugerencia sería la de usar OpenInGoogleMaps-iOS como esta es una puesta al día de la elección (noviembre de 2015), es compatible con las vainas de cacao instalación y usted está listo para ir en un par de clics.

    Instalar con: pod "OpenInGoogleMaps"

    Requieren en el archivo de encabezado de usar: #import "OpenInGoogleMapsController.h"

    Código de ejemplo siguiente:

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

Dejar respuesta

Please enter your comment!
Please enter your name here