how to invoke iphone maps for directions with current location as start address

how to invoke iphone maps for directions with current location as start address  using -'iphone,ios,maps'

I know it's possible to start the iPhone maps application by calling openURL on a google maps URL with parameters saddr and daddr with location strings or Lat/Long (see example below).

But I'm wondering if it's possible to make the start address be the "Current Location" maps bookmark so that I can use the Maps app's location handling code. My Google search has been pretty fruitless.

For example:

[[UIApplication sharedApplication] openURL:
    [NSURL URLWithString:
        [NSString stringWithFormat: @"",

Except with something to invoke the current location bookmark in place of myLatLong.

asked Sep 29, 2015 by ukohale
0 votes

13 Answers

0 votes

Pre iOS 6

You need to use Core Location to get the current location, but with that lat/long pair, you can get Maps to route you from there, to a street address or location. Like so:

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: @",%f&daddr=%@",
                    currentLocation.latitude, currentLocation.longitude,
                    [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

Finally, if you do want to avoid using CoreLocation to explicitly find the current location, and want to use the @"" url instead, then see this link that I provided in comments below for how to localize the Current+Location string. However, you are taking advantage of another undocumented feature, and as Jason McCreary points out below, it may not work reliably in future releases.

Update for iOS 6

Originally, Maps used Google maps, but now, Apple and Google have separate maps apps.

1) If you wish to route using the Google Maps app, use the comgooglemaps URL scheme:

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

2) To use Apple Maps, you can use the new MKMapItem class for iOS 6. See the Apple API docs here

Basically, you will use something like this, if routing to destination coordinates (latlong):

    MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate: latlong addressDictionary: nil];
    MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark: place]; = @"Name Here!";
    NSArray* items = [[NSArray alloc] initWithObjects: destination, nil];
    NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:
                                 MKLaunchOptionsDirectionsModeKey, nil];
    [MKMapItem openMapsWithItems: items launchOptions: options];

In order to support both iOS 6+ and pre iOS 6 in the same code, I'd recommend using something like this code that Apple has on the MKMapItem API doc page:

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

This would assume that your Xcode Base SDK is iOS 6 (or Latest iOS).

answered Sep 29, 2015 by dhananjayksharma
0 votes
NSString* addr = [NSString stringWithFormat:@" Location&saddr=%@",startAddr];
NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
[url release];

This works but only when the iPhone/iPod language is set in English. If you want to support other languages you'll have to use a localized string to match the Maps bookmark name.

answered Sep 29, 2015 by suyesh.lokhande
0 votes

You can use a preprocessor #define like:

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

to understand your iOS version. Then, I can use this code to support iOS 6, too:

NSString* addr = nil;
   addr = [NSString stringWithFormat:@",%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
} else {
   addr = [NSString stringWithFormat:@",%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];
answered Sep 29, 2015 by badhwar.rohit
0 votes

Because of sandboxing, you don't have access to the Map application's bookmarks.

Instead, use Core Location to determine the current location yourself. Then use that location (the lat and long) in the URL you build to open Maps.

answered Sep 29, 2015 by rajeevr642
0 votes

Hey since iOS6 is out!

Apple did something remarkable in a bad way (from my point of view).

Apple's maps are launched and for devices running iOS 6 you should not use if you want the iDevice to open the native Plan app. Now it would be

So that developers don't have to much work, the friendly server redirects all non-Apple devices to so the change is transparent.

This way we developpers just have to switch all google query strings to apple ones. This is what I dislike a lot.

I had to implement that functionnality today so I did it. But I felt I should not just rewrite every url lying in mobile website to target Apple's maps server so I thought I'd just detect iDevices server-side and serve apple urls just for those. I thought I'd share.

I'm using PHP so I used the opensource Mobile Detect library :

Just use the isiPad pseudo method as a boolean getter and you're done, you wont convert google into apple ;-)



answered Sep 29, 2015 by r3tt
0 votes

I recommend checking out CMMapLauncher, a mini-library that I built to launch Apple, Google, and other iOS mapping apps with a specific mapping request. With CMMapLauncher, the code to get the directions in your question would be:

[CMMapLauncher launchMapApp:CMMapAppAppleMaps
          forDirectionsFrom:[CMMapPoint mapPointWithName:@"Origin"
                         to:[CMMapPoint mapPointWithName:@"Destination"

As you can see, it also encapsulates the version checking required between iOS 6 & others.

answered Sep 29, 2015 by manju bhargava
0 votes

You can do this now in html just from a url on your mobile device only. Here's an example. The cool thing is if you turn this into a qr code you have a way of someone getting directions to you from wherever they are just by scanning it on their phone.

answered Sep 29, 2015 by deven.bendale
0 votes

The real solution can be found here. Z5 Concepts iOS Development Code Snippet

It just requires a little bit of encoding.

- (IBAction)directions1_click:(id)sender
    NSString* address = @"118 Your Address., City, State, ZIPCODE";
    NSString* currentLocation = @"Current Location";
    NSString* url = [NSStringstringWithFormat: @"",[currentLocation stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    UIApplication *app = [UIApplicationsharedApplication];
    [app openURL: [NSURL URLWithString: url]];
answered Sep 29, 2015 by ashish singh
0 votes

For iOS6 the apple docs recommend using the equivalent URL Scheme

so use,%f&daddr=%f,%f

instead of,%f&daddr=%f,%f

to be backwards compatible the code would be

    NSString* versionNum = [[UIDevice currentDevice] systemVersion];
    NSString *nativeMapScheme = @"";
    if ([versionNum compare:@"6.0" options:NSNumericSearch] == NSOrderedAscending)
        nativeMapScheme = @"";
    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]];

there is a whole load of other supported parameters for the Apple Maps URL scheme : Apple URL Scheme Reference

you can use these iOS version detection macros if you have conditional code in other parts of your code. iOS version macros

answered Sep 29, 2015 by 20shahi
0 votes

If you don't want to ask for location permissions and don't have the lat and lng, use the following.

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 = @{
            [NSNumber numberWithInteger:MKMapTypeStandard],

            [MKMapItem openMapsWithItems:mapItems launchOptions:options];

        } else {
            //error nothing found
} else {

    NSString *sourceAddress = [LocalizedCurrentLocation currentLocationStringForCurrentLanguage];

    NSString *urlToOpen = [NSString stringWithFormat:@"",
                 [sourceAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                 [destinationAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlToOpen]];

For ios5, the Current Location needs to be in the correct language. I use the LocalizedCurrentLocation from this post

For ios6, I use the CLGeocoder to get the placemark and then open the map with it and the current location.

Remember to add CoreLocation.framework and MapKit.framework

answered Sep 29, 2015 by ankitarajoria4
0 votes

For iOS6 Maps App, you can just use the same URL posted above,%f&daddr=%@

but instead of the Google maps URL, you use the url with maps:// resulting in the following URL: maps://saddr=%f,%f&daddr=%@.

Using 'Current Location' doesn't seem to work, so I stayed with the coordinates.

Antother good thing: It's backwards compatible: On iOS5, it launches the Google Maps app.

answered Sep 29, 2015 by patilkiran.101
0 votes

With the current version of Google Maps, simply omit the sadr parameter:

saddr: … If the value is left blank, then the user’s current location will be used.

answered Sep 29, 2015 by amit.gupta
0 votes

I answered this on a different thread. (Current Location doesn't work with Apple Maps IOS 6). You need to get the coordinates of the current location first, then use it to create the map url.

answered Sep 29, 2015 by thiru