Jak utworzyć link dla wszystkich urządzeń mobilnych, który otwiera google maps z trasą zaczynającą się w bieżącej lokalizacji, wyznaczającą dane miejsce?

Myślałem, że to nie będzie tak trudne, aby dowiedzieć się, ale wygląda na to, że nie jest łatwo znaleźć niesamowity artykuł cross device, jak można się spodziewać.

Chcę utworzyć link, który otwiera przeglądarkę urządzenia mobilnego i przegląda Mapy google lub otwiera aplikację maps (Apple Maps lub Google Maps) i bezpośrednio rozpoczyna trasę, tj.: start w bieżącej lokalizacji, koniec w danym punkcie (lat/long).

Mogę przetestować na dwóch urządzeniach (obok browserstacka), Androidzie i iPhone.

Poniższy link działa tylko na Androidzie:

<a href="http://maps.google.com/maps?daddr=lat,long&amp;ll=">Take me there!</a>

Klikając ten link w Chrome iPhone ' a, to dziwnie otwiera Google Maps w wersji desktopowej z reklamami w aplikacji mobilnej...

Ten działa tylko na iOS, otwierając Apple Maps z prośbą o podanie lokalizacji początkowej (mogę wybrać "bieżącą lokalizację") i rozpocząć route = pożądane zachowanie. Kliknięcie tego linku całkowicie nie powiedzie się na Androidzie:

<a href="maps://maps.google.com/maps?daddr=lat,long&amp;ll=">Take me there!</a>

Zwróć uwagę na mapy: / / protokół.

Czy istnieje eleganckie urządzenie cross sposób na stworzenie takiego połączenia? Jeden link, który działa na wszystkich głównych komórkach?

Dzięki

UPDATE: Solution found (kinda)

Oto, co wymyśliłem. Nie do końca to sobie wyobrażałem, choć działa.
var ua = navigator.userAgent.toLowerCase(),
    plat = navigator.platform,
    protocol = '',
    a,
    href;

$.browser.device = ua.match(/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera/i) ? ua.match(/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera/i)[0] : false;


if ($.browser.device) {
    switch($.browser.device) {
        case 'iphone':
        case 'ipad':
        case 'ipod':
            function iOSversion() {
              if (/iP(hone|od|ad)/.test(navigator.platform)) {
                // supports iOS 2.0 and later: <http://bit. ly/TJjs1V>
                var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
                return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
              }
            }

            var ver = iOSversion() || [0];

            if (ver[0] >= 6) {
              protocol = 'maps://';
            }
            else {
                protocol = 'http://maps.google.com/maps';
            }
        break;

        case 'android':
        default:
            protocol = 'http://maps.google.com/maps';
        break;
    }

a.attr('href', protocol + href)

Protokół maps:// jest schematem url dla aplikacji Apple maps, która zacznie działać tylko na ios 6 lub nowszym. Istnieją sposoby, aby sprawdzić, czy gmaps jest zainstalowany, a następnie wybrać, co zrobić z adresem url, ale to było trochę za dużo, jak na to, co zamierzałem. Więc właśnie skończyłem tworzyć mapy: / / lub maps.google.com / link, korzystając z powyższych parametrów.

** UPDATE * *

Niestety, $.przeglądarka.urządzenie nie działa od jquery 1.9 (źródło - http://api.jquery.com/jquery.browser )

Author: Fenix Aoras, 2013-09-11

8 answers

Uhmm, nie pracowałem wiele z telefonami, więc nie wiem, czy to będzie działać, ale tylko z punktu widzenia html / javascript można po prostu otworzyć inny adres url w zależności od tego, co urządzenie użytkownika jest?

<a style="cursor: pointer;" onclick="myNavFunc()">Take me there!</a>

function myNavFunc(){
    // If it's an iPhone..
    if( (navigator.platform.indexOf("iPhone") != -1) 
        || (navigator.platform.indexOf("iPod") != -1)
        || (navigator.platform.indexOf("iPad") != -1))
         window.open("maps://maps.google.com/maps?daddr=lat,long&amp;ll=");
    else
         window.open("http://maps.google.com/maps?daddr=lat,long&amp;ll=");
}
 69
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 11:50:53

[4]} Co ciekawe, linki otwierają się bezpośrednio w Apple Maps na urządzeniu z systemem iOS lub przekierowują do Google Maps w inny sposób( który jest przechwytywany na urządzeniu z Androidem), więc możesz stworzyć ostrożny adres URL, który będzie działał poprawnie w obu przypadkach za pomocą adresu URL "Apple Maps", takiego jak:]}

http://maps.apple.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA

Można też użyć adresu URL Google Maps bezpośrednio (bez komponentu URL /maps), aby otworzyć go bezpośrednio w Google Maps na urządzeniu z Androidem lub w mobilnej sieci Google Maps na iOS urządzenie:

http://maps.google.com/?daddr=1+Infinite+Loop,+Cupertino+CA

 19
Author: Alex Pretzlav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 22:09:19

