73

我知道可以通过调用openURL带有参数saddrdaddr位置字符串或纬度/经度的谷歌地图 URL 来启动 iPhone 地图应用程序(参见下面的示例)。

但我想知道是否可以将起始地址设为“当前位置”地图书签,以便我可以使用地图应用程序的位置处理代码。我的谷歌搜索一直没有结果。

例如:

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

除了调用当前位置书签来代替myLatLong.

4

16 回答 16

135

iOS 6 之前

您需要使用核心位置来获取当前位置,但是使用该纬度/经度对,您可以让地图将您从那里路由到街道地址或位置。像这样:

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

最后,如果您确实想避免使用 CoreLocation 来显式查找当前位置,而是想使用@"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"url,请参阅我在下面的评论中提供的链接,了解如何本地化Current+Location字符串。但是,您正在利用另一个未记录的功能,正如 Jason McCreary 在下面指出的那样,它在未来的版本中可能无法可靠地工作。


iOS 6 更新

最初,地图使用谷歌地图,但现在,苹果和谷歌拥有独立的地图应用程序。

1)如果您希望使用 Google Maps 应用程序进行路由,请使用comgooglemaps URL 方案

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

2)要使用 Apple 地图,您可以使用MKMapItemiOS 6 的新类。 请参阅此处的 Apple API 文档

基本上,如果路由到目标坐标( 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];

为了在同一代码中同时支持 iOS 6+ 和 iOS 6 之前的版本,我建议使用 Apple 在MKMapItemAPI 文档页面上提供的类似代码:

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

这将假设您的 Xcode Base SDK 是 iOS 6(或最新的 iOS)。

于 2009-06-08T09:49:53.333 回答
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];

这有效,但仅当 iPhone/iPod 语言设置为英语时。如果您想支持其他语言,则必须使用本地化字符串来匹配地图书签名称。

于 2010-12-01T10:05:57.393 回答
11

这适用于 iPhone:

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

于 2010-11-01T14:46:16.350 回答
10

您可以使用预处理器#define,例如:

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

了解您的 iOS 版本。然后,我也可以使用此代码来支持 iOS 6:

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];
于 2012-09-30T09:51:55.743 回答
5

由于沙盒,您无权访问 Map 应用程序的书签。

相反,请使用核心位置自行确定当前位置。然后在您构建的 URL 中使用该位置(经纬度)打开地图。

于 2009-02-23T15:07:00.867 回答
4

我建议查看CMMapLauncher,这是我构建的一个迷你库,用于启动具有特定映射请求的 Apple、Google 和其他 iOS 映射应用程序。使用 CMMapLauncher,在您的问题中获取方向的代码将是:

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

如您所见,它还封装了 iOS 6 和其他版本之间所需的版本检查。

于 2013-09-07T12:37:29.753 回答
3

嘿,因为iOS6已经出来了!

苹果以一种糟糕的方式做了一些了不起的事情(从我的角度来看)。

maps.google.com/?q=Apple 的地图已启动,对于运行 iOS 6 的设备,如果您希望 iDevice 打开本机计划应用程序,则不应使用。现在是maps.apple.com/?q=

为了让开发人员不必做太多工作,友好的 maps.apple.com 服务器将所有非 Apple 设备重定向到 maps.google.com,因此更改是透明的。

这样,我们开发人员只需将所有谷歌查询字符串切换为苹果查询字符串。这是我非常不喜欢的。

我今天必须实现该功能,所以我做到了。但我觉得我不应该只重写移动网站中的每个 url 以针对 Apple 的地图服务器,所以我认为我应该只检测 iDevices 服务器端并为这些服务提供苹果 url。我以为我会分享。

我正在使用 PHP,所以我使用了开源 Mobile Detect 库:http ://code.google.com/p/php-mobile-detect/

只需将isiPad伪方法用作布尔 getter,就完成了,您不会将 google 转换为 apple ;-)

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

干杯!

于 2012-09-21T17:57:01.007 回答
2

对于 iOS6,苹果文档推荐使用等效的 maps.apple.com URL Scheme

所以用

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

代替

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

为了向后兼容,代码将是

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

Apple Maps URL 方案还有大量其他受支持的参数:Apple URL Scheme Reference

如果您的代码的其他部分有条件代码,您可以使用这些 iOS 版本检测宏。iOS 版本宏

于 2012-09-20T10:53:22.373 回答
2

真正的解决方案可以在这里找到。Z5 Concepts iOS 开发代码片段

它只需要一点编码。

- (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]];
}
于 2012-06-02T16:51:22.867 回答
2

您现在可以仅通过移动设备上的 url 在 html 中执行此操作。这是一个例子。很酷的事情是,如果你把它变成一个二维码,你就可以通过手机扫描,从他们所在的任何地方找到你的方向。

于 2010-05-26T23:34:04.460 回答
2

如果您不想请求位置权限并且没有 lat 和 lng,请使用以下内容。

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

对于 ios5,当前位置需要使用正确的语言。我使用这篇文章中的 LocalizedCurrentLocation http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

对于 ios6,我使用 CLGeocoder 来获取地标,然后用它和当前位置打开地图。

记得添加 CoreLocation.framework 和 MapKit.framework

于 2012-12-06T12:14:54.063 回答
1

使用当前版本的谷歌地图,只需省略sadr参数:

saddr: ... 如果该值留空,则将使用用户的当前位置。

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

于 2013-12-15T18:30:55.750 回答
1

对于 iOS6 Maps App,您可以使用上面发布的相同 URL http://maps.google.com/maps?saddr=%f,%f&daddr=%@

但您使用的不是 Google 地图 URL,而是使用该 URL 并maps://生成以下 URL:maps://saddr=%f,%f&daddr=%@.

使用“当前位置”似乎不起作用,所以我保留了坐标。

另一个好处:它向后兼容:在 iOS5 上,它启动了谷歌地图应用程序。

于 2012-09-13T12:21:47.120 回答
1

我的建议是使用OpenInGoogleMaps-iOS,因为这是一个最新的选择(到 2015 年 11 月),它支持可可豆荚安装,您只需点击几下即可开始使用。

安装使用:pod "OpenInGoogleMaps"

在头文件中要求使用:#import "OpenInGoogleMapsController.h"

下面的示例代码:

/*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];       
于 2015-11-10T13:35:17.977 回答
0

我在另一个线程上回答了这个问题。(当前位置不适用于 Apple Maps IOS 6)。您需要先获取当前位置的坐标,然后使用它来创建地图 url。

于 2013-01-11T05:37:18.433 回答
0

如果您不提供源位置,它将以当前位置为源。试试下面的代码 -

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

UIApplication.shared.openURL(URL(字符串:urlString)!)

于 2017-09-18T12:06:29.420 回答