Chrome'da özel protokol işleyici


89

Chrome'da özel bir protokol işleyicisini nasıl kurarım? Gibi bir şey:

myprotocol: // test dosyası

Http://example.com?query=testfile ' a bir istek göndermek ve ardından http yanıtını uzantıma göndermek için buna ihtiyacım var .


Chrome'un şu anda bunu desteklediğini sanmıyorum, uzantılar için oldukça sınırlı bir API setine sahip.
Wladimir Palant

Yanıtlar:


78

Aşağıdaki yöntem bir uygulamayı bir URI Şemasına kaydeder. Bu nedenle, yerel bir uygulamayı tetiklemek için HTML kodunuzda mycustproto: kullanabilirsiniz . Google Chrome Sürümü 51.0.2704.79 m (64 bit) üzerinde çalışır.

Bu yöntemi esas olarak belgeyi yazdırma iletişim kutusu açılmadan sessizce yazdırmak için kullandım. Sonuç oldukça iyidir ve harici uygulamayı tarayıcıyla entegre etmek için kusursuz bir çözümdür.

HTML kodu (basit):

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

HTML kodu (alternatif):

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

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

URI Şeması şöyle görünecek:

URI Şemasını kayıt defterinde manuel olarak oluşturabilir veya "mycustproto.reg" dosyasını çalıştırabilirsiniz (aşağıya bakın).

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 örneği:

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 # konsol uygulaması - 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();
    }
  }
}

Programın doğru yola yerleştirildiğinden emin olmak için önce programı çalıştırmayı deneyin:

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

HTML sayfanızdaki bağlantıyı tıklayın:

İlk kez bir uyarı penceresi açılır.

görüntü açıklamasını buraya girin

Chrome'da harici protokol işleyici ayarını sıfırlamak için:

Chrome'da özel protokolü daha önce kabul ettiyseniz ve ayarı sıfırlamak istiyorsanız, bunu yapın (şu anda Chrome'da ayarı değiştirmek için bir kullanıcı arayüzü yoktur):

Bu dosyayı şu yol altında " Yerel Durum " u düzenleyin:

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

veya Sadece şu adrese gidin:

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

Ardından, şu dizeyi arayın: protocol_handler

Oradan özel protokolü göreceksiniz.

Not: Lütfen dosyayı düzenlemeden önce Google Chrome'unuzu kapatın. Aksi takdirde, yaptığınız değişikliğin üzerine Chrome tarafından yazılacaktır.

Referans:

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


Bu umut verici görünüyor, bu yaklaşımı tabletten yazdırmak için kullanabilir miyim? eğer öyleyse bu durumda kayıt vb. ile nasıl başa
çıkılır

1
@Venkat Bence önce tablet adını ve işletim sistemini belirtmek (ör. Surface, iPad, vb.) Ve başkalarının bunu daha önce yapıp yapmadığını görmek daha iyi. Gönderdiğim çözüm Windows içindi. OS X ve Linux için benzer ayarları gördüm. Ancak, bu cihazı / ortamı denemek için kullanışlı bulamadım. Nasıl çalıştığına dair temel fikir edinmek için önce Windows'ta deneyebilirsiniz. Umarım bu yardımcı olacak.
Haz Hsieh

3
Kayıt için, dosyada protokol_handler yapılandırma seçeneğini Preferences%localappdata%\Google\Chrome\User Data\Default
buldum

Chrome içindeki tek bir javascript çağrısında birden çok protokol birbiri ardına çağrılamıyor.
Prem

Anahtarım kayıt defterinde bulunmazsa ne olur? Tarayıcıdan uygulamayı anahtara göre aramamı istiyorum. burada, anahtarın kayıt defterinde bulunmadığını kullanıcıya nasıl bildirebilirim?
Akhil Nair

55

Chrome 13 artık navigator.registerProtocolHandlerAPI'yi destekliyor . Örneğin,

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

Protokol adınızın, web+yaygın olanlar için birkaç istisna dışında (örneğin mailto, vb.) İle başlaması gerektiğini unutmayın . Daha fazla ayrıntı için bkz: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler


6
"SECURITY_ERR: DOM İstisnası 18"
ten

3
O halde nasıl yapılır torrent:ve steam:bağlantılar nasıl çalışır? Chrome Paketli Uygulamalarda da bu kısıtlama var mı?
Steven Roose

