如何使用Flutter / Dart打开Apple Map?

时间:2019-03-27 19:23:49

标签: ios dart flutter mapkit

我们的Flutter应用使用Google地图(如果有)或使用本地浏览器显示了多个位置。

尽管我们之前已经上传了iOS的二进制代码,该代码已被Apple接受并成功发布到App Store,但现在我们添加了更多位置,并试图发布新版本,但 Apple拒绝了我们的二进制文件,指出必须使用“ Apple Maps” 而不是以“ G” 开头的任何内容,例如 Google ...

拒绝消息如下:

  
    

您的应用的位置信息功能未与内置的地图功能集成在一起,这将用户限制为第三方地图应用。

         

后续步骤

         

要解决此问题,请修改您的应用,以使用户可以选择启动本机Apple Maps应用。

  

我发现,存在一些有关名为 MapKit JS 的Javascript库的文档,该文档恰好用于与 Apple Maps 进行交互的目的: {{3 }}

<script src="https://cdn.apple-mapkit.com/mk/5.x.x/mapkit.js"></script>

<script>
        mapkit.init({
            authorizationCallback: function(done) {
                var xhr = new XMLHttpRequest();
                xhr.open("GET", "/services/jwt");
                xhr.addEventListener("load", function() {
                    done(this.responseText);
                });
                xhr.send();
            }
        });

        var Cupertino = new mapkit.CoordinateRegion(
            new mapkit.Coordinate(37.3316850890998, -122.030067374026),
            new mapkit.CoordinateSpan(0.167647972, 0.354985255)
        );
        var map = new mapkit.Map("map");
        map.region = Cupertino;
        </script>

不过,对于我们的 Flutter应用程序,我真的可以使用一些帮助,如何使用 DART 而不是JAVA与该 MapKit JS 连接。 >。

非常感谢您的帮助!

丹尼尔

4 个答案:

答案 0 :(得分:2)

只是一个想法,但也许您可以尝试使用url_launch plugin来按照此处给出的苹果地图网址架构中给出的架构启动网址:https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html#//apple_ref/doc/uid/TP40007899-CH5-SW1

答案 1 :(得分:1)

首先,安装url_plugin

第二:在Info.plist中添加以下代码

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>googlechromes</string>
    <string>comgooglemaps</string>
</array>

第三次:

var urlAppleMaps = 'https://maps.apple.com/?q=$lat,$lng';

if (await canLaunch(urlAppleMaps)) {
  await launch(urlAppleMaps);
} else {
  throw 'Could not launch $url';
}

答案 2 :(得分:1)

您可以尝试使用Map Launcher插件来启动Apple / google地图,具体取决于平台

import 'dart:io';
import 'package:map_launcher/map_launcher.dart';

if (Platform.isIOS) {
  await MapLauncher.launchMap(
    mapType: MapType.apple,
    coords: Coords(31.233568, 121.505504),
    title: "Shanghai Tower",
    description: "Asia's tallest building",
  );
} else {
  await MapLauncher.launchMap(
    mapType: MapType.google,
    coords: Coords(31.233568, 121.505504),
    title: "Shanghai Tower",
    description: "Asia's tallest building",
  );
}

答案 3 :(得分:0)

我发现一个简单的解决方案是使用相同的url_launcher函数,用等效的maps.apple.com替换google maps URL。

例如,谷歌地图的原始功能:

void _mapaBethania() async {
    const url = "https://www.google.com/maps/place/Panamanian+Institute+for+Special+Training/@9.0067418,-79.5300556,17z/data=!3m1!4b1!4m5!3m4!1s0x8faca84549395297:0x9c54b1fdb96ac590!8m2!3d9.0067365!4d-79.5278669";
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Lo sentimos, no es posible abrir: $url';
    }
  }

已成为:

void _mapaBethania() async {
  const url = "https://maps.apple.com/?q=IPHE&ll=9.0067418,-79.5300556&z=16";
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Lo sentimos, no es posible abrir: $url';
    }
  }

尽管,尽管此更改确实履行了苹果公司使用其自己的软件而不是竞争对手的强制性义务,但是使用Apple Maps的用户体验仍然很差,因为一​​旦显示了Map App,它就会变得有些混乱并且难以返回回到原始应用。

因此,我计划编写代码来启用这两个选项,以使Apple Maps符合Apple的执法要求,同时也使Google Maps能够提供更好的用户体验,尽管有Apple。

无论如何,后者只是个人意见;真实的事实是,使用相同的launch_url函数替换maps.apple.com的等效URL似乎可以满足Apple的要求。