如何从我自己的本机应用程序中启动 Google Maps iPhone 应用程序?

How can I launch the Google Maps iPhone application from within my own native application?

提问人:davidmytton 提问时间:8/27/2008 最后编辑:Vadim Kotovdavidmytton 更新时间:4/7/2019 访问量:99299

问:

Apple 开发者文档(链接现已失效)解释说,如果您在网页中放置一个链接,然后在 iPhone 上使用 Mobile Safari 时单击它,则 iPhone 标配的 Google 地图应用程序将启动。

如何从我自己的原生 iPhone 应用程序(即不是通过 Mobile Safari 的网页)中启动具有特定地址的相同 Google 地图应用程序,就像在“通讯录”中点击地址启动地图一样?

注意:这仅适用于设备本身。不在模拟器中。

iOS Objective-C 谷歌地图

评论

0赞 pmko 5/28/2012
它将在模拟器中工作,它只是在移动 Safari 中打开。

答:

65赞 Adam Wright 8/27/2008 #1

对于 iOS 5.1.1 及更低版本,请使用 的方法。它将执行正常的iPhone神奇的URL重新解释。所以openURLUIApplication

[someUIApplication openURL:[NSURL URLWithString:@"http://maps.google.com/maps?q=London"]]

应该调用 Google 地图应用。

从 iOS 6 开始,您将调用 Apple 自己的地图应用程序。为此,请使用要显示的位置配置对象,然后向其发送消息。若要从当前位置开始,请尝试:MKMapItemopenInMapsWithLaunchOptions

[[MKMapItem mapItemForCurrentLocation] openInMapsWithLaunchOptions:nil];

为此,您需要与 MapKit 链接(我相信它会提示您访问位置)。

评论

2赞 Carl Coryell-Martin 8/12/2009
带有参数描述的 Wiki: mapki.com/wiki/Google_Map_Parameters Apple iphone 操作系统编程指南 附录 A 列出了 iphone 上支持的参数。
0赞 Tim 2/7/2012
这是泄漏的 - 而不是你应该使用,因为它提供了一个自动释放的对象。[[NSURL alloc] initWithString:][NSURL URLWithString:]
0赞 Adam Wright 2/7/2012
@Tim,已修复 - 谢谢。公平地说,这个答案是什么时候第一次发布的并不重要,因为一旦通话完成,应用程序就会终止。
0赞 Tim 2/8/2012
这总是很重要的!另外,你可以把(因为我不知道实际上不知道除了做一个之外你还会遇到任何其他情况)someUIApplication[UIApplication sharedApplication]UIApplication
2赞 Matt James 12/24/2012
根据 Apple 的文档 (developer.apple.com/library/ios/#featuredarticles/...),您应该使用以下 maps.apple.com: maps.apple.com/?q=London 这将避免根据操作系统版本输入不同的代码,因为在 iOS 5 中,它将重定向到 Google 地图。
32赞 davidmytton 8/27/2008 #2

完全。实现此目的所需的代码如下所示:

UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString: @"http://maps.google.com/maps?q=London"]];

因为根据文档,除非调用 sharedApplication,否则 UIApplication 仅在应用程序委托中可用。

评论

7赞 Matthew McGoogan 3/12/2010
您正在泄漏 NSURL。我建议:[app openURL:[NSURL URLWithString:@“maps.google.com/maps?g=London”]] 以便自动发布。
0赞 Lee 12/7/2008 #3

如果您需要比 Google URL 格式更大的灵活性,或者您希望在应用程序中嵌入地图而不是启动地图应用程序,下面是一个示例

它甚至会为您提供源代码来完成所有嵌入。

29赞 Jane Sales 2/10/2009 #4

要在特定坐标处打开 Google 地图,请尝试以下代码:

