Pregunta

¿Hay alguna forma de verificar si un esquema de URL está registrado actualmente en el teléfono ... con javascript?

¿Fue útil?

Solución

No, no desde una página web.

Otros consejos

No a la perfección. Pero hay una manera similar de verificar si una ventana emergente fue bloqueada o no.

Cuando prueba un esquema de URL que no es compatible, Safari advertirá al usuario que no sabe qué hacer con él y permanecerá en la misma página.

Entonces, si le dio tiempo a su aplicación para que se active, diga 300 ms, y luego haga algo más para responder a la inexistencia del esquema.

No es el más bonito pero funciona:

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>

Aquí hay una solución que no muestra la ventana emergente cuando regresa de la aplicación, asume que ha estado fuera por más 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);
}

El evento pagehide me pareció más robusto que dependiendo de la hora del sistema. Para aquellos de nosotros que prefieren un favor que no sea jQuery, aquí está el fragmento.

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

Otra gran solución (al menos en las últimas versiones del navegador) es verificar si la ventana del navegador tiene el foco después de un corto tiempo de espera, de esta manera puede mostrar un cuadro de diálogo al usuario solo si el esquema URI no funcionó

HTML:

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

Javascript (usando jQuery aquí):

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

Aquí hay un jsFiddle que funciona, solo actualízalo con tu propio esquema URI: http://jsfiddle.net/mF6TZ/

A partir de iOS 6.0, Apple presentó los Smart App Banners que hacen lo que la mayoría de nosotros buscamos:

  • Enviar a App Store si la aplicación no está instalada.
  • Abra la aplicación con un enlace profundo específico, utilizando el parámetro de argumento de aplicación.

Incluya la siguiente metaetiqueta:

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

tomado de aquí: Guía de contenido web de Safari

Aquí hay una variación de las 2 soluciones anteriores. Creará un enlace que se puede abrir en Google Chrome. Si falla, abre el enlace 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>

Esto se basa en la respuesta de mrahman. Como se señaló, JoshNaro new Date () devuelve una fecha incorrecta cuando se llama dentro del tiempo de espera. Las pruebas sugieren que la fecha no se actualiza en los hilos que se inician antes de que la aplicación se desactive.

Un nuevo setTimeout feo llamado después de la activación creará un nuevo hilo con la fecha actual.

Esto se probó en 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);
}

Intento usar solo el evento 'pagehide', pero luego no funciona en Firefox. Creé esta versión aquí http://jsfiddle.net/thiagomata/6tvoc4f1/2/ what Funciona en Firefox, Google Chrome y Safari. Todavía no lo he probado en Internet Explorer.

Una cosa que era necesaria para que funcionara en Firefox, era usar Iframe para configurar el src. Esto me permite llamar a la aplicación sin salir de mi página.

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

Tengo este comentario https://stackoverflow.com/a/18715513/49114 con un complemento jQuery para agregar enlace de aplicación alternativa a enlaces regulares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top