Controlador de protocolo personalizado en cromo

88

¿Cómo configuro un controlador de protocolo personalizado en Chrome? Algo como:

myprotocol: // archivo de prueba

Necesitaría esto para enviar una solicitud a http://example.com?query=testfile y luego enviar el formulario de acceso a mi extensión.

Probador de prueba
fuente
No creo que Chrome sea compatible actualmente con esto, tiene un conjunto bastante limitado de API disponibles para extensiones.
Wladimir Palant

Respuestas:

77

El siguiente método registra una aplicación en un esquema URI. Entonces, puede usar mycustproto: en su código HTML para activar una aplicación local. Funciona en una versión de Google Chrome 51.0.2704.79 m (64 bits).

Utilicé principalmente este método para imprimir documentos en silencio sin que apareciera el cuadro de diálogo de impresión. El resultado es bastante bueno y es una solución perfecta para integrar la aplicación externa con el navegador.

Código HTML (simple):

<a href="mycustproto:Hello World">Click Me</a>

Código HTML (alternativa):

<input id="DealerName" />
<button id="PrintBtn"></button>

$('#PrintBtn').on('click', function(event){
  event.preventDefault();
  window.location.href = 'mycustproto:dealer ' + $('#DealerName').val();
});

El esquema de URI se verá así:

Puede crear el esquema URI manualmente en el registro o ejecutar el archivo "mycustproto.reg" (ver más abajo).

HKEY_CURRENT_USER\Software\Classes
   mycustproto
      (Default) = "URL:MyCustProto Protocol"
      URL Protocol = ""
      DefaultIcon
         (Default) = "myprogram.exe,1"
      shell
         open
            command
               (Default) = "C:\Program Files\MyProgram\myprogram.exe" "%1"

Ejemplo de mycustproto.reg:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\mycustproto]
"URL Protocol"="\"\""
@="\"URL:MyCustProto Protocol\""

[HKEY_CURRENT_USER\Software\Classes\mycustproto\DefaultIcon]
@="\"mycustproto.exe,1\""

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell]

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell\open]

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell\open\command]
@="\"C:\\Program Files\\MyProgram\\myprogram.exe\" \"%1\""

Aplicación de consola C # - myprogram.exe:

using System;
using System.Collections.Generic;
using System.Text;

namespace myprogram
{
  class Program
  {
    static string ProcessInput(string s)
    {
       // TODO Verify and validate the input 
       // string as appropriate for your application.
       return s;
    }

    static void Main(string[] args)
    {
      Console.WriteLine("Raw command-line: \n\t" + Environment.CommandLine);
      Console.WriteLine("\n\nArguments:\n");

      foreach (string s in args)
      {
        Console.WriteLine("\t" + ProcessInput(s));
      }

      Console.WriteLine("\nPress any key to continue...");
      Console.ReadKey();
    }
  }
}

Intente ejecutar el programa primero para asegurarse de que se haya colocado en la ruta correcta:

cmd> "C:\Program Files\MyProgram\myprogram.exe" "mycustproto:Hello World"

Haga clic en el enlace de su página HTML:

Verá una ventana emergente de advertencia por primera vez.

ingrese la descripción de la imagen aquí

Para restablecer la configuración del controlador de protocolo externo en Chrome:

Si alguna vez aceptó el protocolo personalizado en Chrome y desea restablecer la configuración, haga esto (actualmente, no hay una interfaz de usuario en Chrome para cambiar la configuración):

Edite " Estado local " este archivo en esta ruta:

C:\Users\Username\AppData\Local\Google\Chrome\User Data\

o simplemente vaya a:

%USERPROFILE%\AppData\Local\Google\Chrome\User Data\

Luego, busque esta cadena: protocol_handler

Verá el protocolo personalizado desde allí.

Nota: cierre su Google Chrome antes de editar el archivo. De lo contrario, Chrome sobrescribirá el cambio que ha realizado.

Referencia:

https://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx

Jun Xie
fuente
esto parece prometedor, ¿puedo usar este enfoque para imprimir desde una tableta? si es así, cómo lidiar con el registro, etc.en ese caso
Venkat
1
@Venkat Creo que es mejor especificar primero el nombre de la tableta y el sistema operativo (por ejemplo, Surface, iPad, etc.) y ver si otros lo han hecho antes. La solución que publiqué fue para Windows. He visto configuraciones similares para OS X y Linux. Sin embargo, no tenía estos dispositivos / entornos a la mano para experimentar. Primero puede probarlo en Windows para tener una idea básica de cómo funciona. Espero que esto sea de ayuda.
Jun Xie
3
Para el registro, encontré la opción de configuración protocol_handler en el Preferencesarchivo, ubicado en%localappdata%\Google\Chrome\User Data\Default
Babblo
No se puede invocar varios protocolos uno tras otro en una sola llamada de JavaScript dentro de Chrome.
prem
¿Qué pasa si mi clave no se encuentra en el registro? ¿Desde el navegador estoy pidiendo llamar a la aplicación según la clave? aquí, ¿cómo puedo notificar al usuario que la clave no se encuentra en el registro?
Akhil Nair
55

