如何在iOS 6中启动具有特定地址的iOS Maps App? [英] How to launch iOS Maps App with specific address in iOS 6?
问题描述
我有一个应用程序,允许用户启动Google地图应用程序(Google或Apple)查看地址。 我曾经这样做过:
p> Address * address = [self.person.addresses objectAtIndex:0];
NSString * addressString = [NSString stringWithFormat:@%@%@%@%@,%@%@,
address.line1 == nil? @:address.line1,
address.line2 == nil? @:address.line2,
address.line3 == nil? @:address.line3,
address.city == nil? @:address.city,
address.state == nil? @:address.state,
address.zip == nil? @:address.zip];
NSString * mapsURL = [NSString stringWithFormat:@http://maps.google.com/maps?q=%@,[addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mapsURL]];
但是为了支持iOS 6,我将其更改为:
Address * address = [self.person.addresses objectAtIndex:0];
NSString * addressString = [NSString stringWithFormat:@%@%@%@%@,%@%@,
address.line1 == nil? @:address.line1,
address.line2 == nil? @:address.line2,
address.line3 == nil? @:address.line3,
address.city == nil? @:address.city,
address.state == nil? @:address.state,
address.zip == nil? @:address.zip];
//检查iOS 6
类mapItemClass = [MKMapItem class];
if(mapItemClass&& [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions :)])
{
/ *
//创建一个MKMapItem传递给地图app
MKPlacemark * placemark = [[MKPlacemark alloc] initWithCoordinate:nil
addressDictionary:nil];
MKMapItem * mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem openInMapsWithLaunchOptions:nil];
* /
//我想要的是这样的:
MKMapItem * mapItem = [[MKMapItem alloc] initWithAddressQuery:addressString];
[mapItem openInMapsWithLaunchOptions:nil];
}
else
{
NSString * mapsURL = [NSString stringWithFormat:@http://maps.google.com/maps?q=%@,[addressString stringByAddingPercentEscapesUsingEncoding :NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mapsURL]];
$ / code>
基本上,用原始地址(no ABPersonRef
的或任何东西)我需要在Apple Maps中打开位置。 Google曾经这样做很好。
我尝试了从 maps.google.com
到地图的简单切换。 apple.com
,但在iOS 5中打开Google Maps网络应用程序 - 我不想!有一个非常好的本地应用程序。
找到答案此处。它通过使用 CLGeocoder
类来完成:
//检查iOS 6
类mapItemClass = [MKMapItem class];
if(mapItemClass&& [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions :)])
{
CLGeocoder * geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:addressString
completionHandler:^(NSArray * placemarks,NSError * error){
//将CLPlacemark转换为MKPlacemark
//注意:检查失败的地理编码没有错误
CLPlacemark * geocodedPlacemark = [placemarks objectAtIndex:0];
MKPlacemark * placemark = [[MKPlacemark alloc]
initWithCoordinate:geocodedPlacemark.location.coordinate
addressDictionary:geocodedPlacemark.addressDictionary];
//创建地图项以传递给地图应用的地理编码地址
MKMapItem * mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:geocodedPlacemark.name];
//将方向模式设置为驾驶
//可以使用MKLaunchOptionsDirectionsModeWalking来代替
NSDictionary * launchOptions = @ {MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving};
//获取当前用户位置MKMapItem
MKMapItem * currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];
//将当前位置和目标地图项目传递给地图应用程序
//在launchOptions字典中设置方向模式
[MKMapItem openMapsWithItems:@ [currentLocationMapItem,mapItem] launchOptions:launchOptions];
}];
}
// iOS 4/5:
else
{
NSString * mapsURL = [NSString stringWithFormat:@http://maps.google.com/ maps?q =%@,[addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
...
I have an app in which I allow users to launch the Maps App (Google or Apple) to view an address.
I used to do this:
Address *address = [self.person.addresses objectAtIndex:0];
NSString *addressString = [NSString stringWithFormat:@"%@ %@ %@ %@, %@ %@",
address.line1 == nil ? @"" : address.line1,
address.line2 == nil ? @"" : address.line2,
address.line3 == nil ? @"" : address.line3,
address.city == nil ? @"" : address.city,
address.state == nil ? @"" : address.state,
address.zip == nil ? @"" : address.zip];
NSString *mapsURL = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", [addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mapsURL]];
But to support iOS 6, I've changed it to this:
Address *address = [self.person.addresses objectAtIndex:0];
NSString *addressString = [NSString stringWithFormat:@"%@ %@ %@ %@, %@ %@",
address.line1 == nil ? @"" : address.line1,
address.line2 == nil ? @"" : address.line2,
address.line3 == nil ? @"" : address.line3,
address.city == nil ? @"" : address.city,
address.state == nil ? @"" : address.state,
address.zip == nil ? @"" : address.zip];
// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
/*
// Create an MKMapItem to pass to the Maps app
MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:nil
addressDictionary:nil];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem openInMapsWithLaunchOptions:nil];
*/
// I want something like this:
MKMapItem *mapItem = [[MKMapItem alloc] initWithAddressQuery:addressString];
[mapItem openInMapsWithLaunchOptions:nil];
}
else
{
NSString *mapsURL = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", [addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mapsURL]];
}
Basically, with the raw address (no ABPersonRef
's or anything) I need to open the location in Apple Maps. Google used to do this just fine.
I've tried the simple switch from maps.google.com
to maps.apple.com
but in iOS 5 it opens to Google Maps web app -- which I don't want! There's a perfectly good native app.
Found the answer here. It is accomplished by using the CLGeocoder
class:
// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:addressString
completionHandler:^(NSArray *placemarks, NSError *error) {
// Convert the CLPlacemark to an MKPlacemark
// Note: There's no error checking for a failed geocode
CLPlacemark *geocodedPlacemark = [placemarks objectAtIndex:0];
MKPlacemark *placemark = [[MKPlacemark alloc]
initWithCoordinate:geocodedPlacemark.location.coordinate
addressDictionary:geocodedPlacemark.addressDictionary];
// Create a map item for the geocoded address to pass to Maps app
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:geocodedPlacemark.name];
// Set the directions mode to "Driving"
// Can use MKLaunchOptionsDirectionsModeWalking instead
NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving};
// Get the "Current User Location" MKMapItem
MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];
// Pass the current location and destination map items to the Maps app
// Set the direction mode in the launchOptions dictionary
[MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] launchOptions:launchOptions];
}];
}
//iOS 4/5:
else
{
NSString *mapsURL = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", [addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
...
这篇关于如何在iOS 6中启动具有特定地址的iOS Maps App?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!