Niestandardowa obsługa protokołów w chrome

88

Jak skonfigurować niestandardową obsługę protokołu w przeglądarce Chrome? Coś jak:

myprotocol: // plik testowy

Potrzebowałbym tego, aby wysłać żądanie do http://example.com?query=testfile , a następnie wysłać httpresponse do mojego rozszerzenia.

Tester Tester
źródło
Nie sądzę, że Chrome obecnie to obsługuje, ma raczej ograniczony zestaw interfejsów API dostępnych dla rozszerzeń.
Wladimir Palant

Odpowiedzi:

77

Poniższa metoda rejestruje aplikację w schemacie URI. Możesz więc użyć mycustproto: w swoim kodzie HTML, aby uruchomić lokalną aplikację. Działa na przeglądarce Google Chrome w wersji 51.0.2704.79 m (64-bit).

Używałem tej metody głównie do cichego drukowania dokumentu bez wyskakującego okna dialogowego drukowania. Wynik jest całkiem niezły i jest bezproblemowym rozwiązaniem do integracji zewnętrznej aplikacji z przeglądarką.

Kod HTML (prosty):

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

Kod HTML (alternatywny):

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

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

Schemat URI będzie wyglądał następująco:

Schemat URI można utworzyć ręcznie w rejestrze lub uruchomić plik „mycustproto.reg” (patrz poniżej).

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"

Przykład 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\""

Aplikacja konsoli 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();
    }
  }
}

Spróbuj najpierw uruchomić program, aby upewnić się, że program został umieszczony we właściwej ścieżce:

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

Kliknij łącze na swojej stronie HTML:

Po raz pierwszy zobaczysz okienko z ostrzeżeniem.

wprowadź opis obrazu tutaj

Aby zresetować ustawienie obsługi protokołu zewnętrznego w Chrome:

Jeśli kiedykolwiek zaakceptowałeś niestandardowy protokół w Chrome i chciałbyś zresetować ustawienie, zrób to (obecnie w Chrome nie ma interfejsu użytkownika, który mógłby zmienić ustawienie):

Edytuj „ Stan lokalny ” ten plik pod tą ścieżką:

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

lub po prostu przejdź do:

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

Następnie wyszukaj ten ciąg: protocol_handler

Tam zobaczysz niestandardowy protokół.

Uwaga: przed edycją pliku zamknij przeglądarkę Google Chrome. W przeciwnym razie wprowadzona zmiana zostanie nadpisana przez Chrome.

Odniesienie:

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

Jun Xie
źródło
wygląda to obiecująco, czy mogę użyć tego podejścia do drukowania z tabletu. jeśli tak, jak radzić sobie z rejestrem itp. w takim przypadku
Venkat
1
@Venkat Myślę, że lepiej najpierw podać nazwę tabletu i system operacyjny (np. Surface, iPad itp.) I sprawdzić, czy inni już to zrobili. Rozwiązanie, które opublikowałem, dotyczyło systemu Windows. Widziałem podobne ustawienia dla OS X i Linux. Jednak nie miałem tego urządzenia / środowiska pod ręką do eksperymentowania. Możesz najpierw wypróbować go w systemie Windows, aby uzyskać podstawowe pojęcie o tym, jak to działa. Mam nadzieję, że to pomoże.
Jun Xie,
3
Dla przypomnienia, założyłem protocol_handler opcji konfiguracyjnych w Preferencespliku, który znajduje się%localappdata%\Google\Chrome\User Data\Default
Babblo
Nie można wywołać wielu protokołów jeden po drugim w pojedynczym wywołaniu javascript w chrome.
prem
Co się stanie, jeśli mój klucz nie zostanie znaleziony w rejestrze? Z przeglądarki proszę o wywołanie aplikacji na podstawie klucza? tutaj, jak mogę powiadomić użytkownika, że ​​klucz nie został znaleziony w rejestrze?
Akhil Nair
55

Chrome 13 obsługuje teraz navigator.registerProtocolHandlerinterfejs API. Na przykład,

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

Zwróć uwagę, że nazwa twojego protokołu musi zaczynać się od web+, z kilkoma wyjątkami dla popularnych protokołów (np. mailtoItp.). Aby uzyskać więcej informacji, zobacz: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler

