Спеціальний обробник протоколу в chrome


88

Як налаштувати спеціальний обробник протоколу в chrome? Щось на зразок:

myprotocol: // тестовий файл

Мені це знадобиться, щоб надіслати запит на http://example.com?query=testfile , а потім надіслати httpresponse до мого розширення.


Я не думаю, що Chrome в даний час підтримує це, він має досить обмежений набір API, доступних для розширень.
Володимир Палант,

Відповіді:


77

Наступний метод реєструє додаток до схеми URI. Отже, ви можете використовувати mycustproto: у своєму HTML-коді для запуску локальної програми. Він працює на Google Chrome версії 51.0.2704.79 м (64-розрядна).

Я в основному використовував цей метод для тихого друку документа без появи діалогового вікна друку. Результат досить хороший і є бездоганним рішенням для інтеграції зовнішнього додатка з браузером.

HTML-код (простий):

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

HTML-код (альтернатива):

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

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

Схема URI буде виглядати так:

Ви можете створити схему URI вручну в реєстрі або запустити файл "mycustproto.reg" (див. Нижче).

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"

Приклад 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\""

Консольна програма 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();
    }
  }
}

Спробуйте запустити програму спочатку, щоб переконатися, що програма була розміщена у правильному шляху:

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

Клацніть на посилання на вашій HTML-сторінці:

Ви вперше побачите спливаюче вікно попередження.

введіть тут опис зображення

Щоб скинути налаштування зовнішнього обробника протоколу в Chrome:

Якщо ви коли-небудь приймали спеціальний протокол у Chrome і хочете скинути налаштування, зробіть це (наразі в Chrome немає інтерфейсу для зміни налаштування):

Відредагуйте " Місцевий штат " цей файл за таким шляхом:

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

або просто перейдіть до:

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

Потім знайдіть цей рядок: protocol_handler

Ви побачите спеціальний протокол звідти.

Примітка. Перш ніж редагувати файл, закрийте Google Chrome. В іншому випадку внесені вами зміни будуть замінені Chrome.

Довідково:

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


це виглядає багатообіцяюче, чи можу я використовувати такий підхід для друку з планшета. якщо так, то як бути з реєстром тощо - у цьому випадку
Venkat

1
@Venkat Я думаю, що спочатку краще вказати назву планшета та операційну систему (наприклад: Surface, iPad тощо) та подивитися, чи робили це інші раніше. Я опублікував рішення для Windows. Я бачив подібні налаштування для OS X та Linux. Однак у мене не було цих пристроїв / середовищ, зручних для експериментів. Спочатку можна спробувати на Windows, щоб отримати основне уявлення про те, як це працює. Сподіваюся, це допоможе.
Червень Xie,

3
Для запису я заснував опцію конфігурації protocol_handler у Preferencesфайлі, який знаходиться за адресою%localappdata%\Google\Chrome\User Data\Default
Babblo

Неможливо викликати декілька протоколів один за одним в одному дзвінку javascript у chrome.
прем

Що робити, якщо мій ключ не знайдений у реєстрі? З браузера я прошу зателефонувати до програми на основі ключа? тут, як я можу повідомити користувача, що ключа не знайдено в реєстрі?
Akhil Nair,

55

Chrome 13 тепер підтримує navigator.registerProtocolHandlerAPI. Наприклад,

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

Зверніть увагу, що ім'я вашого протоколу має починатися з web+, за деякими винятками для загальних (наприклад mailto, тощо). Докладніше див .: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler


6
+1 за те, що протоколи повинні починатися з web +, щоб уникнути "SECURITY_ERR: DOM Exception 18"
Catch22,

3
Як тоді torrent:та steam:посилання працюють? Чи також мають це обмеження пакетні програми Chrome?
Стівен Руз

1
@StevenRoose З того, що я можу сказати, Chrome передає їх ОС. Навіть використовуючи chrome.webNavigationAPI, tel:посилання ніколи не повідомляються.
PixnBits

Здається, це не працює всередині програми Chrome і, здається, не може перенаправити протокол всередині програми. Набагато кращою є відповідь Гордона Вільямса нижче.
Карел Білек


30

Зараз це питання застаріле, але нещодавно було оновлено Chrome (принаймні там, де це стосується пакетних програм) ...

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

і

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

Це дозволяє зареєструвати обробник для URL-адреси (якщо ви є власником). На жаль, ні, myprotocol://але принаймні ви можете це зробити http://myprotocol.mysite.comі можете створити там веб-сторінку, яка спрямовує людей на додаток у магазині додатків.


ДЯКУЄМО БАГАТО за цю відповідь! На відміну від найбільш голосованої відповіді, вона насправді відповідає на питання!
Карел Білек

10

Ось як я це зробив. Вашій програмі доведеться встановити кілька ключів reg під час встановлення, тоді в будь-якому браузері ви можете просто перейти за посиланням foo: \ anythingHere.txt, і вона відкриє вашу програму та передасть йому це значення.

Це не мій код, а лише те, що я знайшов в Інтернеті під час пошуку того самого питання. Просто змініть усі "foo" у тексті нижче на ім'я протоколу, яке ви хочете, і також змініть шлях до вашого exe.

(помістіть це у текстовий файл, збереживши як foo.reg на робочому столі, потім двічі клацніть на ньому, щоб встановити ключі) ----- Під цим рядком переходить у файл .reg (НЕ включаючи цей рядок) --- ---

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
Це не працює в хромі, що було конкретним питанням.
Kjetil Watnedal

1
@KjetilWatnedal: Він чудово працює в Chrome (принаймні в v40 +) та з цим рішенням. Що стосується початкового питання, OP хотів, щоб браузер автоматично подавав щось на сайт, мабуть, без програми локального обробника, що дійсно може бути неможливим.
Марсель Н.

7
Я хочу повідомити всіх, що його рішення насправді працює в Chrome (протестовано сьогодні в 49.0.2623.87). Однак я виявив, що якщо ви вводите цей протокол безпосередньо у браузері (foo: // C: /test.txt), можливо, вам доведеться використовувати ctrl + enter, оскільки браузер не відразу розпізнає протокол і протокол пошуку перехоплює дія до того, як ОС може. Однак розміщення його у посиланні працювало правильно.
Тіммі

@timmy - велике спасибі! Я вириваю волосся, намагаючись змусити обробників протоколів працювати в хромі, - виявляється, все, що мені потрібно було, це використовувати Ctrl + Enter! Знову дякую!
провулок

@timmy велике спасибі, я вже думав, що моїм користувачам доведеться дотримуватися Internet Explorer
Pipe

2

Не впевнений, що це правильне місце для моєї відповіді, але оскільки я знайшов дуже мало корисних тем, і це був один із них, я публікую тут своє рішення.

Проблема : Я хотів, щоб Linux Mint 19.2 Cinnamon відкрив Evolution при натисканні на mailtoпосилання в Chromium. Gmail був зареєстрований як обробник за замовчуванням у chrome: // settings / handlers, і я не міг вибрати жодного іншого обробника.

Рішення . Використовуйте параметри xdg у консолі

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

Рішення було знайдено тут https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution та адаптоване для мого випадку.


0

відчинено

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

відкрийте, Preferencesтоді шукайте, excluded_schemesви знайдете його в 'protocol_handler' видаліть цю виключену схему (схеми), щоб скинути chrome для відкриття url із додатком за замовчуванням

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.