我正在 Flutter 中使用 url_launcher 包在 Android 和 iOS 上打开 Google 地图或 Apple 地图。到目前为止,它在Android设备上完美运行;但是,我在尝试在 iOS 上启动时遇到了问题。如果适用,我想为用户提供选择(可能从底部工作表?)要使用哪个地图应用程序的选项,但现在我只关心使其在 iOS 上运行。
\n\n我已在 Info.plist 文件中包含了必要的 LSApplicationQueriesSchemes。我研究了谷歌和苹果的正确网址方案,我相信它们是正确的(当然有待审查)。我已经咨询过有关此问题的其他 SO 帖子,但没有找到运气。
\n\nFuture<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\nimport \'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\nVERBOSE-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
您需要遵循此文档中的 Apple 地图 URL 方案。要执行搜索,q
应使用参数。
'http://maps.apple.com/?q=Place+Name'
要使用纬度和经度,可以使用ll
或参数。sll
请注意,使用sll
将搜索具有指定坐标的位置。
'http://maps.apple.com/?ll=$lat,$long'
您可以探索的另一个选项是使用maps_launcher插件。该插件会根据您使用的平台自动处理地图查询。
归档时间: |
|
查看次数: |
3248 次 |
最近记录: |