w3schools tag tab color attribute javascript browser protocols moniker

javascript - tag - ¿Cómo detectar los manejadores de protocolo del navegador?



title html w3schools (15)

Aquí hay otra respuesta hacky que requeriría (con un poco de suerte) una modificación de su aplicación para ''llamar a casa'' en el momento del lanzamiento.

  1. El usuario hace clic en el enlace, que intenta iniciar la aplicación. Se coloca un identificador único en el enlace, para que se pase a la aplicación cuando se inicia. La aplicación web muestra un spinner o algo de esa naturaleza.
  2. La página web luego comienza a buscar un evento de "hogar de aplicación de teléfono" desde una aplicación con esta misma identificación única.
  3. Cuando se inicia, la aplicación realiza una publicación HTTP en su aplicación web con el identificador único, para indicar la presencia.
  4. O bien la página web ve que la aplicación se lanzó, finalmente, o continúa con una página de "descarga por favor".

Creé un controlador de protocolo URL personalizado.

http://

mailto://

custom://

He registrado una aplicación WinForms para responder en consecuencia. Todo esto funciona genial

Pero me gustaría poder manejar con gracia el caso en el que el usuario aún no tiene instalado el controlador de protocolo URL personalizado.

Para poder hacer esto, necesito poder detectar los controladores de protocolo registrados del navegador, supongo desde JavaScript. Pero no he podido encontrar una forma de sondear la información. Espero encontrar una solución a este problema.

Gracias por cualquier idea que puedas compartir.



Dice que necesita detectar los manejadores de protocolo del navegador, ¿verdad?

¿Qué pasa si hiciste algo como lo que sucede cuando descargas un archivo de sourceforge? Digamos que quieres abrir myapp: // algo. En lugar de simplemente crear un enlace, crear un enlace a otra página HTML a la que se accede a través de HTTP. Luego, en esa página, diga que está intentando abrir la aplicación para ellos. Si no funciona, deben instalar su aplicación, lo que pueden hacer haciendo clic en el enlace que proporcionará. Si funciona, entonces ya está todo listo.


Esta no es una tarea trivial; Una opción podría ser usar código firmado, que podría aprovechar para acceder al registro y / o sistema de archivos (tenga en cuenta que esta es una opción muy costosa ). Tampoco hay una API o especificación unificada para la firma de código, por lo que se le solicitará que genere un código específico para cada navegador de destino. Una pesadilla de apoyo.

Además, sé que Steam , el sistema de entrega de contenido de juegos, tampoco parece haber resuelto este problema.


Esta sería una forma muy , muy hacky de hacer esto ... ¿pero funcionaría esto?

  • Pon el enlace como de costumbre ...
  • Pero adjunte un controlador onclick, que establece un temporizador y agrega un controlador onblur para la ventana
  • (en teoría) si el navegador maneja el enlace (aplicación X) se cargará robando el foco de la ventana ...
  • Si el evento onblur se activa, borra el temporizador ...
  • De lo contrario, en 3-5 segundos deje que se agote el tiempo de espera ... y notifique al usuario "Hmm, parece que no tiene instalada la aplicación Mega Uber Cool ... ¿le gustaría instalarla ahora? (Ok) (Cancelar)"

Lejos de a prueba de balas ... ¿pero podría ayudar?


Este fue un enfoque recomendado para IE por el soporte de Microsoft

http://msdn.microsoft.com/en-us/library/ms537503%28VS.85%29.aspx#related_topics

"Si tiene algún control sobre los binarios instalados en el equipo de un usuario, revisar el UA en el script parece ser un enfoque relevante: HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / Internet Settings / 5.0 / User Agent / Post Platform" - Por el apoyo de M $

Cada página web tiene acceso a la cadena userAgent y si suelta un valor personalizado de plataforma de publicación, detectar esto en javascript utilizando navigator.userAgent es bastante simple.

