Hvordan påberope iPhone Maps for beskrivelser med gjeldende posisjon som Startadresse

stemmer
72

Jeg vet det er mulig å starte iPhone Maps-programmet ved å ringe openURLpå et google maps URL med parametere saddrog daddrmed plassering strenger eller Lat / Long (se eksempel nedenfor).

Men jeg lurer på om det er mulig å gjøre startadressen være den gjeldende plassering maps bokmerke slik at jeg kan bruke Maps app beliggenhet håndtering kode. Google søk har vært ganske resultatløst.

For eksempel:

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

Bortsett fra med noe å påberope seg gjeldende plassering bokmerket i stedet for myLatLong.

Publisert på 23/02/2009 klokken 07:11
kilden bruker
På andre språk...                            


16 svar

stemmer
133

Pre iOS 6

Du må bruke Core-posisjon for å få den nåværende posisjon, men med det lat / lang pair, kan du få kart til ruten du derfra, til en gateadresse eller sted. Som så:

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

Til slutt, hvis du ønsker å unngå å bruke CoreLocation eksplisitt finne det aktuelle stedet, og ønsker å bruke @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"url i stedet, så se denne linken som jeg ga i kommentarene under for hvordan du kan lokalisere Nåværende + Location streng. Men er du drar nytte av en annen udokumentert funksjon, og som Jason McCreary påpeker nedenfor, kan det ikke fungere pålitelig i fremtidige utgivelser.


Oppdatering for iOS 6

Opprinnelig Maps brukte Google maps, men nå, Apple og Google har egne kart apps.

1) Hvis du ønsker å ruten ved hjelp av Google Maps app, bruker den comgooglemaps URL-ordningen :

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

2) For å bruke Apple Maps, kan du bruke den nye MKMapItemklassen for iOS 6. Se Apples API docs her

I utgangspunktet vil du bruke noe sånt som dette, hvis ruting til bestemmelses koordinater ( 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];

For å støtte både iOS 6+ og pre iOS 6 i den samme koden, vil jeg anbefale å bruke noe sånt som dette kode som Apple har på MKMapItemAPI doc siden:

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

Dette vil anta at Xcode Base SDK er iOS 6 (eller siste iOS ).

Svarte 08/06/2009 kl. 09:49
kilden bruker

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

Dette fungerer, men bare når iPhone / iPod språk er angitt i engelsk. Hvis du ønsker å støtte andre språk må du bruke en lokalisert streng å matche Maps bokmerkenavnet.

Svarte 01/12/2010 kl. 10:05
kilden bruker

Svarte 01/11/2010 kl. 14:46
kilden bruker

stemmer
10

Du kan bruke en preprosessor #define som:

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

å forstå iOS-versjonen. Deretter kan jeg bruke denne koden for å støtte iOS 6, også:

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];
Svarte 30/09/2012 kl. 09:51
kilden bruker

stemmer
5

På grunn av sandboxing, trenger du ikke har tilgang til kart programmets bokmerker.

I stedet bruker Core-posisjon for å fastslå gjeldende plassering selv. Deretter bruker denne plasseringen (lat og lang) i nettadressen du bygge for å åpne Maps.

Svarte 23/02/2009 kl. 15:07
kilden bruker

stemmer
4

Jeg anbefaler å sjekke ut CMMapLauncher , en mini-bibliotek som jeg bygget for å lansere Apple, Google og andre iOS-kartlegging apps med en bestemt tilordning forespørsel. Med CMMapLauncher til kode få veibeskrivelse i spørsmålet vil være:

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

Som du kan se, omslutter det også den versjonen kontroll som kreves mellom iOS 6 og andre.

Svarte 07/09/2013 kl. 12:37
kilden bruker

stemmer
3

Hei siden iOS6 er ute!

Apple gjorde noe bemerkelsesverdig i en dårlig måte (fra mitt synspunkt).

Apples kart er lansert og for enheter som kjører iOS 6 Du bør ikke bruke maps.google.com/?q=hvis du vil at iDevice å åpne den opprinnelige Plan app. Nå ville det være maps.apple.com/?q=.

Slik at utviklere ikke trenger å mye arbeid, omdirigerer vennlig maps.apple.com serveren alle ikke-Apple-enheter til maps.google.com så endringen er gjennomsiktig.

