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.


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


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


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.


¡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\"" 

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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.