Afortunadamente, otros navegadores importantes como Firefox y Chrome (salvo Safari :(), no arrojan errores de "página no encontrada" cuando se hace clic en un enlace con un protocolo personalizado y el protocolo no está instalado en la máquina de los usuarios. IE es muy implacable aquí , cualquier truco para hacer clic en un marco invisible o trampa, los errores de JavaScript no funcionan y terminan con un feo error de "página web no se puede mostrar". El truco que utilizamos en nuestro caso es informar a los usuarios con imágenes específicas del navegador que hacen clic en el protocolo personalizado link abrirá una aplicación. Y si no encuentran la aplicación abierta, pueden hacer clic en una página de "instalación." En términos de XD esto es mucho mejor que el enfoque de ActiveX para IE. Para FF y Chrome, simplemente sigue adelante y ejecute el protocolo personalizado sin ninguna detección. Permita que el usuario le diga lo que ve. Para Safari, :( todavía no hay respuestas


HTML5 define el esquema personalizado y los manejadores de contenido (que yo sepa, Firefox es el único implementor hasta ahora), pero desafortunadamente actualmente no hay manera de verificar si ya existe un controlador: se ha proposed , pero no hubo seguimiento. Esto parece ser una característica crítica para utilizar los controladores personalizados de manera efectiva y nosotros, como desarrolladores, debemos llamar la atención sobre este problema para que se implemente.


Intento hacer algo similar y descubrí un truco que funciona con Firefox. Si lo combina con el truco para IE, puede tener uno que funcione en ambos navegadores principales (no estoy seguro de si funciona en Safari y sé que no funciona en Chrome)

if (navigator.appName=="Microsoft Internet Explorer" && document.getElementById("testprotocollink").protocolLong=="Unknown Protocol") { alert("No handler registered"); } else { try { window.location = "custom://stuff"; } catch(err) { if (err.toString().search("NS_ERROR_UNKNOWN_PROTOCOL") != -1) { alert("No handler registered"); } } }

Para que esto funcione, también necesitas tener un enlace oculto en algún lugar de la página, como este:

<a id="testprotocollink" href="custom://testprotocol" style="display: none;">testprotocollink</a>

Es un poco hacky pero funciona. Desafortunadamente, la versión de Firefox todavía muestra la alerta predeterminada que aparece cuando intenta visitar un enlace con un protocolo desconocido, pero ejecutará su código una vez que se haya descartado.


Lo que confiere la solución más fácil es preguntarle al usuario la primera vez.

Usando un diálogo de confirmación de Javascript por ejemplo:

You need this software to be able to read this link. Did you install it ? if yes: create a cookie to not ask next time; return false and the link applies if false: window.location.href = ''/downloadpage/''


No hay una gran manera de navegador cruzado para hacer esto. En IE10 + en Win8 +, una nueva api msLaunchUri permite iniciar un protocolo, de esta manera:

navigator.msLaunchUri(''skype:123456'', function() { alert(''success''); }, function() { alert(''failed''); } );

Si el protocolo no está instalado, se iniciará la devolución de llamada fallida. De lo contrario, se iniciará el protocolo y se iniciará la devolución de llamada exitosa.

Discutiré este tema un poco más aquí: http://blogs.msdn.com/b/ieinternals/archive/2011/07/14/url-protocols-application-protocols-and-asynchronous-pluggable-protocols-oh-my.aspx


Parece que no hay una manera directa a través de javascript para detectar la presencia de una aplicación instalada que ha registrado un controlador de protocolo.

En el modelo de iTunes, Apple proporciona direcciones URL a sus servidores, que luego proporcionan páginas que ejecutan algunos javascript:

http://ax.itunes.apple.com/detection/itmsCheck.js

Por lo tanto, el instalador de iTunes aparentemente despliega complementos para los principales navegadores, cuya presencia luego puede detectarse.

Si su complemento está instalado, entonces puede estar razonablemente seguro de que el redireccionamiento a la URL específica de su aplicación tendrá éxito.


Pude finalmente obtener una solución de navegador cruzado (Chrome 32, Firefox 27, IE 11, Safari 6) trabajando con una combinación de rajeshsegu.com/2012/09/browser-detect-custom-protocols/… y una extensión de Safari super simple. Gran parte de esta solución ha sido mencionada de una forma u otra en esta y en esta otra pregunta .

Aquí está el guión:

function launchCustomProtocol(elem, url, callback) { var iframe, myWindow, success = false; if (Browser.name === "Internet Explorer") { myWindow = window.open('''', '''', ''width=0,height=0''); myWindow.document.write("<iframe src=''" + url + "''></iframe>"); setTimeout(function () { try { myWindow.location.href; success = true; } catch (ex) { console.log(ex); } if (success) { myWindow.setTimeout(''window.close()'', 100); } else { myWindow.close(); } callback(success); }, 100); } else if (Browser.name === "Firefox") { try { iframe = $("<iframe />"); iframe.css({"display": "none"}); iframe.appendTo("body"); iframe[0].contentWindow.location.href = url; success = true; } catch (ex) { success = false; } iframe.remove(); callback(success); } else if (Browser.name === "Chrome") { elem.css({"outline": 0}); elem.attr("tabindex", "1"); elem.focus(); elem.blur(function () { success = true; callback(true); // true }); location.href = url; setTimeout(function () { elem.off(''blur''); elem.removeAttr("tabindex"); if (!success) { callback(false); // false } }, 1000); } else if (Browser.name === "Safari") { if (myappinstalledflag) { location.href = url; success = true; } else { success = false; } callback(success); } }

La extensión de Safari fue fácil de implementar. Consistía en una sola línea de script de inyección:

myinject.js:

window.postMessage("myappinstalled", window.location.origin);

Luego, en la página web de JavaScript, primero debe registrar el evento del mensaje y establecer un indicador si se recibe el mensaje:

window.addEventListener(''message'', function (msg) { if (msg.data === "myappinstalled") { myappinstalledflag = true; } }, false);

Esto supone que la aplicación que está asociada con el protocolo personalizado administrará la instalación de la extensión Safari.

En todos los casos, si la devolución de llamada devuelve falso, debe informar al usuario que la aplicación (es decir, su protocolo personalizado) no está instalada.


Puede usar un iframe incrustado para cambiar automáticamente entre el protocolo personalizado y uno conocido (web o tienda de aplicaciones), consulte https://gist.github.com/2662899


Puedes probar algo como esto:

function OpenCustomLink(link) { var w = window.open(link, ''xyz'', ''status=0,toolbar=0,menubar=0,height=0,width=0,top=-10,left=-10''); if(w == null) { //Work Fine } else { w.close(); if (confirm(''You Need a Custom Program. Do you want to install?'')) { window.location = ''SetupCustomProtocol.exe''; //URL for installer } } }


Si tiene el control del programa que está tratando de ejecutar (el código), una forma de ver si el usuario tuvo éxito al ejecutar la aplicación sería:

  1. Antes de intentar abrir el protocolo personalizado, realice una solicitud de AJAX a un script de servidor que guarde la intención del usuario en una base de datos (por ejemplo, guarde el ID de usuario y lo que quería hacer).

  2. Intente abrir el programa y transmitir los datos de intención.

  3. Haga que el programa solicite al servidor que elimine la entrada de la base de datos (usando los datos de intención para encontrar la fila correcta).

  4. Realice la encuesta de javascript en el servidor por un tiempo para ver si la entrada de la base de datos se ha ido. Si la entrada se ha ido, sabrá que el usuario tuvo éxito al abrir la aplicación, de lo contrario, la entrada permanecerá (puede eliminarla más tarde con cronjob).

No he probado este método, solo lo pensé.