1
@StevenRoose Söyleyebileceğim kadarıyla, Chrome bunları işletim sistemine aktarıyor. chrome.webNavigationAPI kullanılsa bile , tel:bağlantılar asla raporlanmaz.
PixnBits

Bu, bir Chrome uygulamasının içinde çalışmıyor gibi görünüyor ve uygulama içindeki protokolü yeniden yönlendiremiyor gibi görünüyor. Aşağıda Gordon Williams'ın cevabı çok daha iyi.
Karel Bílek


30

Bu soru artık eski, ancak Chrome'da yeni bir güncelleme var (en azından paketlenmiş uygulamalar söz konusu olduğunda) ...

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

ve

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

Bir URL için bir işleyici kaydetmenize izin verir (ona sahip olduğunuz sürece). Ne yazık ki hayır, myprotocol://ancak en azından http://myprotocol.mysite.comorada insanları uygulama mağazasındaki uygulamaya yönlendiren bir web sayfası oluşturabilirsiniz.


Bu cevap için çok teşekkürler! En çok oylanan cevabın aksine, aslında soruyu cevaplıyor!
Karel Bílek

10

Ben böyle yaptım. Uygulamanızın kurulum sırasında birkaç reg anahtarı yüklemesi gerekir, daha sonra herhangi bir tarayıcıda foo: \ anyHere.txt ile bağlantı kurabilirsiniz ve uygulamanızı açıp bu değeri iletir.

Bu benim kodum değil, aynı soruyu ararken web'de bulduğum bir şey. Aşağıdaki metindeki tüm "foo" 'yu ​​istediğiniz protokol adıyla değiştirin ve exe'nizin yolunu da değiştirin.

(bunu masaüstünüzde foo.reg olarak kaydedin olarak bir metin dosyasına koyun, ardından anahtarları yüklemek için üzerine çift tıklayın) ----- Bu satırın altında .reg dosyasına gider (bu satır dahil DEĞİL) --- ---

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
Bu, spesifik soru olan chrome'da çalışmıyor.
Kjetil Watnedal

1
@KjetilWatnedal: Chrome'da (en azından v40 + 'da) ve bu çözümle iyi çalışıyor. İlk soruyla ilgili olarak OP, tarayıcının bir siteye bir şeyi otomatik olarak, görünüşe göre yerel bir uygulama uygulaması olmadan göndermesini istedi ki bu gerçekten mümkün olmayabilir.
Marcel N.

7
Herkesin çözümünün aslında Chrome'da çalıştığını bilmesini istiyorum (bugün 49.0.2623.87'de test edildi). Ancak, bu protokolü doğrudan tarayıcıya yazarsanız (foo: // C: /test.txt) ctrl + enter kullanmanız gerekebilir çünkü tarayıcı protokolü hemen tanımıyor ve arama protokolü kesişiyor İşletim sistemi yapmadan önceki eylem. Yine de bir bağlantıya koymak doğru çalıştı.
timmy

@timmy - çok teşekkür ederim! Protokol işleyicilerinin kromda çalışmasını sağlamaya çalışırken saçlarımı yırtıyorum - tek yapmam gereken Ctrl + Enter tuşlarını kullanmaktı! Tekrar teşekkürler!
şerit

@timmy, çok teşekkür ederim ben zaten kullanıcıların Internet Explorer sopa zorunda düşündüm
Pipe

2

Cevabım için doğru yerin burası olup olmadığından emin değilim, ancak çok az sayıda yardımcı konu bulduğum ve onlardan biri olduğu için çözümümü buraya gönderiyorum.

Sorun : Linux Mint 19.2 Cinnamon'un mailtoChromium'daki bağlantılara tıklarken Evolution'ı açmasını istedim . Gmail, chrome: // settings / handlers'da varsayılan işleyici olarak kaydedildi ve başka bir işleyici seçemedim.

Çözüm : Konsoldaki xdg ayarlarını kullanın

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

Çözüm burada https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution bulundu ve durumuma uyarlandı.


0

açık

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

açın ve Preferencesardından excluded_schemessizi arayın 'protocol_handler' içinde bulacaksınız, bu hariç tutulan şemaları silin, kromu varsayılan uygulamayla açmak için url'yi sıfırlamak için

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.