NSString *latlong = @"-56.568545,1.256281";
NSString *url = [NSString stringWithFormat: @"http://maps.google.com/maps?ll=%@",
[latlong stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

您可以将 latlong 字符串替换为 CoreLocation 中的当前位置。

您还可以使用 (“z”) 标志指定缩放级别。值为 1-19。下面是一个示例:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@“http://maps.google.com/maps?z=8"]];

评论

2赞 Enzo Tran 10/12/2011
不知何故,它不能用“ll”代替我正常工作,我不得不使用“q”。例如,maps.google.com/maps?q=48.8588054,2.3030451maps.google.com/maps?ll=48.8588054,2.3030451 不指向同一个地址。
2赞 Jane Sales 2/10/2009 #5

对于电话问题,您是否在模拟器上进行测试?这仅适用于设备本身。

此外,openURL 还会返回一个布尔值,您可以使用它来检查运行该功能的设备是否支持该功能。例如,您无法在 iPod Touch 上拨打电话 :-)

13赞 Harry Love 11/14/2009 #6

以下是地图链接的 Apple URL 方案参考: https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html

创建有效地图链接的规则如下:

  • 域必须是 google.com 域,子域必须是 maps 或 ditu。
  • 路径必须是 /、/maps、/local 或 /m(如果查询包含 site 作为键,包含 local) 作为值。
  • 路径不能是 /maps/*。
  • 必须支持所有参数。有关支持的参数列表,请参阅表 1**。
  • 如果值是 URL,则参数不能为 q=*(因此不会选取 KML)。
  • 参数不能包含 view=text 或 dirflg=r。

**有关支持的参数列表,请参阅上面的链接。

1赞 Pavel Kurta 12/1/2009 #7

“g”更改为“q”

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http://maps.google.com/maps?q=London"]]
1赞 Tex 7/21/2010 #8

如果您仍然遇到问题,此视频展示了如何从谷歌获取“我的地图”以显示在 iphone 上——然后您可以获取链接并将其发送给任何人,它就可以工作了。

http://www.youtube.com/watch?v=Xo5tPjsFBX4

0赞 RAVI 4/3/2012 #9

如果您需要比 Google URL 格式更灵活的功能,或者您想在应用程序中嵌入地图而不是启动地图应用程序,可以在 https://sourceforge.net/projects/quickconnect 中找到示例。

18赞 Michael Baltaks 12/13/2012 #10

现在还有 App Store 的 Google Maps 应用程序,记录在 https://developers.google.com/maps/documentation/ios/urlscheme

因此,您首先要检查它是否已安装:

[[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString:@"comgooglemaps://"]];

然后,您可以有条件地替换为 .http://maps.google.com/maps?q=comgooglemaps://?q=

0赞 3shmaoy 6/10/2013 #11

iPhone4 iOS的6.0.1 (10A523)

适用于Safari和Chrome。 两个最新版本到现在(2013 年 6 月 10 日)。

下面的 URL 方案也有效。 但是,如果Chrome仅在页面内部工作,则无法从地址栏中工作。

地图:q=GivenTitle@latitude,经度

0赞 Mannam Brahmaiah 7/18/2016 #12
**Getting Directions between 2 locations**

        NSString *googleMapUrlString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%@,%@&daddr=%@,%@", @"30.7046", @"76.7179", @"30.4414", @"76.1617"];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:googleMapUrlString]];
10赞 Ruchin Somal 12/30/2016 #13

如果您使用的是ios 10,请不要忘记在Info.plist中添加查询方案

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>comgooglemaps</string>
</array>

如果您使用的是 objective-c

if ([[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString:@"comgooglemaps:"]]) {
    NSString *urlString = [NSString stringWithFormat:@"comgooglemaps://?ll=%@,%@",destinationLatitude,destinationLongitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
    } else { 
    NSString *string = [NSString stringWithFormat:@"http://maps.google.com/maps?ll=%@,%@",destinationLatitude,destinationLongitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:string]];
    }

如果您使用的是 swift 2.2

if UIApplication.sharedApplication().canOpenURL(NSURL(string: "comgooglemaps:")!) {
    var urlString = "comgooglemaps://?ll=\(destinationLatitude),\(destinationLongitude)"
    UIApplication.sharedApplication().openURL(NSURL(string: urlString)!)
}
else {
    var string = "http://maps.google.com/maps?ll=\(destinationLatitude),\(destinationLongitude)"
    UIApplication.sharedApplication().openURL(NSURL(string: string)!)
}

如果您使用的是 swift 3.0

if UIApplication.shared.canOpenURL(URL(string: "comgooglemaps:")!) {
    var urlString = "comgooglemaps://?ll=\(destinationLatitude),\(destinationLongitude)"
    UIApplication.shared.openURL(URL(string: urlString)!)
}
else {
    var string = "http://maps.google.com/maps?ll=\(destinationLatitude),\(destinationLongitude)"
    UIApplication.shared.openURL(URL(string: string)!)
}
1赞 DURGESH 3/7/2017 #14

要移动到谷歌地图,请使用此 API 并发送目的地纬度和经度

NSString* addr = nil;
     addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", destinationLat,destinationLong];

NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
2赞 Meet Doshi 12/27/2017 #15

只需调用此方法并将 Google Maps URL Scheme 添加到与此答案相同的 .plist 文件中。

斯威夫特-4 :-

func openMapApp(latitude:String, longitude:String, address:String) {

    var myAddress:String = address

    //For Apple Maps
    let testURL2 = URL.init(string: "http://maps.apple.com/")

    //For Google Maps
    let testURL = URL.init(string: "comgooglemaps-x-callback://")

    //For Google Maps
    if UIApplication.shared.canOpenURL(testURL!) {
        var direction:String = ""
        myAddress = myAddress.replacingOccurrences(of: " ", with: "+")

        direction = String(format: "comgooglemaps-x-callback://?daddr=%@,%@&x-success=sourceapp://?resume=true&x-source=AirApp", latitude, longitude)

        let directionsURL = URL.init(string: direction)
        if #available(iOS 10, *) {
            UIApplication.shared.open(directionsURL!)
        } else {
            UIApplication.shared.openURL(directionsURL!)
        }
    }
    //For Apple Maps
    else if UIApplication.shared.canOpenURL(testURL2!) {
        var direction:String = ""
        myAddress = myAddress.replacingOccurrences(of: " ", with: "+")

        var CurrentLocationLatitude:String = ""
        var CurrentLocationLongitude:String = ""

        if let latitude = USERDEFAULT.value(forKey: "CurrentLocationLatitude") as? Double {
            CurrentLocationLatitude = "\(latitude)"
            //print(myLatitude)
        }

        if let longitude = USERDEFAULT.value(forKey: "CurrentLocationLongitude") as? Double {
            CurrentLocationLongitude = "\(longitude)"
            //print(myLongitude)
        }

        direction = String(format: "http://maps.apple.com/?saddr=%@,%@&daddr=%@,%@", CurrentLocationLatitude, CurrentLocationLongitude, latitude, longitude)

        let directionsURL = URL.init(string: direction)
        if #available(iOS 10, *) {
            UIApplication.shared.open(directionsURL!)
        } else {
            UIApplication.shared.openURL(directionsURL!)
        }

    }
    //For SAFARI Browser
    else {
        var direction:String = ""
        direction = String(format: "http://maps.google.com/maps?q=%@,%@", latitude, longitude)
        direction = direction.replacingOccurrences(of: " ", with: "+")

        let directionsURL = URL.init(string: direction)
        if #available(iOS 10, *) {
            UIApplication.shared.open(directionsURL!)
        } else {
            UIApplication.shared.openURL(directionsURL!)
        }
    }
}

希望,这就是你要找的。如有任何疑虑,请回复我。:)

评论

0赞 iSrinivasan27 1/24/2018
它不起作用。我讲述了这个场景。单击按钮时,我使用 saddr 和 daddr 传递 url 并调用 UIApplication.shared.canOpenURL(unwrappedURL)。任何帮助
0赞 Meet Doshi 1/24/2018
在模拟器中,您没有谷歌地图应用程序。所以你的 else 条件将被执行。URL 将在 SAFARI 浏览器中打开。请在设备上卸载谷歌地图应用程序,检查一下。它的工作原理与模拟器相同。
0赞 iSrinivasan27 1/24/2018
谢谢,有人问题外话。如何检查 iphone 中是否安装了 Gmap
0赞 Meet Doshi 1/24/2018
看起来您还没有使用过iPhone。只需打开Appstore,搜索Google地图即可。并检查是否有安装选项或打开应用程序选项。另一种选择是,通过在iPhone主屏幕中按下手势,直接在打开时搜索谷歌地图应用程序。
0赞 iSrinivasan27 1/24/2018
是的,我不是,而是更好的安卓用户。我想我没有正确地提出问题。如何通过代码检查 iPhone 中是否安装了 Google 地图应用程序?打开它或重定向到 App Store 使用
0赞 Abhirajsinh Thakore 2/19/2019 #16

与 Swift 4 一样的工作代码:

第 1 步 - 将以下内容添加到 info.plist

<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
</array>

第 2 步 - 使用以下代码显示 Google 地图

    let destinationLatitude = "40.7128"
    let destinationLongitude = "74.0060"

    if UIApplication.shared.canOpenURL(URL(string: "comgooglemaps:")!) {
        if let url = URL(string: "comgooglemaps://?ll=\(destinationLatitude),\(destinationLongitude)"), !url.absoluteString.isEmpty {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }else{
        if let url = URL(string: "http://maps.google.com/maps?ll=\(destinationLatitude),\(destinationLongitude)"), !url.absoluteString.isEmpty {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }