如何使用当前位置作为起始地址调用iPhone地图

时间:2009-02-23 07:11:15

标签: ios objective-c google-maps

我知道可以通过在带有位置字符串或纬度/经度的参数openURLsaddr的Google地图网址上调用daddr来启动iPhone地图应用程序(请参阅下面的示例) 。

但我想知道是否可以将起始地址设为“当前位置”地图书签,以便我可以使用地图应用的位置处理代码。我的谷歌搜索一直没有结果。

例如:

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

除了要调用当前位置书签代替myLatLong

16 个答案:

答案 0 :(得分:133)

Pre iOS 6

您需要使用核心位置来获取当前位置,但是使用该纬度/长对,您可以使用地图将您从那里路由到街道地址或位置。像这样:

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=%@"网址,则see this link that I provided in comments below了解如何本地化当前+位置字符串。但是,您正在利用另一个未记录的功能,正如Jason McCreary在下面指出的那样,它可能在将来的版本中无法可靠地运行。


iOS 6更新

最初,地图使用了Google地图,但现在,Apple和Google都有单独的地图应用。

1)如果您希望使用Google地图应用进行路线,请使用the comgooglemaps URL scheme

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

2)要使用Apple地图,您可以使用适用于iOS 6的新MKMapItem课程。See the Apple API docs here

基本上,如果路由到目的地坐标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];

为了在相同的代码中同时支持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 )。

答案 1 :(得分:21)

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

答案 2 :(得分:11)

答案 3 :(得分:10)

您可以使用预处理器#define,如:

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

答案 4 :(得分:5)

由于沙盒,您无权访问地图应用程序的书签。

相反,请使用Core Location自行确定当前位置。然后在您构建的URL中使用该位置(lat和long)来打开Maps。

答案 5 :(得分:4)

我建议您查看CMMapLauncher,这是我用于启动Apple,Google和其他具有特定映射请求的iOS地图应用程序而构建的迷你库。使用CMMapLauncher,获得问题中指示的代码将是:

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

正如您所看到的,它还封装了iOS 6和iOS之间所需的版本检查。其他

答案 6 :(得分:3)

嘿,因为iOS6已经出局了!

苹果以糟糕的方式做了一些非凡的事情(从我的观点来看)。

Apple的地图已启动,对于运行iOS 6的设备,如果您希望iDevice打开本机Plan应用程序,则不应使用maps.google.com/?q=。现在它将是maps.apple.com/?q=

因此开发人员不需要做太多工作,友好的maps.apple.com服务器会将所有非Apple设备重定向到maps.google.com,因此更改是透明的。

这样我们开发者只需要将所有谷歌查询字符串切换为苹果查询字符串。 这是我不喜欢的。

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

我正在使用PHP,因此我使用了opensource Mobile Detect库:http://code.google.com/p/php-mobile-detect/

只需使用isiPad伪方法作为布尔getter,你就完成了,你不会将谷歌转换为苹果; - )

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

干杯!

答案 7 :(得分:2)

您现在只能通过移动设备上的网址以html格式执行此操作。这是一个example。很酷的是,如果你把它变成一个二维码,你就可以通过手机扫描它来让人从任何地方获得指示。

答案 8 :(得分:2)

真正的解决方案可以在这里找到。 Z5 Concepts iOS Development Code Snippet

它只需要一点点编码。

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

答案 9 :(得分:2)

对于iOS6,Apple文档建议使用等效的maps.apple.com URL方案

所以使用

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

Apple Maps URL方案有大量其他受支持的参数:Apple URL Scheme Reference

如果代码的其他部分中包含条件代码,则可以使用这些iOS版本检测宏。 iOS version macros

答案 10 :(得分:2)

如果您不想要求位置权限且没有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,当前位置需要使用正确的语言。我使用了帖子http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

中的LocalizedCurrentLocation

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

请记住添加CoreLocation.framework和MapKit.framework

答案 11 :(得分:1)

对于iOS6 Maps App,您只需使用上面发布的相同网址即可 http://maps.google.com/maps?saddr=%f,%f&daddr=%@

但是您使用包含maps://的网址而不是Google地图网址,从而生成以下网址:maps://saddr=%f,%f&daddr=%@.

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

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

答案 12 :(得分:1)

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

  

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

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

答案 13 :(得分:1)

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

答案 14 :(得分:0)

我在另一个帖子上回答了这个问题。 (Current Location doesn't work with Apple Maps IOS 6)。您需要先获取当前位置的坐标,然后使用它来创建地图网址。

答案 15 :(得分:0)

如果您不提供源位置,则会将当前位置作为来源。请尝试以下代码 -

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

UIApplication.shared.openURL(URL(string:urlString)!)