web-dev-qa-db-fra.com

Vérifier si le schéma d'URL est supporté en javascript

Est-il possible de vérifier si un modèle d'URL est actuellement enregistré sur le téléphone ... avec JavaScript?

57
jackb

Non, pas d'une page Web.

2
Andrew Grant

Pas de façon transparente… .. Mais il existe un moyen similaire à celui de vérifier si une fenêtre contextuelle a été bloquée ou non.

Lorsque vous essayez un modèle d'URL qui n'est pas pris en charge, Safari avertit l'utilisateur qu'il ne sait pas quoi faire avec et reste sur la même page.

Donc, si vous avez donné à votre appel d’appel un délai d’activation, disons 300 ms, puis faites quelque chose d’autre pour répondre à la non-existence du schéma.

Ce n'est pas la plus jolie mais ça marche:

function startIThrown(){
  document.location = 'ithrown://restart';
  setTimeout(function(){
    if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
      document.location = 'http://iTunes.Apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
    }
  }, 300);
}

<a href="#" onclick="startIThrown()">Restart iThrown</a>
58
Maarten

Voici une solution qui ne montre pas le popup lorsque vous revenez de l'application, elle suppose que vous êtes parti depuis plus de 400 ms:

function startiThrown() {
    document.location = appurl;
    var time = (new Date()).getTime();
    setTimeout(function(){
        var now = (new Date()).getTime();

        if((now - time)<400) {
            if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
            document.location = 'http://iTunes.Apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
            }
         }
    }, 300);
}
36
mrahman

J'ai trouvé que pagehide était plus robuste que de dépendre de l'heure du système. Pour ceux d'entre nous qui préfèrent une faveur non-jQuery, voici l'extrait de code. 

  var appurl = 'custom://url';
  var appstore = 'https://iTunes.Apple.com/us/app/your-app';

  var timeout;
  function preventPopup() {
    clearTimeout(timeout);
    timeout = null;
    window.removeEventListener('pagehide', preventPopup);
  }
  function startApp() {
    window.location = appurl;
    timeout = setTimeout(function(){
      if(confirm('You do not seem to have the App installed, do you want to go download it now?')){
        document.location = appstore;
      }
    }, 1000);
    window.addEventListener('pagehide', preventPopup);
  }
11
Thomas - BeeDesk

Une autre excellente solution (au moins dans les dernières versions du navigateur) consiste à vérifier si la fenêtre du navigateur est active au bout d'un court délai. Vous pouvez ainsi afficher une boîte de dialogue à l'utilisateur uniquement si le schéma d'URI ne fonctionne pas.

HTML:

<a class="uri-link" data-uri="qobuzapp://" href="#">URI</a>​

Javascript (en utilisant jQuery ici):

var windowHasFocus;

$(window).focus(function() {
  windowHasFocus = true;
}).blur(function() {
  windowHasFocus = false;
});

function goToUri(uri) {
  window.location = uri;
  setTimeout(function(){
    if (windowHasFocus) {
      if (confirm('You do not seem to have Qobuz installed, do you want to go download it now?')){
        window.location = 'http://www.qobuz.com';
      }
    }
  }, 100);
}

$('a').on('click', function(){ 
  goToUri($(this).data('uri')); 
});​

Voici un jsFiddle qui fonctionne, il suffit de le mettre à jour avec votre propre schéma d’URI: http://jsfiddle.net/mF6TZ/

7
Loris Guignard

À partir de iOS 6.0, Apple a présenté les bannières Smart App qui font ce que la plupart d'entre nous recherchent:

  • Envoyer à l'App Store si l'application n'est pas installée.
  • Ouvrez l'application avec un lien profond spécifique, à l'aide du paramètre app-argument.

Inclure la balise META suivante:

<meta name="Apple-iTunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">

prises à partir d'ici: Guide de contenu Web Safari

6
eladleb

Voici une variation sur les 2 solutions précédentes. Il créera un lien pouvant être ouvert dans Google Chrome. Si cela échoue, il ouvre le lien en utilisant http 

<script>
 function checkChrome(h){
  document.location=h;
  var time = (new Date()).getTime();
  setTimeout(function(){
   var now = (new Date()).getTime();
   if((now-time)<400) {
    if(confirm('Missing Chrome. Download it now?')){
     document.location = 'http://iTunes.Apple.com/us/app/chrome/id535886823?mt=8';
    } else {
     document.location=h.replace('googlechrome','http');
    }
   }
  }, 300);
 }
</script>

<a href="googlechrome://www.google.com" onclick="checkChrome(this.href);return false;">Open Google with Chrome</a>
1
Terry Riegel

Ceci est basé sur la réponse de mrahman. Comme indiqué par JoshNaro new Date () renvoie une mauvaise date lorsqu’il est appelé dans le délai d’expiration Les tests suggèrent que la date n'est pas mise à jour dans les threads démarrés avant la désactivation de l'application.

Un setTimeout supplémentaire appelé après l'activation créera un nouveau thread avec la date du jour.

Cela a été testé sur iOS 8.

function startiThrown() {
    document.location = appurl;
    var time = (new Date()).getTime();
    setTimeout(function(){
        setTimeout(function(){ // <-- start new thread after activation
            var now = (new Date()).getTime();
            if((now - time)<400) {
                if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
                    document.location = 'http://iTunes.Apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
                }
            }
        }, 10); // <-- start new thread after activation
    }, 300);
}
1
k3erg

J'essaie d'utiliser uniquement l'événement 'pagehide', mais cela ne fonctionne pas dans Firefox. J'ai créé cette version ici http://jsfiddle.net/thiagomata/6tvoc4f1/2/ ce qui fonctionne dans Firefox, Google Chrome et Safari. Je n'ai pas encore testé Internet Explorer.

Une chose nécessaire pour que Firefox fonctionne est d’utiliser Iframe pour définir le src. Cela me permet d'appeler l'application sans quitter ma page.

<a class="uri-link" href="#" 
  data-uri-app="myapp://" 
  data-url-app-not-found="http://www.google.com?q=not-found-link"
  >
  Example 1
</a>​
<a class="uri-link" href="#" 
  data-uri-app="myapp://" 
  data-url-app-not-found="http://www.google.com?q=not-found-link"
  data-url-app-found="http://www.google.com?q=found-link"
  >
  Example 2
</a>​
<a class="uri-link"  href="#"
  data-uri-app="notexists://" 
  data-url-app-not-found="http://www.google.com?q=not-exists"
>
  Example 3
</a>​
<iframe id="callapp" style="display:none"></iframe>
0
Thiago Mata

J'ai ce commentaire https://stackoverflow.com/a/18715513/49114 avec un plugin jQuery pour ajouter un lien d'application alternatif à des liens réguliers.

0
Lito