如何调用当前位置作为开始地址的方向的 iPhone 地图

我知道可以通过调用带有参数 saddr的谷歌地图 URL 上的 openURL和带有位置字符串或 Lat/Long 的 daddr来启动 iPhone 地图应用程序(参见下面的例子)。

但是我想知道是否有可能使起始地址为 “当前位置”地图书签,这样我就可以使用 地图应用程序的位置处理代码。我的谷歌搜索一无所获。

例如:

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

除了使用一些代替 myLatLong调用当前位置书签的东西。

92855 次浏览

由于沙箱的存在,您无法访问 Map 应用程序的书签。

相反,使用核心位置来确定自己的当前位置。然后使用您构建的 URL 中的位置(lat 和 long)打开 Maps。

前 iOS6

您需要使用 Core Location 来获得当前位置,但是使用 lat/long 对,您可以获得 Maps 来从那里路由到街道地址或位置。像这样:

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,那么使用 请看我在下面的评论中提供的链接来说明如何本地化 当前 + 位置字符串。然而,您正在利用另一个没有文档的特性,正如 Jason McCreary 在下面指出的,它在未来的版本中可能无法可靠地工作。


IOS6更新

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

1) 如果你想使用谷歌地图应用程序进行路由,使用 Comgooglemap URL 方案:

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

2) 要使用苹果地图,你可以使用 iOS6的新 MKMapItem类。请点击这里查看 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];

为了在同一代码中同时支持 iOS6 + 和 iOS6之前的版本,我建议使用类似于苹果在 MKMapItem API 文档页面上的代码:

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

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

你现在可以在 html 中仅仅通过移动设备上的一个 URL 来完成这项工作。这是 例子。最酷的是,如果你把这个变成二维码,你就有办法让别人从任何地方通过扫描他们的手机就能找到你。

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 语言设置为英语时才有效。如果你想支持其他语言,你必须使用一个本地化的字符串来匹配地图书签名称。

真正的解决方案可以在这里找到

只需要一点点编码。

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

对于 iOS6地图应用程序,你可以只使用上面发布的相同的 URL http://maps.google.com/maps?saddr=%f,%f&daddr=%@

但是不使用 Google 地图 URL,而是使用带有 maps://的 URL,结果是以下 URL: maps://saddr=%f,%f&daddr=%@.

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

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

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

苹果地图 URL 方案还有很多其他支持的参数: 苹果网址方案参考资料

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

嘿,既然 iOS6已经出来了!

苹果做了一些了不起的坏事(从我的角度来看)。

苹果的地图已经启动,对于运行 iOS6的设备,如果你想让 iDevice 打开本地 Plan 应用程序,你不应该使用 maps.google.com/?q=。现在是 maps.apple.com/?q=

为了让开发人员不用做太多工作,友好的 maps.apple.com 服务器将所有非苹果设备重定向到 maps.google.com,这样变化是透明的。

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

我今天必须实现这个功能,所以我做到了。但我觉得我不应该只是重写每一个位于移动网站的网址,以苹果的地图服务器为目标,所以我认为我只是检测苹果设备服务器端,并提供苹果网址只是为了那些。我想分享一下。

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

只要使用 isiPad伪方法作为一个布尔获取器,你就完成了,你不会把 google 转换成苹果; -)

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

干杯!

可以使用预处理器 # 定义如下:

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

如果您不希望请求位置权限,并且没有 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,当前位置需要使用正确的语言

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

记住添加 CoreLocation.Framework 和 MapKit.Framework

我在另一个帖子上回答了这个问题。(当前位置不能与苹果地图 IOS 6一起工作).您需要首先获取当前位置的坐标,然后使用它来创建 map url。

我建议你看看 CMMapLauncher,这是一个迷你库,我建立它是为了推出苹果、谷歌和其他 iOS 地图应用程序,并提供特定的地图请求。使用 CMMapLauncher,获得问题中的说明的代码将是:

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

如您所见,它还封装了 iOS6和其他操作系统之间所需的版本检查。

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

如果该值为空,则将使用用户的当前位置。

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

我的建议是使用 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];

如果您不提供源位置,它将以当前位置作为源

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

OpenURL (URL (字符串: urlString) !)