8
votes

Comment ouvrir Apple Maps à l'aide de Flutter / Dart?

Notre application Flutter affiche un certain nombre de lieux en utilisant Google Maps, si disponible, ou bien en utilisant le navigateur local.

Bien que nous ayons déjà téléchargé un code binaire pour iOS qui a été accepté par Apple et publié avec succès dans l'App Store, maintenant que nous avons ajouté quelques emplacements supplémentaires et que nous avons donc tenté de publier une nouvelle version, Apple a rejeté notre binaire , déclarant qu'il est obligatoire d'utiliser "Apple Maps" au lieu de tout ce qui commence par un "G" , comme Google ...

Le message de rejet se lit comme suit:

La fonction de localisation de votre application n'est pas intégrée à la fonctionnalité de cartographie intégrée, qui limite les utilisateurs à une application de cartes tierce.

Prochaines étapes

Pour résoudre ce problème, veuillez réviser votre application pour donner aux utilisateurs la possibilité de lancer l'application native Apple Maps.

J'ai trouvé qu'il existe de la documentation sur une bibliothèque Javascript nommée MapKit JS , qui sert précisément à interagir avec Apple Maps : https://developer.apple.com/maps/mapkitjs/

<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>

Néanmoins, je pourrais vraiment utiliser un peu d'aide pour me connecter avec ce MapKit JS en utilisant DART , au lieu de JAVA, pour notre application Flutter .

Merci infiniment pour votre aimable aide!

Daniel


7 commentaires

Intéressant, AppStore plein d'applications qui utilisent Google Maps


plus intéressant encore, cette même application a déjà été approuvée et publiée il y a moins d'un mois ... ce n'est que maintenant que nous avons ajouté quelques emplacements supplémentaires, qu'Apple a soudainement décidé que nous devions utiliser Apple Maps au lieu de Google Maps. .. la vérité est que notre mise à jour a été rejetée ...


pour justifier leur rejet, ils disent: La fonction de localisation de votre application n'est pas intégrée à la fonctionnalité de cartographie intégrée, qui limite les utilisateurs à une application de cartes tierce. Étapes suivantes Pour résoudre ce problème, veuillez réviser votre application pour donner aux utilisateurs la possibilité de lancer l'application Apple Maps native.


@CostaRica, que voulez-vous dire lorsque vous dites que le problème est survenu lorsque vous avez ajouté d'autres emplacements ?


bonjour, merci de demander ... Je ne suggère pas qu'il existait une connexion technique ou une conséquence de l'ajout de plus d'emplacements ... Ce que j'essayais de dire est le contraire, que le rejet soudain de notre mise à jour d'Apple était arbitraire, car ils n'avaient pas protesté ni rien dit à ce sujet auparavant ... Je mentionne que nous avons ajouté plus de lieux, en utilisant la même logique, car c'est exactement ce que nous avons fait, et c'était la seule différence entre la première version qui a été acceptée, et le second qui a été rejeté ... cela signifie simplement qu'il y avait plus de données, plus de lieux Google ...


dans tous les cas, ce que nous avons fait pour résoudre le problème, c'est que nous avons simplement changé l'URL en Apple Maps, comme ceci: url = " maps.apple.com/?q=IPHE&ll=9.0067418,-79.5300556&z=16 ", au lieu de en utilisant les URL de Google Maps ...


et, bien que nous ne l'ayons pas encore implémenté, nous prévoyons d'offrir les deux options sur une future version de l'App, car à notre avis l'expérience utilisateur est bien meilleure avec Google Maps qu'avec Apple Maps ... je ne crois pas qu'Apple rejetterait une nouvelle version offrant les deux options, parce que c'était littéralement ce qu'ils demandaient, qu'il existait une option disponible pour utiliser Apple Maps ... pour le moment, nous avons simplement remplacé toutes les URL d'Apple Maps, car c'était une solution beaucoup plus simple et nous étions très pressés de publier la nouvelle version de l'App sur l'App Store.


4 Réponses :


2
votes

Juste une idée, mais peut-être que vous pouvez essayer d'utiliser le plugin url_launch pour lancer une URL en suivant les schémas donnés dans les schémas d'url Apple Maps donnés ici: https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/ MapLinks.html # // apple_ref / doc / uid / TP40007899-CH5-SW1


0 commentaires

0
votes

Une solution simple que j'ai trouvée est de remplacer l'URL de google maps par un équivalent maps.apple.com, en utilisant la même fonction url_launcher.

Par exemple, la fonction d'origine de Google Maps:

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';
    }
  }

Est devenu:

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';
    }
  }

Néanmoins, bien que ce changement remplisse l'obligation imposée à Apple d'utiliser son propre logiciel au lieu de celui de la concurrence, l'expérience utilisateur avec Apple Maps est très médiocre, car une fois que l'application Map est affichée, il devient un peu déroutant et difficile de revenir au App d'origine.

Par conséquent, je prévois d'écrire du code qui active les deux options, Apple Maps afin de se conformer à l'application Apple, et également Google Maps afin de fournir une meilleure expérience utilisateur, malgré Apple.

Quoi qu'il en soit, ce dernier n'est qu'une opinion personnelle; le fait est que remplacer l'URL par un équivalent maps.apple.com en utilisant la même fonction launch_url semble acceptable pour se conformer aux exigences d'Apple.


0 commentaires

8
votes

Tout d'abord, installez le plugin url_launcher

Deuxièmement, ajoutez le code ci-dessous dans Info.plist:

 _launchMap(BuildContext context, lat, lng) async {
    var url = '';
    var urlAppleMaps = '';
    if (Platform.isAndroid) {
      url = "https://www.google.com/maps/search/?api=1&query=${lat},${lng}";
    } else {
      urlAppleMaps = 'https://maps.apple.com/?q=$lat,$lng';
      url = "comgooglemaps://?saddr=&daddr=$lat,$lng&directionsmode=driving";
      if (await canLaunch(url)) {
        await launch(url);
      } else {
        throw 'Could not launch $url';
      }
    }

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

Troisièmement:

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

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

Nous pouvons l'utiliser comme ceci:

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


2 commentaires

qu'en est-il de ce code sur Android? ce code lancera-t-il google maps ou lancera-t-il le navigateur?


Merci. J'ai vu que je pouvais éviter d'éditer le fichier Info.plist. Cette modification est-elle obligatoire?



2
votes

Vous pouvez essayer d'utiliser un plugin Map Launcher pour lancer des cartes apple / google en fonction d'une plate-forme

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",
  );
}


0 commentaires