Cum de a invoca Hărți iPhone pentru direcții cu Locul de amplasare actual ca Start Adresa

voturi
72

Știu că este posibil pentru a porni aplicația Maps pentru iPhone prin apelarea openURLla hărți Google URL cu parametrii saddrși daddrcu siruri de caractere pentru locație sau / Lat Long ( a se vedea exemplul de mai jos).

Dar mă întreb dacă este posibil pentru a face adresa de start să fie „locația curentă“ marcaj hărți , astfel încât să pot utiliza Hărți de locație codul de manipulare aplicației. Căutarea mea Google a fost destul de zadarnice.

De exemplu:

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

Cu excepția ceva pentru a invoca actualul marcaj de locație în locul myLatLong.

Întrebat 23/02/2009 la 08:11
sursa de către utilizator
În alte limbi...                            


16 răspunsuri

voturi
133

iOS 6 Pre

Trebuie să utilizați Core Locul de amplasare pentru a obține locația curentă, dar cu acea pereche lat / lung, puteți obține Hărți Google pentru a vă ruta de acolo, la o adresă sau o locație. Ca astfel:

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

În cele din urmă, în cazul în care vă doriți să evitați utilizarea CoreLocation pentru a găsi în mod explicit locația curentă, și doriți să utilizați @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"URL - ul în schimb, atunci vedea acest link pe care am furnizat în comentarii de mai jos pentru modul de a localiza curent + Locul de amplasare șir. Cu toate acestea, sunteți profitând de o altă caracteristică fără acte, și ca Jason McCreary arată mai jos, este posibil să nu funcționeze în mod fiabil în versiunile ulterioare.


Actualizare pentru iOS 6

Inițial, Maps folosit Google Maps, dar acum, Apple și Google au hărți aplicații separate.

1) Dacă doriți să ruta utilizând aplicația Google Maps, utilizați schema URL comgooglemaps :

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

2) Pentru a utiliza Apple Maps, puteți utiliza noua MKMapItemclasă pentru iOS 6. A se vedea API Docs la Apple aici

Practic, vei folosi ceva de genul asta, în cazul în care de rutare la destinație coordonate ( 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];

Pentru a sprijini atât iOS 6+ și iOS pre 6 în același cod, aș recomanda utilizarea așa ceva cod care Apple are pe MKMapItempagina API doc:

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

Acest lucru ar presupune că Xcode Base SDK este iOS 6 (sau Ultimele iOS ).

Publicat 08/06/2009 la 10:49
sursa de către utilizator

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

Aceasta funcționează, dar numai atunci când limba iPhone / iPod este setată în limba engleză. Dacă doriți să sprijine alte limbi, va trebui să utilizați un șir de caractere localizate pentru a se potrivi cu numele marcajului Maps.

Publicat 01/12/2010 la 11:05
sursa de către utilizator

Publicat 01/11/2010 la 15:46
sursa de către utilizator

voturi
10

Puteți utiliza un #define preprocesor cum ar fi:

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

pentru a înțelege versiunea iOS. Apoi, pot folosi acest cod pentru a sprijini iOS 6, de asemenea:

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];
Publicat 30/09/2012 la 10:51
sursa de către utilizator

voturi
5

Din cauza sandbox, nu aveți acces la marcajele aplicației Map.

În schimb, utilizați Core Locul de amplasare pentru a determina locația curentă tine. Apoi, utilizați acea locație (LAT și lung) în URL-ul vă construi pentru a deschide Hărți.

Publicat 23/02/2009 la 16:07
sursa de către utilizator

voturi
4

Vă recomandăm verificarea CMMapLauncher , un mini-bibliotecă pe care am construit pentru a lansa Apple, Google și alte aplicații de cartografiere iOS cu o cerere de cartografiere specifice. Cu CMMapLauncher, codul pentru a obține direcțiile în întrebarea dumneavoastră ar fi:

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

După cum puteți vedea, de asemenea, verificarea încapsulează necesară versiunea între iOS 6 și altele.

Publicat 07/09/2013 la 13:37
sursa de către utilizator

voturi
3

Hei, din moment ce iOS6 este în afara!

Apple a făcut ceva remarcabil într-un mod rău (din punctul meu de vedere).

Apple Maps sunt lansate și pentru dispozitivele care rulează iOS 6 nu trebuie să utilizați maps.google.com/?q=dacă doriți iDevice pentru a deschide aplicația nativă plan. Acum ar fi maps.apple.com/?q=.

Așa că dezvoltatorii nu au prea mult de lucru, serverul maps.apple.com prietenos redirecționează toate dispozitivele non-Apple pentru a maps.google.com astfel încât schimbarea este transparentă.

