I know it\'s possible to start the iPhone maps application by calling openURL
on a google maps URL with parameters saddr
and daddr
wit
This works on iPhone:
http://maps.google.com/maps?saddr=Current Location&daddr=123 Main St,Ottawa,ON
If you don't provide source location, it will take current location as source. Try below code-
let urlString = "http://maps.apple.com/maps?daddr=(destinationLocation.latitude),(destinationLocation.longitude)&dirflg=d" }
UIApplication.shared.openURL(URL(string: urlString)!)
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;
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];
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: @"http://maps.google.com/maps?saddr=%f,%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 @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"
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.
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];
destination.name = @"Name Here!";
NSArray* items = [[NSArray alloc] initWithObjects: destination, nil];
NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:
MKLaunchOptionsDirectionsModeDriving,
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).
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.
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 maps.google.com/?q=
if you want the iDevice to open the native Plan app. Now it would be maps.apple.com/?q=
.
So that developers don't have to much work, the friendly maps.apple.com server redirects all non-Apple devices to maps.google.com 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 : http://code.google.com/p/php-mobile-detect/
Just use the isiPad
pseudo method as a boolean getter and you're done, you wont convert google into apple ;-)
$server=$detect->isiPad()?"apple":"google";
$href="http://maps.{$server}.com/?q=..."
Cheers!