Url_Launcher 在 iOS 上打开任何地图应用程序
Posted
技术标签:
【中文标题】Url_Launcher 在 iOS 上打开任何地图应用程序【英文标题】:Url_Launcher to open any Maps Application on iOS 【发布时间】:2019-09-12 20:28:21 【问题描述】:我正在使用 Flutter 中的 url_launcher 包在 android 和 ios 上打开 Google Maps 或 Apple Maps。到目前为止,它在 Android 设备上运行良好;但是,我在尝试在 iOS 上启动时遇到了问题。如果适用,我想让用户选择(可能从底部表格中选择?)要使用哪个映射应用程序,但现在我只关心使其在 iOS 上正常运行。
我在 Info.plist 文件中包含了必要的 LSApplicationQueriesSchemes。我已经研究了 Google 和 Apple 的正确 url 方案,我相信它们是正确的(当然还有待审查)。我已经咨询了有关此问题的其他 SO 帖子,但没有找到运气。
Future<bool> launchMap(String addressLine1) async
String urlGoogleMaps =
"https://www.google.com/maps/search/?api=1&query=$addressLine1";
String urlAppleMaps = "https://maps.apple.com/?query=$addressLine1";
if (await canLaunch(urlGoogleMaps))
print('launching google url');
await launch(urlGoogleMaps);
return true;
else if (await canLaunch(urlAppleMaps))
print('launching apple url');
await launch(urlAppleMaps);
return true;
else
throw 'Could not launch maps';
如前所述 - 在我的 Info.plist 中:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
<string>waze</string>
</array>
这是 onTap 部分:
InkWell(
child: Text(
orderDetailModel.address().addressLine1,
style: TextStyle(
color: Colors.white,
fontSize: screenAwareSize(15, 30, context),
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
onTap: () => launchMap(orderDetailModel
.address()
.addressLine1 +
orderDetailModel.address().cityStatePostalCode()),
),
我希望当用户点击地址 1 时 Google 地图 URL 会打开。如果 Google 地图不可用,请打开 Apple 地图。目前我收到“未处理的异常:无法启动地图”。
[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Could not launch maps
#0 _OrderDetailsState.launchMap (package:etteo_mobile/widgets/order/order_detail.dart:359:7)
<asynchronous suspension>
#1 _OrderDetailsState.topPart.<anonymous closure> (package:etteo_mobile/widgets/order/order_detail.dart:303:40)
#2 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:635:14)
#3 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:711:32)
#4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
#5 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:365:11)
#6 TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:312:7)
#7 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
#8 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:222:20)
#9 _WidgetsFlutterBinding&<…>
编辑 我已经弄清楚如何使用导入打开基于平台的地图
import 'dart:io' show Platform;
并使用以下代码:
launchMap(String addressLine1) async
// Android
var url = 'geo:52.32,4.917';
if (Platform.isIOS)
// iOS
url = 'http://maps.apple.com/?q=$addressLine1';
if (await canLaunch(url))
await launch(url);
else
throw 'Could not launch $url';
但是,现在我认为我遇到的问题是从 addressLine1 输入解析地址,我收到以下消息。
VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Could not launch http://maps.apple.com/?q=123 Main StreetAlpharetta GA 30022
#0 _OrderDetailsState.launchMap (package:etteo_mobile/widgets/order/order_detail.dart:374:7)
<asynchronous suspension>
#1 _OrderDetailsState.topPart.<anonymous closure> (package:etteo_mobile/widgets/order/order_detail.dart:304:40)
#2 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:635:14)
#3 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:711:32)
#4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
#5 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:365:11)
#6 TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:312:7)
#7 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
#8 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestur<…>
其他人以前经历过这种情况吗?我是否使用了正确的苹果地图查询参数 (q=)?
谢谢
已修复
launchMap(String addressLine1) async
// From a query
final query = '$addressLine1';
var addresses = await Geocoder.local.findAddressesFromQuery(query);
Address first = addresses.first;
//print("$first.featureName : $first.coordinates");
// Android
var url = 'https://www.google.com/maps/search/?api=1&query=$addressLine1';
if (Platform.isIOS)
// iOS
url =
'http://maps.apple.com/?q=$first.coordinates.latitude,$first.coordinates.longitude';
if (await canLaunch(url))
await launch(url);
else
throw 'Could not launch $url';
【问题讨论】:
查询参数(“q”)正确。你在传递 url 编码参数吗?例如查询中没有空格 @sukhi 我最终对地址进行了地理编码并传入了纬度,很长的路。 Apple url 显然更喜欢这种格式。 【参考方案1】:您需要遵循 doc 中的 Apple Maps URL Scheme。要执行搜索,应使用q
参数。
'http://maps.apple.com/?q=Place+Name'
要使用纬度和经度,可以使用ll
或sll
参数。请注意,使用sll
将搜索具有指定坐标的位置。
'http://maps.apple.com/?ll=$lat,$long'
您可以探索的另一个选项是使用maps_launcher 插件。该插件会根据您使用的平台自动处理地图查询。
【讨论】:
以上是关于Url_Launcher 在 iOS 上打开任何地图应用程序的主要内容,如果未能解决你的问题,请参考以下文章
带有多个电话号码的 Flutter url_launcher
调用 url_launcher 模块打开外部浏 览器 打开外部应用 拨打电话 发送短信