Url_Launcher 用于打开 iOS 上的任何地图应用程序

And*_*rew 6 ios flutter

我正在 Flutter 中使用 url_launcher 包在 Android 和 iOS 上打开 Google 地图或 Apple 地图。到目前为止,它在Android设备上完美运行;但是,我在尝试在 iOS 上启动时遇到了问题。如果适用,我想为用户提供选择(可能从底部工作表?)要使用哪个地图应用程序的选项,但现在我只关心使其在 iOS 上运行。

\n\n

我已在 Info.plist 文件中包含了必要的 LSApplicationQueriesSchemes。我研究了谷歌和苹果的正确网址方案,我相信它们是正确的(当然有待审查)。我已经咨询过有关此问题的其他 SO 帖子,但没有找到运气。

\n\n
Future<bool> launchMap(String addressLine1) async {\n    String urlGoogleMaps =\n        "https://www.google.com/maps/search/?api=1&query=$addressLine1";\n    String urlAppleMaps = "https://maps.apple.com/?query=$addressLine1";\n    if (await canLaunch(urlGoogleMaps)) {\n      print(\'launching google url\');\n      await launch(urlGoogleMaps);\n      return true;\n    } else if (await canLaunch(urlAppleMaps)) {\n      print(\'launching apple url\');\n      await launch(urlAppleMaps);\n      return true;\n    } else {\n      throw \'Could not launch maps\';\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

如前所述 - 在我的 Info.plist 中:

\n\n
<key>LSApplicationQueriesSchemes</key>\n    <array>\n        <string>googlechromes</string>\n        <string>comgooglemaps</string>\n        <string>waze</string>\n    </array>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是 onTap 部分:

\n\n
                        InkWell(\n                          child: Text(\n                            orderDetailModel.address().addressLine1,\n                            style: TextStyle(\n                              color: Colors.white,\n                              fontSize: screenAwareSize(15, 30, context),\n                            ),\n                            maxLines: 1,\n                            overflow: TextOverflow.ellipsis,\n                          ),\n                          onTap: () => launchMap(orderDetailModel\n                                  .address()\n                                  .addressLine1 +\n                              orderDetailModel.address().cityStatePostalCode()),\n                        ),\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望当用户单击地址1 时,Google 地图网址会打开。如果 Google 地图不可用,请打开 Apple 地图。目前,我收到“未处理的异常:无法启动地图”。

\n\n
[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Could not launch maps\n#0      _OrderDetailsState.launchMap (package:etteo_mobile/widgets/order/order_detail.dart:359:7)\n<asynchronous suspension>\n#1      _OrderDetailsState.topPart.<anonymous closure> (package:etteo_mobile/widgets/order/order_detail.dart:303:40)\n#2      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:635:14)\n#3      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:711:32)\n#4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)\n#5      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:365:11)\n#6      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:312:7)\n#7      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)\n#8      _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:222:20)\n#9      _WidgetsFlutterBinding&<\xe2\x80\xa6>\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑\n我已经弄清楚如何使用导入打开基于平台的地图

\n\n
import \'dart:io\' show Platform;\n
Run Code Online (Sandbox Code Playgroud)\n\n

并使用以下代码:

\n\n
  launchMap(String addressLine1) async {\n    // Android\n    var url = \'geo:52.32,4.917\';\n    if (Platform.isIOS) {\n      // iOS\n      url = \'http://maps.apple.com/?q=$addressLine1\';\n    }\n    if (await canLaunch(url)) {\n      await launch(url);\n    } else {\n      throw \'Could not launch $url\';\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,现在我认为我遇到的问题是从 addressLine1 输入中解析地址,并且我收到以下消息。

\n\n
VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Could not launch http://maps.apple.com/?q=123 Main StreetAlpharetta GA 30022\n#0      _OrderDetailsState.launchMap (package:etteo_mobile/widgets/order/order_detail.dart:374:7)\n<asynchronous suspension>\n#1      _OrderDetailsState.topPart.<anonymous closure> (package:etteo_mobile/widgets/order/order_detail.dart:304:40)\n#2      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:635:14)\n#3      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:711:32)\n#4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)\n#5      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:365:11)\n#6      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:312:7)\n#7      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)\n#8      _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestur<\xe2\x80\xa6>\n
Run Code Online (Sandbox Code Playgroud)\n\n

其他人以前也经历过这种情况吗?我是否使用了正确的苹果地图查询参数(q=)?

\n\n

谢谢

\n\n

固定的

\n\n
  launchMap(String addressLine1) async {\n    // From a query\n    final query = \'$addressLine1\';\n    var addresses = await Geocoder.local.findAddressesFromQuery(query);\n    Address first = addresses.first;\n    //print("${first.featureName} : ${first.coordinates}");\n\n    // Android\n    var url = \'https://www.google.com/maps/search/?api=1&query=$addressLine1\';\n    if (Platform.isIOS) {\n      // iOS\n      url =\n          \'http://maps.apple.com/?q=${first.coordinates.latitude},${first.coordinates.longitude}\';\n    }\n    if (await canLaunch(url)) {\n      await launch(url);\n    } else {\n      throw \'Could not launch $url\';\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

Oma*_*att 3

您需要遵循此文档中的 Apple 地图 URL 方案。要执行搜索,q应使用参数。

'http://maps.apple.com/?q=Place+Name'

要使用纬度和经度,可以使用ll或参数。sll请注意,使用sll将搜索具有指定坐标的位置。

'http://maps.apple.com/?ll=$lat,$long'

您可以探索的另一个选项是使用maps_launcher插件。该插件会根据您使用的平台自动处理地图查询。