【问题标题】:Url_Launcher to open any Maps Application on iOSUrl_Launcher 在 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 显然更喜欢这种格式。

标签: ios flutter


【解决方案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 插件。该插件会根据您使用的平台自动处理地图查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多