从您的应用程序内部调用地图以获取路线 - iOS 5 iOS 6

Posted

技术标签:

【中文标题】从您的应用程序内部调用地图以获取路线 - iOS 5 iOS 6【英文标题】:Call Maps for directions from inside your app - iOS5 iOS6 【发布时间】:2012-09-14 03:51:36 【问题描述】:

这是一个奇怪的问题:我的应用程序应该能够调用 ios(5.1 和 6)中的内置地图。事实证明,它在 iOS6 下工作得很好,但在 iOS5.1 下却不行。调用 iOS6 中的地图并跟踪从 saddr 到 daddr 的方向,但是当我在 iOS5 中时,地图应用程序被调用,但只有一个 pin 放在 daddr 上。由于某些未知原因,初始坐标 (saddr) 未显示,也未跟踪任何方向。

这是我的代码:

addr = [NSString stringWithFormat: @"maps://saddr=%f,%f&daddr=%f,%f", newLocation.coordinate.latitude, newLocation.coordinate.longitude, oldLatitude, oldLongitude];
NSURL *url = [NSURL URLWithString:addr];
[[UIApplication sharedApplication] openURL:url];

我尝试将 URL 更改为“http://maps.google.com/something”,但它调用的是 Safari 而不是内置的地图应用程序。我注意到变量已正确传递到 URL。

有什么想法吗?

提前致谢!

【问题讨论】:

几乎相同的问题to this older one,除了起始地址是另一个问题中的当前位置(并没有真正改变问题)。 【参考方案1】:

我遇到了类似的问题,我不得不创建一些有条件的操作系统代码来处理 Google 地图应用程序已被删除的事实。来自新MKMapItem Reference

//first create latitude longitude object
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude,longitude);

//create MKMapItem out of coordinates
MKPlacemark* placeMark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
MKMapItem* destination =  [[MKMapItem alloc] initWithPlacemark:placeMark];

if([destination respondsToSelector:@selector(openInMapsWithLaunchOptions:)])

    //using iOS6 native maps app
    [destination openInMapsWithLaunchOptions:@MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving];        
 
else

    //using iOS 5 which has the Google Maps application
    NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=Current+Location&daddr=%f,%f", latitude, longitude];
    [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];


[placeMark release];
[destination release];

获取步行路线:

    对于 iOS 6 地图 - 您可以设置 MKLaunchOptionsDirectionsModeWalking 而不是 MKLaunchOptionsDirectionsModeDriving 对于 Google 地图 - 将 &dirflg=w 添加到 url。

我认为在 iOS6 中使用 openInMapsWithLaunchOptions 会更好,因为它可以让您完全控制地图应用程序的响应方式。

【讨论】:

感谢朋友的帮助!我听从了您的建议并使用了 openInMapsWithLaunchOptions 并且效果很好。我使用的唯一技巧是将当前位置作为参数传递给 NSString* url = [NSString stringWithFormat: @"maps.google.com/maps?saddr=%f,%f&daddr=%f,%f", currentLatitude, currentLongitude, latitude, longitude];因为我无法让 Current+Location sintax 工作。也许它与 iOS 5.1.1 中的沙盒有关。 @lsp,使用Current+Location 的问题在我的回答to this very similar older question 中讨论,cmets 对此作出响应。 我不希望地图视图覆盖全屏,它应该只显示我屏幕的一半。【参考方案2】:

您可以使用MKPlacemarkMKMapItem 来启动地图应用,同时在地图图钉上显示坐标标题:

NSString *pinTitle;
CLLocationCoordinate2D coordinate;

MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:@(id)kABPersonAddressStreetKey: pinTitle];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];

if ([mapItem respondsToSelector:@selector(openInMapsWithLaunchOptions:)])

    [mapItem openInMapsWithLaunchOptions:@MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving];

else

    // Google Maps fallback
    NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%f,%f&saddr=Current+Location", locationItem.coordinate.latitude, locationItem.coordinate.longitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];

请注意,您需要链接 AddressBook.framework 并在代码中的某处添加 #import <AddressBook/AddressBook.h> 以使用 kABPersonAddressStreetKey 常量。

【讨论】:

以上是关于从您的应用程序内部调用地图以获取路线 - iOS 5 iOS 6的主要内容,如果未能解决你的问题,请参考以下文章

以无线方式安装企业内部应用

如何在我的应用 iOS6 中获取行车路线

“从您的主线程调用它可能会导致死锁和/或 ANR,同时从 GoogleAuthUtil(Android 中的 Google Plus 集成)获取 accessToken”

使用 URLWithString 调用 Google 地图时获取“路线不可用”

iOS-高德地图路线规划开发记录

iOS-高德地图路线规划开发记录