Penangan protokol khusus di chrome

89

Bagaimana cara menyiapkan penangan protokol khusus di Chrome? Sesuatu seperti:

myprotocol: // testfile

Saya memerlukan ini untuk mengirim permintaan ke http://example.com?query=testfile , lalu mengirim httpresponse ke ekstensi saya.

Penguji Uji
sumber
Saya tidak berpikir bahwa Chrome saat ini mendukung ini, ia memiliki kumpulan API yang agak terbatas yang tersedia untuk ekstensi.
Wladimir Palant

Jawaban:

78

Metode berikut mendaftarkan aplikasi ke Skema URI. Jadi, Anda dapat menggunakan mycustproto: dalam kode HTML Anda untuk memicu aplikasi lokal. Ini bekerja pada Google Chrome Versi 51.0.2704.79 m (64-bit).

Saya terutama menggunakan metode ini untuk mencetak dokumen secara diam-diam tanpa memunculkan dialog cetak. Hasilnya cukup bagus dan merupakan solusi yang mulus untuk mengintegrasikan aplikasi eksternal dengan browser.

Kode HTML (sederhana):

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

Kode HTML (alternatif):

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

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

Skema URI akan terlihat seperti ini:

Anda dapat membuat Skema URI secara manual di registri, atau menjalankan file "mycustproto.reg" (lihat di bawah).

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"

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

Aplikasi konsol 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();
    }
  }
}

Coba jalankan program terlebih dahulu untuk memastikan program telah ditempatkan di jalur yang benar:

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

Klik link di halaman HTML Anda:

Anda akan melihat jendela peringatan popup untuk pertama kalinya.

masukkan deskripsi gambar di sini

Untuk mengatur ulang pengaturan penangan protokol eksternal di Chrome:

Jika Anda pernah menerima protokol khusus di Chrome dan ingin mengatur ulang pengaturan, lakukan ini (saat ini, tidak ada UI di Chrome untuk mengubah pengaturan):

Edit "Status Lokal " file ini di bawah jalur ini:

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

atau Cukup buka:

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

Kemudian, cari string ini: protocol_handler

Anda akan melihat protokol khusus dari sana.

Catatan: Harap tutup Google Chrome Anda sebelum mengedit file. Jika tidak, perubahan yang Anda buat akan ditimpa oleh Chrome.

Referensi:

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

Jun Hsieh
sumber
ini terlihat menjanjikan, dapatkah saya menggunakan pendekatan ini untuk mencetak dari tablet. jika demikian bagaimana menangani registri dll dalam kasus itu
Venkat
1
@Venkat Saya pikir lebih baik untuk menentukan nama tablet dan sistem operasi terlebih dahulu (mis .: Surface, iPad, dll) dan lihat apakah orang lain telah melakukannya sebelumnya. Solusi yang saya posting adalah untuk Windows. Saya telah melihat pengaturan serupa untuk OS X dan Linux. Namun, saya tidak memiliki perangkat / lingkungan ini yang berguna untuk bereksperimen. Anda dapat mencobanya di Windows terlebih dahulu untuk mendapatkan ide dasar tentang cara kerjanya. Saya harap ini akan membantu.
Jun Hsieh
3
Sebagai catatan, saya menemukan opsi konfigurasi protocol_handler dalam Preferencesfile, terletak di%localappdata%\Google\Chrome\User Data\Default
Babblo
Tidak dapat menjalankan beberapa protokol satu per satu dalam satu panggilan javascript dalam chrome.
prem
Bagaimana jika kunci saya tidak ditemukan di registri? Dari browser saya meminta untuk memanggil aplikasi berdasarkan kunci? di sini, bagaimana cara memberi tahu pengguna bahwa kunci tidak ditemukan di registri?
Akhil Nair
55

Chrome 13 sekarang mendukung navigator.registerProtocolHandlerAPI. Sebagai contoh,

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

Perhatikan bahwa nama protokol Anda harus dimulai dengan web+, dengan beberapa pengecualian untuk yang umum (seperti mailto, dll). Untuk detail lebih lanjut, lihat: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler

