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 包在 androidios 上打开 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'

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

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

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

【讨论】:

以上是关于Url_Launcher 在 iOS 上打开任何地图应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何用颤振的 URL_launcher 包发送短信?

带有多个电话号码的 Flutter url_launcher

调用 url_launcher 模块打开外部浏 览器 打开外部应用 拨打电话 发送短信

Flutter--在浏览器打开URL

Flutter web:使用 url_launcher 在 target="_self" 中启动页面

Flutter如何跳转外部地图app导航