Boris Smus
źródło
6
+1 za fakt, że protokoły muszą zaczynać się od „web +”, aby uniknąć „SECURITY_ERR: DOM Exception 18”
Catch22
3
Jak wtedy torrent:i steam:linki działają? Czy aplikacje w pakiecie Chrome również mają to ograniczenie?
Steven Roose
1
@StevenRoose Z tego, co wiem, Chrome przekazuje je do systemu operacyjnego. Nawet przy użyciu chrome.webNavigationinterfejsu API tel:linki nigdy nie są zgłaszane.
PixnBits
Wydaje się, że nie działa to w aplikacji Chrome i nie jest w stanie przekierować protokołu w aplikacji. Znacznie lepszą odpowiedzią jest poniższa odpowiedź Gordona Williamsa.
Karel Bílek
30

To pytanie jest teraz stare, ale niedawno pojawiła się aktualizacja Chrome (przynajmniej jeśli chodzi o aplikacje w pakietach) ...

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

i

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

Pozwala zarejestrować procedurę obsługi dla adresu URL (o ile jesteś jej właścicielem). Niestety nie, myprotocol://ale przynajmniej możesz to zrobić http://myprotocol.mysite.comi utworzyć tam stronę internetową, która kieruje ludzi do aplikacji w sklepie z aplikacjami.

Gordon Williams
źródło
Wielkie dzięki za tę odpowiedź! W przeciwieństwie do odpowiedzi, która otrzymała najwięcej głosów, faktycznie odpowiada na pytanie!
Karel Bílek
10

Tak to zrobiłem. Twoja aplikacja będzie musiała zainstalować kilka kluczy reg podczas instalacji, a następnie w dowolnej przeglądarce możesz po prostu połączyć się z foo: \ cokolwiekHere.txt, a otworzy ona aplikację i przekaże jej tę wartość.

To nie jest mój kod, tylko coś, co znalazłem w sieci podczas wyszukiwania tego samego pytania. Po prostu zmień wszystkie „foo” w poniższym tekście na żądaną nazwę protokołu i zmień również ścieżkę do swojego exe.

(umieść to w pliku tekstowym jako foo.reg na pulpicie, a następnie kliknij dwukrotnie, aby zainstalować klucze) ----- Poniżej tej linii przechodzi do pliku .reg (NIE wliczając tej linii) --- ---

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
źródło
5
To nie działa w chrome, o co chodziło.
Kjetil Watnedal
1
@KjetilWatnedal: Działa dobrze w Chrome (przynajmniej w wersji 40 +) iz tym rozwiązaniem. W związku z początkowym pytaniem OP chciał, aby przeglądarka przesłała coś do witryny automatycznie, najwyraźniej bez lokalnej aplikacji obsługi, co w rzeczywistości może nie być możliwe.
Marcel N.
7
Chcę, aby wszyscy wiedzieli, że jego rozwiązanie faktycznie działa w przeglądarce Chrome (testowane dzisiaj w 49.0.2623.87). Jednak odkryłem, że jeśli wpiszesz ten protokół bezpośrednio w przeglądarce (foo: // C: /test.txt), być może będziesz musiał użyć ctrl + enter, ponieważ przeglądarka nie rozpoznaje natychmiast protokołu i przechwytuje protokół wyszukiwania działanie, zanim system operacyjny będzie mógł. Jednak umieszczenie go w linku działało poprawnie.
Timmy
@timmy - bardzo dziękuję! Wyrywałem sobie włosy z głowy, próbując zmusić obsługę protokołów do działania w chrome - okazało się, że wszystko, co musiałem zrobić, to użyć Ctrl + Enter! Dzięki jeszcze raz!
pas
@timmy bardzo dziękuję, już myślałem, że moi użytkownicy będą musieli trzymać się Internet Explorera
Pipe
2

Nie jestem pewien, czy to jest właściwe miejsce na moją odpowiedź, ale ponieważ znalazłem bardzo mało pomocnych wątków i to był jeden z nich, zamieszczam tutaj swoje rozwiązanie.

Problem : Chciałem, aby Linux Mint 19.2 Cinnamon otwierał Evolution po kliknięciu mailtolinków w Chromium. Gmail został zarejestrowany jako domyślny program obsługi w chrome: // settings / handlers i nie mogłem wybrać żadnego innego modułu obsługi.

Rozwiązanie : użyj ustawień xdg w konsoli

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

Rozwiązanie zostało znalezione tutaj https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution i dostosowane do mojego przypadku.

Peter Schober
źródło
0

otwarty

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

otwórz, Preferencesa następnie wyszukaj excluded_schemes, znajdziesz go w 'protocol_handler' usuń ten wykluczony schemat (y), aby zresetować chrome do otwierania adresu URL z domyślną aplikacją

Abdelrahman Maharek
źródło