Denne måten vi developpers bare nødt til å slå alle google søkestrenger til eple seg. Dette er hva jeg liker mye.

Jeg måtte gjennomføre som functionnality i dag, så jeg gjorde det. Men jeg følte at jeg ikke skulle bare skrive hver url liggende i mobile nettsted for å målrette Apples kart-server, så jeg trodde jeg ville bare oppdage iDevices server-side og tjene eple webadresser bare for dem. Jeg tenkte jeg skulle dele.

Jeg bruker PHP så jeg brukte opensource Mobile Detect bibliotek: http://code.google.com/p/php-mobile-detect/

Bare bruk den isiPadpseudo-metoden som en boolsk getter og du er ferdig, kan du ikke konvertere google til eple ;-)

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

Jubel!

Svarte 21/09/2012 kl. 17:57
kilden bruker

stemmer
2

Hvis du ikke ønsker å be om plassering tillatelser og har ikke lat og lng brukes følgende.

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

For iOS5, må gjeldende posisjon å være i riktig språk. Jeg bruker LocalizedCurrentLocation fra dette innlegget http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

For iOS6, jeg bruker CLGeocoder å få stedsmarkeringen og deretter åpne kartet med det og det aktuelle stedet.

Husk å legge CoreLocation.framework og MapKit.framework

Svarte 06/12/2012 kl. 12:14
kilden bruker

stemmer
2

For iOS6 eple docs anbefale å bruke tilsvarende maps.apple.com URL Scheme

så bruk

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

i stedet for

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

å være bakoverkompatibel koden ville være

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

det er en hel del andre parametere som støttes for Apple Maps URL-ordningen: Apple URL Scheme Reference

du kan bruke disse iOS-versjonen gjenkjenning makroer hvis du har betinget kode i andre deler av koden. iOS versjon makroer

Svarte 20/09/2012 kl. 10:53
kilden bruker

stemmer
2

Den virkelige løsningen finner du her. Z5 Konsepter iOS Development kodebit

Det krever bare en liten bit av koding.

- (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]];
}
Svarte 02/06/2012 kl. 16:51
kilden bruker

stemmer
2

Du kan gjøre dette nå i html bare fra en url på den mobile enheten bare. Her er et eksempel . Den kule ting er hvis du snu dette til en QR-kode du har en måte noen få veibeskrivelse til deg fra hvor de er bare ved å skanne det på telefonen.

Svarte 26/05/2010 kl. 23:34
kilden bruker

stemmer
1

Mitt forslag ville være å bruke OpenInGoogleMaps-iOS da dette er en oppdatert valg (i november 2015), støtter det kakao pods installasjon og du er klar til å gå i noen få klikk.

Installer ved hjelp av: pod "OpenInGoogleMaps"

Krev i header-fil ved hjelp av: #import "OpenInGoogleMapsController.h"

Eksempelkode nedenfor:

/*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];       
Svarte 10/11/2015 kl. 13:35
kilden bruker

stemmer
1

Med den gjeldende versjonen av Google Maps, rett og slett utelate sadrparameter:

saddr: ... Hvis verdien er tomt, så brukerens nåværende plassering vil bli brukt.

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

Svarte 15/12/2013 kl. 18:30
kilden bruker

stemmer
1

For iOS6 Maps App, kan du bare bruke samme nettadresse postet over http://maps.google.com/maps?saddr=%f,%f&daddr=%@

men i stedet for Google maps URL, bruker du url med maps://resulterer i følgende nettadresse:maps://saddr=%f,%f&daddr=%@.

Bruke 'Nåværende plassering' ser ikke ut til å fungere, så jeg bodde med koordinatene.

Antother god ting: Det er bakoverkompatibel: På iOS5, det lanserer Google Maps app.

Svarte 13/09/2012 kl. 12:21
kilden bruker

stemmer
0

Hvis du ikke oppgir kilde sted, vil det ta nåværende posisjon som kilde. Prøv nedenfor Kode

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

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

Svarte 18/09/2017 kl. 12:06
kilden bruker

stemmer
0

Jeg svarte dette på en annen tråd. ( Nåværende plassering fungerer ikke med Apple Maps IOS 6 ). Du trenger for å få koordinatene til det aktuelle stedet først, og deretter bruke den til å lage kartet url.

Svarte 11/01/2013 kl. 05:37
kilden bruker

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