Astfel, am developpers doar trebuie pentru a comuta toate șirurile de interogare Google la cele de mere. Aceasta este ceea ce imi place foarte mult.

A trebuit să pună în aplicare pe care functionnality azi, așa că am făcut-o. Dar am simțit că nu ar trebui să rescrie doar fiecare adresă URL situată în site-ul mobil pentru a viza serverul hărți Apple asa ca m-am gândit detecta doar iDevices server-side și de a servi mere doar pentru url-urile cele. Am crezut că o să împărtășesc.

Sunt folosind PHP asa ca am folosit OpenSource Mobile Detect bibliotecă: http://code.google.com/p/php-mobile-detect/

Trebuie doar să folosiți isiPadmetoda pseudo ca un getter boolean și ai terminat, ai obiceiul converti Google în mere ;-)

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

Noroc!

Publicat 21/09/2012 la 18:57
sursa de către utilizator

voturi
2

Dacă nu doriți să solicite permisiuni de locație și nu au LAT și LNG, utilizați următoarea.

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

Pentru iOS5, locația curentă trebuie să fie în limba corectă. Eu folosesc LocalizedCurrentLocation de la acest post http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

Pentru iOS6, am folosi CLGeocoder pentru a obține marcatorul de locație și apoi deschideți harta cu ea și locația curentă.

Nu uitați să adăugați CoreLocation.framework și MapKit.framework

Publicat 06/12/2012 la 13:14
sursa de către utilizator

voturi
2

Pentru iOS6 docs de mere recomandă utilizarea schemei de URL maps.apple.com echivalent

deci utilizați

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

in loc de

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

să fie compatibil codul ar fi

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

există o încărcătură întreagă de alți parametri suportate pentru schema URL Apple Maps: Apple a URL Schema de referință

puteți utiliza aceste iOS macro - uri de detectare versiune dacă aveți cod condițional în alte părți ale codului. versiunea iOS macro - uri

Publicat 20/09/2012 la 11:53
sursa de către utilizator

voturi
2

Soluția reală poate fi găsită aici. Z5 Concepte iOS Dezvoltare Fragment de cod

Este doar nevoie de un pic de codificare.

- (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]];
}
Publicat 02/06/2012 la 17:51
sursa de către utilizator

voturi
2

Puteți face acest lucru acum în HTML doar de la o adresă URL doar pe dispozitivul mobil. Iată un exemplu . Lucru rece este dacă dezactivați această într - un cod QR aveți o modalitate de cineva obține direcții la tine de oriunde acestea sunt doar prin scanarea - l pe telefonul lor.

Publicat 27/05/2010 la 00:34
sursa de către utilizator

voturi
1

Sugestia mea ar fi folosind OpenInGoogleMaps-iOS ca aceasta este o alegere de până la data de (până în noiembrie 2015), susține instalarea păstăi de cacao și sunteți gata pentru a merge în câteva clicuri.

Instalați folosind: pod "OpenInGoogleMaps"

Necesită în fișierul antet folosind: #import "OpenInGoogleMapsController.h"

Exemplu de cod de mai jos:

/*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];       
Publicat 10/11/2015 la 13:35
sursa de către utilizator

voturi
1

Cu versiunea curentă a Google Maps, pur și simplu omite sadrparametrul:

saddr: ... Dacă valoarea este lăsată goală, atunci locația actuală a utilizatorului va fi utilizat.

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

Publicat 15/12/2013 la 19:30
sursa de către utilizator

voturi
1

Pentru iOS6 Maps App, puteți folosi aceeași adresă URL postat mai sus http://maps.google.com/maps?saddr=%f,%f&daddr=%@

dar în loc de URL - ul Google Maps, utilizați URL - ul cu maps://rezultând următoarea adresă URL:maps://saddr=%f,%f&daddr=%@.

Utilizarea „Locația actuală“ nu pare să funcționeze, așa că am rămas cu coordonatele.

Antother lucru bun: Este compatibil: On iOS5, lansează aplicația Google Maps.

Publicat 13/09/2012 la 13:21
sursa de către utilizator

voturi
0

Dacă nu furnizați sursa de locație, va lua locația actuală ca sursă. Încercați mai jos code-

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

UIApplication.shared.openURL (URL (string:! UrlString))

Publicat 18/09/2017 la 12:06
sursa de către utilizator

voturi
0

I - am răspuns acest lucru pe un fir diferit. ( Locația curentă nu funcționează cu Apple Maps IOS 6 ). Ai nevoie pentru a obține coordonatele locației curente în primul rând, apoi utilizați - l pentru a crea adresa URL a hărții.

Publicat 11/01/2013 la 06:37
sursa de către utilizator

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