ตัวจัดการโปรโตคอลที่กำหนดเองใน Chrome


89

ฉันจะตั้งค่าตัวจัดการโปรโตคอลที่กำหนดเองใน Chrome ได้อย่างไร สิ่งที่ต้องการ:

myprotocol: // testfile

ฉันต้องการสิ่งนี้เพื่อส่งคำขอไปที่http://example.com?query=testfileจากนั้นส่ง httpresponse ไปยังส่วนขยายของฉัน


ฉันไม่คิดว่าปัจจุบัน Chrome รองรับสิ่งนี้ แต่มีชุด API ที่ค่อนข้าง จำกัด สำหรับส่วนขยาย
Wladimir Palant

คำตอบ:


78

วิธีการต่อไปนี้จะลงทะเบียนแอปพลิเคชันกับ URI Scheme ดังนั้นคุณสามารถใช้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 Scheme จะมีลักษณะดังนี้:

คุณสามารถสร้าง URI Scheme ด้วยตนเองในรีจิสทรีหรือเรียกใช้ไฟล์ "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 ไม่มี UI ให้เปลี่ยนการตั้งค่า):

แก้ไข " Local State " ไฟล์นี้ภายใต้เส้นทางนี้:

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 ก่อนเพื่อรับแนวคิดพื้นฐานว่ามันทำงานอย่างไร ฉันหวังว่านี่จะช่วยได้
Jun Hsieh

3
สำหรับบันทึกฉันได้สร้างตัวเลือกการกำหนดค่าprotocol_handlerในPreferencesไฟล์ซึ่งอยู่ที่%localappdata%\Google\Chrome\User Data\Default
Babblo

ไม่สามารถเรียกใช้หลายโปรโตคอลทีละโปรโตคอลในการเรียกใช้จาวาสคริปต์เดียวภายใน 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 สำหรับความจริงที่ว่าโปรโตคอลต้องขึ้นต้นด้วยเว็บ + เพื่อหลีกเลี่ยง "SECURITY_ERR: DOM Exception 18"
Catch22

3
วิธีการtorrent:และsteam:ลิงค์ทำงานแล้ว? Chrome Packaged Apps มีข้อ จำกัด นี้ด้วยหรือไม่
Steven Roose

1
@StevenRoose จากสิ่งที่ฉันบอกได้ Chrome ส่งต่อสิ่งเหล่านั้นไปยัง OS แม้จะใช้chrome.webNavigationAPI tel:ลิงก์ก็จะไม่รายงาน
PixnBits

ดูเหมือนจะใช้ไม่ได้ในแอป Chrome และดูเหมือนจะไม่สามารถเปลี่ยนเส้นทางโปรโตคอลภายในแอปได้ คำตอบที่ดีกว่าคือคำตอบของ Gordon Williams ด้านล่าง
Karel Bílek


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และสามารถสร้างหน้าเว็บที่นั่นซึ่งชี้ให้ผู้คนไปที่แอพในแอพสโตร์


ขอบคุณมากสำหรับคำตอบนี้! ไม่เหมือนคำตอบที่ได้รับการโหวตสูงสุด แต่ตอบคำถามได้จริง!
Karel Bílek

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
สิ่งนี้ใช้ไม่ได้ใน chrome ซึ่งเป็นคำถามเฉพาะ
Kjetil Watnedal

1
@KjetilWatnedal: ทำงานได้ดีใน Chrome (อย่างน้อยใน v40 +) และด้วยโซลูชันนี้ ที่เกี่ยวข้องกับคำถามเริ่มต้น OP ต้องการให้เบราว์เซอร์ส่งบางสิ่งไปยังไซต์โดยอัตโนมัติซึ่งดูเหมือนว่าจะไม่มีแอปพลิเคชันตัวจัดการภายในซึ่งอาจเป็นไปไม่ได้
Marcel N.

7
ฉันต้องการให้ทุกคนรู้ว่าโซลูชันของเขาทำงานใน Chrome ได้จริง (ทดสอบในวันนี้ 49.0.2623.87) อย่างไรก็ตามฉันพบว่าหากคุณพิมพ์โปรโตคอลนี้โดยตรงในเบราว์เซอร์ (foo: // C: /test.txt) คุณอาจต้องใช้ ctrl + enter เนื่องจากเบราว์เซอร์ไม่รู้จักโปรโตคอลในทันทีและโปรโตคอลการค้นหาสกัดกั้น การดำเนินการก่อนที่ระบบปฏิบัติการจะทำได้ แม้ว่าการวางไว้ในลิงก์จะทำงานได้อย่างถูกต้อง
timmy

@timmy - ขอบคุณมาก! ฉันพยายามดึงตัวจัดการโปรโตคอลให้ทำงานใน Chrome - ปรากฎว่าสิ่งที่ฉันต้องทำคือใช้ Ctrl + Enter! ขอบคุณอีกครั้ง!
ตรอก

@timmy ขอบคุณมากฉันคิดว่าผู้ใช้ของฉันจะต้องติด Internet Explorer
ไปป์

2

ไม่แน่ใจว่านี่เป็นสถานที่ที่เหมาะสมสำหรับคำตอบของฉันหรือไม่ แต่เนื่องจากฉันพบกระทู้ที่เป็นประโยชน์น้อยมากและนี่เป็นหนึ่งในนั้นฉันจึงโพสต์วิธีแก้ปัญหาที่นี่

ปัญหา : ฉันต้องการให้ Linux Mint 19.2 Cinnamon เปิด Evolution เมื่อคลิกที่mailtoลิงค์ใน Chromium Gmail ได้รับการลงทะเบียนเป็นตัวจัดการเริ่มต้นในchrome: // settings / handlersและฉันไม่สามารถเลือกตัวจัดการอื่นได้

วิธีแก้ไข : ใช้ xdg-settings ในคอนโซล

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 ด้วยแอปพลิเคชันเริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.