Po prostu wpadłem na to pytanie i znalazłem tutaj wszystkie odpowiedzi Wziąłem niektóre z powyższych kodów i zrobiłem prostą funkcję js, która działa na android i iphone (obsługuje prawie każdy android i iPhone).

  function navigate(lat, lng) {
    // If it's an iPhone..
    if ((navigator.platform.indexOf("iPhone") !== -1) || (navigator.platform.indexOf("iPod") !== -1)) {
      function iOSversion() {
        if (/iP(hone|od|ad)/.test(navigator.platform)) {
          // supports iOS 2.0 and later: <http://bit.ly/TJjs1V>
          var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
          return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
        }
      }
      var ver = iOSversion() || [0];

      if (ver[0] >= 6) {
        protocol = 'maps://';
      } else {
        protocol = 'http://';

      }
      window.location = protocol + 'maps.apple.com/maps?daddr=' + lat + ',' + lng + '&amp;ll=';
    }
    else {
      window.open('http://maps.google.com?daddr=' + lat + ',' + lng + '&amp;ll=');
    }
  }

Html:

 <a onclick="navigate(31.046051,34.85161199999993)" >Israel</a>
 11
Author: talsibony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-23 04:50:52

To działa dla mnie na wszystkich urządzeniach [ iOS, Android i Windows Mobile 8.1].

Nie wygląda to na najlepszy sposób... ale nie może być prostsze:)
<a href="bingmaps:?cp=18.551464~73.951399">
 <a href="http://maps.apple.com/maps?q=18.551464, 73.951399"> 
   Open Maps
 </a>
</a>

Http://jsbin.com/dibeq

 9
Author: deepakssn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 11:27:45
if (navigator.geolocation) { //Checks if browser supports geolocation
navigator.geolocation.getCurrentPosition(function (position) {                                                                                            
 var latitude = position.coords.latitude;                    //users current
 var longitude = position.coords.longitude;                 //location
 var coords = new google.maps.LatLng(latitude, longitude); //Creates variable for map coordinates
 var directionsService = new google.maps.DirectionsService();
 var directionsDisplay = new google.maps.DirectionsRenderer();
 var mapOptions = //Sets map options
 {
   zoom: 15,  //Sets zoom level (0-21)
   center: coords, //zoom in on users location
   mapTypeControl: true, //allows you to select map type eg. map or satellite
   navigationControlOptions:
   {
     style: google.maps.NavigationControlStyle.SMALL //sets map controls size eg. zoom
   },
   mapTypeId: google.maps.MapTypeId.ROADMAP //sets type of map Options:ROADMAP, SATELLITE, HYBRID, TERRIAN
 };
 map = new google.maps.Map( /*creates Map variable*/ document.getElementById("map"),    mapOptions /*Creates a new map using the passed optional parameters in the mapOptions parameter.*/);
 directionsDisplay.setMap(map);
 directionsDisplay.setPanel(document.getElementById('panel'));
 var request = {
   origin: coords,
   destination: 'BT42 1FL',
   travelMode: google.maps.DirectionsTravelMode.DRIVING
 };

 directionsService.route(request, function (response, status) {
   if (status == google.maps.DirectionsStatus.OK) {
     directionsDisplay.setDirections(response);
   }
 });
 });
 }
 6
Author: Sudharsun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 05:01:02

Cóż, nie, od potencjalnego dewelopera iOS, są dwa linki, które Wiem, że otworzą aplikację Maps na iPhone

Na iOS 5 i niższych: http://maps.apple.com?q=xxxx

Na iOS 6 i nowszych: http://maps.google.com?q=xxxx

I to tylko na Safari. Chrome przekieruje Cię na stronę Google Maps.

Poza tym będziesz musiał użyć schematu URL, który w zasadzie bije cel, ponieważ żaden android nie pozna tego protokołu.

Możesz chcieć wiedzieć, dlaczego Safari otwiera aplikację Maps i Chrome przekierowuje mnie na stronę?

Cóż, ponieważ safari jest wbudowaną przeglądarką stworzoną przez apple i może wykryć powyższy adres URL. Chrome to "tylko kolejna aplikacja" i musi być zgodny z ekosystemem iOS. Dlatego jedynym sposobem komunikowania się z innymi aplikacjami jest użycie schematów URL.

 2
Author: Segev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-15 19:45:37

Na podstawie dokumentacji parametr origin jest opcjonalny i domyślnie odpowiada lokalizacji użytkownika.

... Defaults to most relevant starting location, such as user location, if available. If none, the resulting map may provide a blank form to allow a user to enter the origin....

Ex: https://www.google.com/maps/dir/?api=1&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling

Dla mnie to działa na pulpicie, IOS i Android.

 1
Author: Koni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-18 06:33:30

Stwierdziłem, że to działa na wszystkich płaszczyznach:

<a href="https://www.google.com/maps/place/1+Fake+Street,+City+Province/State>Get Directions</a>

Dla komputerów stacjonarnych / laptopów użytkownik musi kliknąć wskazówki, gdy ładuje się Mapa, ale z moich testów wszystkie urządzenia mobilne załadują ten link w aplikacji Google Maps bez trudności.

 0
Author: noakelstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 02:54:58