Trình xử lý giao thức tùy chỉnh trong chrome


88

Làm cách nào để thiết lập trình xử lý giao thức tùy chỉnh trong chrome? Cái gì đó như:

myprotocol: // testfile

Tôi cần điều này để gửi yêu cầu tới http://example.com?query=testfile , sau đó gửi httpresponse đến tiện ích mở rộng của tôi.


Tôi không nghĩ rằng Chrome hiện hỗ trợ điều này, nó có một bộ API khá hạn chế có sẵn cho các tiện ích mở rộng.
Wladimir Palant

Câu trả lời:


77

Phương thức sau đăng ký một ứng dụng vào một lược đồ URI. Vì vậy, bạn có thể sử dụng mycustproto: trong mã HTML của mình để kích hoạt một ứng dụng cục bộ. Nó hoạt động trên Phiên bản Google Chrome 51.0.2704.79 m (64-bit).

Tôi chủ yếu sử dụng phương pháp này để in tài liệu một cách im lặng mà không có hộp thoại in bật lên. Kết quả là khá tốt và là một giải pháp liền mạch để tích hợp ứng dụng bên ngoài với trình duyệt.

Mã HTML (đơn giản):

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

Mã HTML (thay thế):

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

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

Lược đồ URI sẽ giống như sau:

Bạn có thể tạo Lược đồ URI theo cách thủ công trong sổ đăng ký hoặc chạy tệp "mycustproto.reg" (xem bên dưới).

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"

Ví dụ 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\""

Ứng dụng bảng điều khiển 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();
    }
  }
}

Hãy thử chạy chương trình trước để đảm bảo rằng chương trình đã được đặt vào đúng đường dẫn:

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

Nhấp vào liên kết trên trang HTML của bạn:

Lần đầu tiên bạn sẽ thấy một cửa sổ cảnh báo bật lên.

nhập mô tả hình ảnh ở đây

Để đặt lại cài đặt trình xử lý giao thức bên ngoài trong Chrome:

Nếu bạn đã từng chấp nhận giao thức tùy chỉnh trong Chrome và muốn đặt lại cài đặt, hãy thực hiện việc này (hiện tại, không có giao diện người dùng trong Chrome để thay đổi cài đặt):

Chỉnh sửa " Trạng thái cục bộ " tệp này theo đường dẫn này:

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

hoặc Chỉ cần truy cập:

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

Sau đó, tìm kiếm chuỗi này: protocol_handler

Bạn sẽ thấy giao thức tùy chỉnh từ đó.

Lưu ý: Vui lòng đóng Google Chrome của bạn trước khi chỉnh sửa tệp. Nếu không, thay đổi bạn đã thực hiện sẽ bị Chrome ghi đè.

Tài liệu tham khảo:

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


điều này có vẻ hứa hẹn, tôi có thể sử dụng cách tiếp cận này để in từ máy tính bảng không. nếu vậy làm thế nào để đối phó với vv registry trong trường hợp đó
Venkat

1
@Venkat Tôi nghĩ tốt hơn nên chỉ định tên máy tính bảng và hệ điều hành trước (ví dụ: Surface, iPad, v.v.) và xem những người khác đã làm điều đó trước đây chưa. Giải pháp tôi đã đăng là dành cho Windows. Tôi đã thấy các cài đặt tương tự cho OS X và Linux. Tuy nhiên, tôi không có sẵn thiết bị / môi trường này để thử nghiệm. Bạn có thể thử nó trên Windows trước để biết cơ bản về cách nó hoạt động. Hy vọng điều này có thể giúp cho bạn.
Jun Xie

3
Đối với hồ sơ, tôi đã thành lập protocol_handler tùy chọn cấu hình trong Preferencestập tin, tọa lạc tại%localappdata%\Google\Chrome\User Data\Default
Babblo

Không thể gọi lần lượt nhiều giao thức trong một lệnh gọi javascript trong chrome.
Prem

Điều gì xảy ra nếu khóa của tôi không được tìm thấy trong sổ đăng ký? Từ trình duyệt, tôi yêu cầu gọi ứng dụng dựa trên phím? ở đây, làm cách nào tôi có thể thông báo cho người dùng rằng khóa không được tìm thấy trong sổ đăng ký?
Akhil Nair

55

Chrome 13 hiện hỗ trợ navigator.registerProtocolHandlerAPI. Ví dụ,

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

Lưu ý rằng tên giao thức của bạn phải bắt đầu bằng web+, với một vài ngoại lệ đối với những cái thông thường (như mailto, v.v.). Để biết thêm chi tiết, hãy xem: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler


6
+1 vì thực tế là các giao thức phải bắt đầu bằng web + để tránh "SECURITY_ERR: DOM Exception 18"
Catch22