Chrome 13 ahora es compatible con la navigator.registerProtocolHandlerAPI. Por ejemplo,

navigator.registerProtocolHandler(
    'web+custom', 'http://example.com/rph?q=%s', 'My App');

Tenga en cuenta que el nombre de su protocolo debe comenzar con web+, con algunas excepciones para los más comunes (como mailto, etc.). Para obtener más detalles, consulte: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler

Boris Smus
fuente
6
+1 por el hecho de que los protocolos deben comenzar con web + para evitar "SECURITY_ERR: DOM Exception 18"
Catch22
3
¿Cómo funcionan los enlaces torrent:y steam:entonces? ¿Las aplicaciones empaquetadas de Chrome también tienen esta restricción?
Steven Roose
1
@StevenRoose Por lo que puedo decir, Chrome los pasa al sistema operativo. Incluso utilizando la chrome.webNavigationAPI, los tel:enlaces nunca se informan.
PixnBits
Esto no parece funcionar dentro de una aplicación de Chrome y no parece poder redirigir el protocolo dentro de la aplicación. La respuesta mucho mejor es la respuesta de Gordon Williams a continuación.
Karel Bílek
30

Esta pregunta es antigua ahora, pero ha habido una actualización reciente de Chrome (al menos en lo que respecta a las aplicaciones empaquetadas) ...

http://developer.chrome.com/apps/manifest/url_handlers

y

https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/url-handler

Le permite registrar un controlador para una URL (siempre que sea de su propiedad). Lamentablemente, no, myprotocol://pero al menos puede hacerlo http://myprotocol.mysite.comy puede crear una página web allí que dirija a las personas a la aplicación en la tienda de aplicaciones.

Gordon Williams
fuente
¡Muchas gracias por esta respuesta! A diferencia de la respuesta más votada, ¡en realidad responde a la pregunta!
Karel Bílek
10

Así es como lo hice. Su aplicación necesitaría instalar algunas claves de registro en la instalación, luego, en cualquier navegador, puede simplemente vincular a foo: \ anythingHere.txt y abrirá su aplicación y le pasará ese valor.

Este no es mi código, solo algo que encontré en la web al buscar la misma pregunta. Simplemente cambie todo "foo" en el texto a continuación por el nombre de protocolo que desee y cambie también la ruta a su exe.

(ponga esto en un archivo de texto como guardar como foo.reg en su escritorio, luego haga doble clic en él para instalar las claves) ----- Debajo de esta línea se encuentra el archivo .reg (NO incluye esta línea) --- ---

REGEDIT4

[HKEY_CLASSES_ROOT\foo]
@="URL:foo Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\foo\shell]

[HKEY_CLASSES_ROOT\foo\shell\open]

[HKEY_CLASSES_ROOT\foo\shell\open\command]
@="\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\" \"%1\"" 
MuffinMan
fuente
5
Esto no funciona en Chrome, que era la pregunta específica.
Kjetil Watnedal
1
@KjetilWatnedal: Funciona bien en Chrome (al menos en v40 +) y con esta solución. En relación con la pregunta inicial, OP quería que el navegador enviara algo a un sitio automáticamente, aparentemente sin una aplicación de controlador local, lo que de hecho puede no ser posible.
Marcel N.
7
Quiero que todos sepan que su solución, de hecho, funciona en Chrome (probado en 49.0.2623.87 hoy). Sin embargo, encontré que si escribe este protocolo directamente en el navegador (foo: // C: /test.txt), es posible que deba usar ctrl + enter porque el navegador no reconoce inmediatamente el protocolo y el protocolo de búsqueda intercepta la acción antes de que el sistema operativo pueda hacerlo. Sin embargo, ponerlo en un enlace funcionó correctamente.
timmy
@timmy - ¡muchas gracias! Me he estado arrancando los pelos tratando de que los controladores de protocolo funcionen en Chrome; resulta que todo lo que tenía que hacer era usar Ctrl + Enter. ¡Gracias de nuevo!
carril
@timmy muchas gracias, ya pensé que mis usuarios tendrían que quedarse con Internet Explorer
Pipe
2

No estoy seguro de si este es el lugar correcto para mi respuesta, pero como encontré muy pocos hilos útiles y este fue uno de ellos, estoy publicando mi solución aquí.

Problema : quería que Linux Mint 19.2 Cinnamon abriera Evolution al hacer clic en mailtoenlaces en Chromium. Gmail se registró como controlador predeterminado en chrome: // settings / handlers y no pude elegir ningún otro controlador.

Solución : use xdg-settings en la consola

xdg-settings set default-url-scheme-handler mailto org.gnome.Evolution.desktop

La solución se encontró aquí https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution y se adaptó para mi caso.

Peter Schober
fuente
0

abierto

C:\Users\<Username>\AppData\Local\Google\Chrome\User Data\Default

abrir y Preferencesluego buscar excluded_schemes, lo encontrará en 'protocol_handler' elimine este esquema (s) excluido para restablecer Chrome para abrir la URL con la aplicación predeterminada

Abdelrahman Maharek
fuente