Boris Smus
sumber
6
+1 untuk fakta bahwa protokol harus dimulai dengan web + untuk menghindari "SECURITY_ERR: DOM Exception 18"
Catch22
3
Bagaimana cara torrent:dan steam:tautan bekerja? Apakah Aplikasi Terpaket Chrome juga memiliki batasan ini?
Steven Roose
1
@StevenRoose Dari apa yang saya tahu, Chrome meneruskannya ke OS. Bahkan menggunakan chrome.webNavigationAPI, tel:tautan tidak pernah dilaporkan.
PixnBits
Ini sepertinya tidak berfungsi di dalam aplikasi chrome, dan sepertinya tidak dapat mengarahkan protokol di dalam aplikasi. Jawaban yang jauh lebih baik adalah jawaban Gordon Williams di bawah ini.
Karel Bílek
30

Pertanyaan ini sudah tua sekarang, tetapi ada pembaruan terkini untuk Chrome (setidaknya jika menyangkut aplikasi yang dikemas) ...

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

dan

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

Ini memungkinkan Anda untuk mendaftarkan penangan untuk URL (selama Anda memilikinya). Sayangnya tidak, myprotocol://tetapi setidaknya Anda dapat melakukannya http://myprotocol.mysite.comdan dapat membuat halaman web di sana yang mengarahkan orang ke aplikasi di app store.

Gordon Williams
sumber
Terima kasih BANYAK untuk jawaban ini! Tidak seperti jawaban pilihan teratas, ini benar-benar menjawab pertanyaan!
Karel Bílek
10

Beginilah cara saya melakukannya. Aplikasi Anda perlu menginstal beberapa kunci reg saat penginstalan, lalu di browser apa pun Anda cukup menautkan ke foo: \ everythingHere.txt dan itu akan membuka aplikasi Anda dan meneruskan nilai itu.

Ini bukan kode saya, hanya sesuatu yang saya temukan di web saat menelusuri pertanyaan yang sama. Ubah saja semua "foo" dalam teks di bawah ini ke nama protokol yang Anda inginkan dan ubah jalur ke exe Anda juga.

(taruh ini ke dalam file teks sebagai simpan sebagai foo.reg di desktop Anda, lalu klik dua kali untuk menginstal kunci) ----- Di bawah baris ini masuk ke file .reg (TIDAK termasuk baris ini) --- ---

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
sumber
5
Ini tidak berfungsi di chrome, yang merupakan pertanyaan khusus.
Kjetil Watnedal
1
@KjetilWatnedal: Ini berfungsi dengan baik di Chrome (setidaknya di v40 +) dan dengan solusi ini. Terkait pertanyaan awal, OP ingin browser mengirimkan sesuatu ke suatu situs secara otomatis, ternyata tanpa aplikasi handler lokal, yang memang mungkin tidak bisa dilakukan.
Marcel N.
7
Saya ingin memberi tahu semua orang bahwa solusinya sebenarnya berfungsi di Chrome (diuji di 49.0.2623.87 hari ini). Namun, saya menemukan bahwa jika Anda mengetik protokol ini langsung di browser (foo: // C: /test.txt) Anda mungkin harus menggunakan ctrl + enter karena browser tidak segera mengenali protokol dan protokol pencarian memotong. tindakan sebelum OS bisa. Menempatkannya di tautan berfungsi dengan benar.
timmy
@timmy - terima kasih banyak! Saya telah merobek rambut saya mencoba membuat penangan protokol bekerja di chrome - ternyata yang perlu saya lakukan hanyalah menggunakan Ctrl + Enter! Terima kasih lagi!
jalur
@timmy terima kasih banyak, saya sudah mengira pengguna saya harus tetap menggunakan Internet Explorer
Pipe
2

Tidak yakin apakah ini tempat yang tepat untuk jawaban saya, tetapi karena saya menemukan sangat sedikit utas yang bermanfaat dan ini adalah salah satunya, saya memposting solusi saya di sini.

Masalah : Saya ingin Linux Mint 19.2 Cinnamon membuka Evolution saat mengklik mailtotautan di Chromium. Gmail terdaftar sebagai penangan default di chrome: // settings / handler dan saya tidak dapat memilih penangan lain.

Solusi : Gunakan pengaturan xdg di konsol

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

Solusi ditemukan di sini https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution dan disesuaikan untuk kasus saya.

Peter Schober
sumber
0

Buka

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

buka Preferenceslalu cari excluded_schemesAnda akan menemukannya di 'protocol_handler' hapus skema yang dikecualikan ini untuk mengatur ulang chrome untuk membuka url dengan aplikasi default

Abdelrahman Maharek
sumber