Domanda

Esiste un modo per verificare se uno schema URL è attualmente registrato sul telefono ... con javascript?

È stato utile?

Soluzione

No, non da una pagina web.

Altri suggerimenti

Non perfettamente. Ma esiste un modo simile a verificare se un popup è stato bloccato o meno.

Quando provi uno schema URL che non è supportato, Safari avviserà l'utente che non sa cosa farne e rimarrà sulla stessa pagina.

Quindi, se hai dato alla tua app un po 'di tempo per l'attivazione, dì 300 ms e poi fai qualcos'altro per rispondere alla non esistenza dello schema.

Non è il più bello ma funziona:

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>

Ecco una soluzione che non mostra il popup quando torni dall'app, presuppone che tu sia andato via da più di 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);
}

Ho trovato l'evento pagehide più robusto che in base all'ora del sistema. Per quelli di noi che preferiscono un favore non jQuery, ecco lo snippet.

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

Un'altra ottima soluzione (almeno funzionante nelle ultime versioni del browser) è verificare se la finestra del browser ha lo stato attivo dopo un breve timeout, in questo modo puoi mostrare all'utente una finestra di dialogo solo se lo schema URI non ha funzionato

HTML:

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

Javascript (usando jQuery qui):

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

Ecco un jsFiddle funzionante, basta aggiornarlo con il tuo schema URI: http://jsfiddle.net/mF6TZ/

A partire da iOS 6.0, Apple ha presentato gli Smart App Banners che fanno ciò che la maggior parte di noi sta cercando:

  • Invia ad App Store se l'app non è installata.
  • Apri l'app con un deep link specifico, usando il parametro app-topic.

Includi il seguente meta tag:

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

tratto da qui: Guida al contenuto Web di Safari

Ecco una variante delle precedenti 2 soluzioni. Creerà un collegamento che può essere aperto in Google Chrome. Se fallisce, apre il collegamento usando 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>

Questo si basa sulla risposta di mrahman. Come notato, da JoshNaro nuova data () restituisce una data errata quando viene chiamata all'interno del timeout. I test suggeriscono che la data non viene aggiornata nei thread avviati prima della disattivazione dell'app.

Un brutto setTimeout chiamato dopo l'attivazione creerà un nuovo thread con la data corrente.

Questo è stato testato su 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);
}

Provo a usare solo l'evento 'pagehide', ma poi non funziona in Firefox. Ho creato questa versione qui http://jsfiddle.net/thiagomata/6tvoc4f1/2/ what funziona in Firefox, Google Chrome e Safari. Non ho ancora testato in Internet Explorer.

Una cosa che era necessaria per farlo funzionare in Firefox, era usare Iframe per impostare l'src. Questo mi permette di chiamare l'app senza uscire dalla mia pagina.

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

Ho questo commento https://stackoverflow.com/a/18715513/49114 con un plug-in jQuery da aggiungere collegamento di un'app alternativa a collegamenti regolari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top