Gestore di protocollo personalizzato in cromo


89

Come si configura un gestore di protocollo personalizzato in Chrome? Qualcosa di simile a:

myprotocol: // testfile

Avrei bisogno di questo per inviare una richiesta a http://example.com?query=testfile , quindi inviare l'httpresponse alla mia estensione.


Non penso che Chrome attualmente supporti questo, ha un set piuttosto limitato di API disponibili per le estensioni.
Wladimir Palant

Risposte:


78

Il metodo seguente registra un'applicazione in uno schema URI. Quindi, puoi usare mycustproto: nel tuo codice HTML per attivare un'applicazione locale. Funziona su Google Chrome versione 51.0.2704.79 m (64 bit).

Ho usato principalmente questo metodo per stampare il documento in silenzio senza che la finestra di dialogo di stampa si aprisse. Il risultato è abbastanza buono ed è una soluzione perfetta per integrare l'applicazione esterna con il browser.

Codice HTML (semplice):

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

Codice HTML (alternativo):

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

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

Lo schema URI sarà simile a questo:

È possibile creare manualmente lo schema URI nel registro o eseguire il file "mycustproto.reg" (vedere di seguito).

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"

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

Applicazione console 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();
    }
  }
}

Prova prima a eseguire il programma per assicurarti che sia stato inserito nel percorso corretto:

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

Fare clic sul collegamento nella pagina HTML:

Vedrai una finestra popup di avviso per la prima volta.

inserisci qui la descrizione dell'immagine

Per ripristinare l'impostazione del gestore del protocollo esterno in Chrome:

Se hai mai accettato il protocollo personalizzato in Chrome e desideri reimpostare l'impostazione, fallo (al momento, non esiste un'interfaccia utente in Chrome per modificare l'impostazione):

Modifica " Stato locale " questo file in questo percorso:

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

o semplicemente vai a:

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

Quindi, cerca questa stringa: protocol_handler

Vedrai il protocollo personalizzato da lì.

Nota: chiudi il tuo Google Chrome prima di modificare il file. In caso contrario, la modifica che hai apportato verrà sovrascritta da Chrome.

Riferimento:

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


sembra promettente, posso usare questo approccio per stampare da un tablet. in tal caso, come gestire il registro, ecc. in quel caso
Venkat

1
@ Venkat Penso che sia meglio specificare prima il nome del tablet e il sistema operativo (es: Surface, iPad, ecc.) E vedere se altri lo hanno già fatto. La soluzione che ho pubblicato era per Windows. Ho visto le impostazioni simili per OS X e Linux. Tuttavia, non avevo questi dispositivi / ambienti a portata di mano per sperimentare. Puoi provarlo prima su Windows per avere un'idea di base di come funziona. Spero che questo possa aiutare.
Jun Hsieh

3
Per la cronaca, ho fondato l' opzione di configurazione protocol_handler nel Preferencesfile, che si trova in%localappdata%\Google\Chrome\User Data\Default
Babblo

Impossibile richiamare più protocolli uno dopo l'altro in una singola chiamata javascript all'interno di Chrome.
prem

Cosa succede se la mia chiave non viene trovata nel registro? Dal browser chiedo di chiamare l'applicazione in base alla chiave? qui, come posso notificare all'utente che la chiave non si trova nel registro?
Akhil Nair

55

Chrome 13 ora supporta l' navigator.registerProtocolHandlerAPI. Per esempio,

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

Nota che il nome del tuo protocollo deve iniziare con web+, con alcune eccezioni per quelli comuni (come mailto, ecc.). Per maggiori dettagli, vedere: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler


6
+1 per il fatto che i protocolli devono iniziare con web + per evitare "SECURITY_ERR: DOM Exception 18"
Catch22

3
Come funzionano i link torrent:e steam:allora? Anche le app Chrome in pacchetto hanno questa restrizione?
Steven Roose

1
@StevenRoose Da quello che posso dire, Chrome li trasmette al sistema operativo. Anche utilizzando l' chrome.webNavigationAPI, i tel:collegamenti non vengono mai segnalati.
PixnBits

Questo non sembra funzionare all'interno di un'app Chrome e non sembra essere in grado di reindirizzare il protocollo all'interno dell'app. La risposta migliore è la risposta di Gordon Williams di seguito.
Karel Bílek


30

Questa domanda è vecchia ora, ma c'è stato un recente aggiornamento a Chrome (almeno per quanto riguarda le app in pacchetto) ...

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

e

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

Ti consente di registrare un gestore per un URL (purché tu lo possieda). Purtroppo no, myprotocol://ma almeno puoi farlo http://myprotocol.mysite.come puoi creare una pagina web lì che indirizza le persone all'app nell'app store.


Grazie mille per questa risposta! A differenza della risposta più votata, in realtà risponde alla domanda!
Karel Bílek

10

Ecco come l'ho fatto. La tua app dovrebbe installare alcune chiavi di registro durante l'installazione, quindi in qualsiasi browser puoi semplicemente collegarti a foo: \ anythingHere.txt e aprirà la tua app e le passerà quel valore.

Questo non è il mio codice, solo qualcosa che ho trovato sul web durante la ricerca della stessa domanda. Basta cambiare tutto "foo" nel testo sottostante con il nome del protocollo che desideri e cambiare anche il percorso del tuo exe.

(mettilo in un file di testo come salva come foo.reg sul desktop, quindi fai doppio clic per installare le chiavi) ----- Sotto questa riga va nel file .reg (NON inclusa questa riga) --- ---

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
Questo non funziona in Chrome, che era la domanda specifica.
Kjetil Watnedal

1
@KjetilWatnedal: funziona bene in Chrome (almeno nella v40 +) e con questa soluzione. In relazione alla domanda iniziale, OP voleva che il browser inviasse qualcosa a un sito automaticamente, apparentemente senza un'applicazione di gestione locale, cosa che in effetti potrebbe non essere possibile.
Marcel N.

7
Voglio far sapere a tutti che la sua soluzione funziona, infatti, in Chrome (testato oggi in 49.0.2623.87). Tuttavia, ho scoperto che se digiti questo protocollo direttamente nel browser (foo: // C: /test.txt) potresti dover usare ctrl + invio perché il browser non riconosce immediatamente il protocollo e il protocollo di ricerca lo intercetta l'azione prima che il sistema operativo possa farlo. Tuttavia, inserendolo in un collegamento ha funzionato correttamente.
timmy

@timmy - grazie mille! Mi sono strappato i capelli cercando di far funzionare i gestori di protocollo in Chrome: ho scoperto che tutto quello che dovevo fare era usare Ctrl + Invio! Grazie ancora!
corsia

@timmy grazie mille, pensavo già che i miei utenti avrebbero dovuto attenersi a Internet Explorer
Pipe

2

Non sono sicuro che questo sia il posto giusto per la mia risposta, ma poiché ho trovato pochissimi thread utili e questo era uno di questi, sto postando la mia soluzione qui.

Problema : volevo che Linux Mint 19.2 Cinnamon aprisse Evolution quando si fa clic sui mailtocollegamenti in Chromium. Gmail è stato registrato come gestore predefinito in chrome: // settings / handlers e non ho potuto scegliere nessun altro gestore.

Soluzione : utilizzare xdg-settings nella console

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

La soluzione è stata trovata qui https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution e adattata al mio caso.


0

Aperto

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

apri Preferencesquindi cerca excluded_schemeslo troverai in 'protocol_handler' elimina questo / i schema / i escluso / i per ripristinare Chrome per aprire l'URL con l'applicazione predefinita

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.