从您的应用程序内部调用地图以获取路线 - 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】:
您可以使用MKPlacemark
和MKMapItem
来启动地图应用,同时在地图图钉上显示坐标和标题:
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的主要内容,如果未能解决你的问题,请参考以下文章
“从您的主线程调用它可能会导致死锁和/或 ANR,同时从 GoogleAuthUtil(Android 中的 Google Plus 集成)获取 accessToken”