3
Làm thế nào để torrent:steam:các liên kết hoạt động sau đó? Ứng dụng đóng gói của Chrome có hạn chế này không?
Steven Roose

1
@StevenRoose Theo những gì tôi có thể biết, Chrome chuyển những thứ đó cho Hệ điều hành. Ngay cả khi sử dụng chrome.webNavigationAPI, tel:các liên kết không bao giờ được báo cáo.
PixnBits

Điều này dường như không hoạt động trong ứng dụng chrome và dường như không thể chuyển hướng giao thức bên trong ứng dụng. Câu trả lời tốt hơn nhiều là câu trả lời của Gordon Williams dưới đây.
Karel Bílek


30

Câu hỏi này giờ đã cũ, nhưng đã có một bản cập nhật gần đây cho Chrome (ít nhất là những ứng dụng đóng gói có liên quan) ...

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

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

Nó cho phép bạn đăng ký một trình xử lý cho một URL (miễn là bạn sở hữu nó). Đáng buồn là không myprotocol://nhưng ít nhất bạn có thể làm http://myprotocol.mysite.comvà có thể tạo một trang web ở đó hướng mọi người đến ứng dụng trong cửa hàng ứng dụng.


Cảm ơn rất nhiều cho câu trả lời này! Không giống như câu trả lời được bình chọn hàng đầu, nó thực sự trả lời câu hỏi!
Karel Bílek

10

Đây là cách tôi đã làm điều đó. Ứng dụng của bạn sẽ cần cài đặt một vài khóa reg khi cài đặt, sau đó trong bất kỳ trình duyệt nào, bạn chỉ cần liên kết tới foo: \ anythingHere.txt và nó sẽ mở ứng dụng của bạn và chuyển cho nó giá trị đó.

Đây không phải là mã của tôi, chỉ là thứ tôi tìm thấy trên web khi tìm kiếm cùng một câu hỏi. Chỉ cần thay đổi tất cả "foo" trong văn bản bên dưới thành tên giao thức bạn muốn và thay đổi cả đường dẫn đến exe của bạn.

(đặt cái này vào tệp văn bản dưới dạng lưu dưới dạng foo.reg trên màn hình của bạn, sau đó nhấp đúp vào nó để cài đặt các phím) ----- Dưới dòng này là tệp .reg (KHÔNG bao gồm dòng này) --- ---

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
Điều này không hoạt động trong chrome, đó là một câu hỏi cụ thể.
Kjetil Watnedal

1
@KjetilWatnedal: Nó hoạt động tốt trong Chrome (ít nhất là trong v40 +) và với giải pháp này. Liên quan đến câu hỏi ban đầu, OP muốn trình duyệt tự động gửi nội dung nào đó đến một trang web, dường như không có ứng dụng xử lý cục bộ, điều này thực sự có thể không thực hiện được.
Marcel N.

7
Tôi muốn cho mọi người biết giải pháp của anh ấy trên thực tế hoạt động trong Chrome (được thử nghiệm trong 49.0.2623.87 ngày hôm nay). Tuy nhiên, tôi nhận thấy rằng nếu bạn nhập giao thức này trực tiếp vào trình duyệt (foo: // C: /test.txt), bạn có thể phải sử dụng ctrl + enter vì trình duyệt không nhận ra ngay giao thức và giao thức tìm kiếm sẽ chặn hành động trước khi hệ điều hành có thể. Tuy nhiên, đưa nó vào một liên kết hoạt động chính xác.
timmy

@timmy - cảm ơn bạn rất nhiều! Tôi đã cố gắng làm cho các trình xử lý giao thức hoạt động trong chrome - tất cả những gì tôi cần làm là sử dụng Ctrl + Enter! Cảm ơn một lần nữa!
lane

@timmy cảm ơn bạn rất nhiều, tôi đã nghĩ người dùng của tôi sẽ phải gắn bó với Internet Explorer
ống

2

Không chắc liệu đây có phải là nơi thích hợp cho câu trả lời của tôi hay không, nhưng vì tôi tìm thấy rất ít chủ đề hữu ích và đây là một trong số đó, tôi đăng giải pháp của mình ở đây.

Sự cố : Tôi muốn Linux Mint 19.2 Cinnamon mở Evolution khi nhấp vào mailtocác liên kết trong Chromium. Gmail đã được đăng ký làm trình xử lý mặc định trong chrome: // settings / handlers và tôi không thể chọn bất kỳ trình xử lý nào khác.

Giải pháp : Sử dụng xdg-settings trong bảng điều khiển

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

Giải pháp được tìm thấy tại đây https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution và được điều chỉnh cho trường hợp của tôi.


0

mở

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

mở Preferencesrồi tìm kiếm excluded_schemesbạn sẽ thấy nó trong 'protocol_handler', xóa (các) lược đồ bị loại trừ này để đặt lại chrome để mở url với ứng dụng mặc định

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.