从代码中打开地图应用程序 - 在哪里/如何找到“当前位置”?

时间:2011-01-04 05:42:45

标签: iphone ios google-maps core-location

我正在打开Goog​​le地图应用,以便从我的代码中显示从用户的当前位置到目标坐标的路线。我使用以下代码打开地图应用。我按下按钮时调用此代码。 getCurrentLocation是一种返回最近更新位置的方法。

- (void)showDirectionsToHere {

    CLLocationCoordinate2D currentLocation = [self getCurrentLocation];  // LINE 1
    NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f", 
                                                  currentLocation.latitude,
                                                  currentLocation.longitude, 
                                                  destCoordinate.latitude, 
                                                  destCoordinate.longitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}

LINE 1 中的[self getCurrentLocation]使用CLLocationManager来确定当前位置并返回该值。

注意:我尚未在 LINE1 中实施代码。我刚刚计划这样做。

我的问题是:

  1. 这是一个很好的做法,可以在调用地图应用时计算当前位置吗?
  2. [self getCurrentLocation会在调用openURL之前返回当前位置吗?
  3. 在打开地图应用之前,我是否必须确定当前位置?
  4. 我对这些事情有点困惑。请指导我。感谢。

4 个答案:

答案 0 :(得分:11)

您无需自行确定用户的当前位置,地图应用就会负责。

您可以传递Current%%20Location而不是传递纬度/经度对,而地图则会确定用户当前的位置。

%20是一个url编码的空格字符,额外的%会转义实际的%,因此不会将其解释为格式替换。


感谢 @Carlos P 在原始答案中指出我的转义字符错误。

答案 1 :(得分:7)

使用“当前位置”作为saddr仅在用户将系统语言设置为英语时才有效。最好的选择是从Core Location获取当前位置并将其用作saddr。

答案 2 :(得分:5)

正如pazustep指出的那样,“当前位置”仅适用于英语。例如,在意大利语中,正确的字符串是“Posizione attuale”。

在iPhone固件中嗅探我检测到了所有“当前位置”的翻译,我写了一个类,它提供了任何(当前)支持的语言所需的正确字符串。

我的博客上有一篇关于此内容的帖子(包括源代码):http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

答案 3 :(得分:2)

您可以使用适用于iOS 6的新MKMapItem课程。See the Apple API docs here

基本上,如果路由到目的地坐标destCoordinate),你会使用这样的东西:

    MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate: destCoordinate 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之前的版本,我建议在MKMapItem API文档页面上使用类似Apple的代码:

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 )。

In this other answer, I offer a robust technique for iOS 5.1 and lower