2013-08-30 13 views
17

Rozwijam moduł węzła wiersza poleceń i chciałbym móc go uruchomić za pomocą linków na stronie internetowej.Jak zarejestrować obsługę protokołu url w Node.js

Chcę zarejestrować niestandardowy protokół my-module:// taki, że linki będą miały następujący format: my-module://action:some-action i kliknięcie na nich spowoduje uruchomienie pakietu węzłów.

Jeśli nie ma węzła API dla tego (jestem pewien, że nie będzie), to czy jest sposób, w jaki mogę to zrobić z węzła przez wywoływanie poleceń systemowych?

Musi działać na systemach Windows, Linux i MacOS.

+0

To nie byłby interfejs Node API, byłby to ustawienie przeglądarki. – hexacyanide

+1

Protokoły @hexacyanide Url są obsługiwane przez system operacyjny, nie przez przeglądarkę, z powodzeniem zaimplementowałem go w systemie Windows (musisz dodać kilka kluczy rejestru), ale chciałeś się dowiedzieć, czy istnieje interfejs API węzła między platformami, a nie osobno wdrażać każdą platformę. –

+0

To może wydawać się niespójne, ponieważ procedury obsługi protokołów mogą być dodawane zarówno w Chrome, jak i Firefox przy użyciu samych ustawień. – hexacyanide

Odpowiedz

20

To ciekawy pomysł. Nie wydaje mi się, że istnieje obecnie rozwiązanie cross-node.js. I nie natknąć tego wątku ludzi prosząc o to samo:

https://github.com/rogerwang/node-webkit/issues/951 

Electron obsługującego go teraz z app.setAsDefaultProtocolClient API (since v0.37.4) dla MacOS i Windows.

Nie byłoby strasznie trudno napisać bibliotekę, aby to zrobić.

Okna:

Na stronie okna trzeba by zarejestrować aplikację jako aplikacji, która obsługuje ten schemat URI.

Musisz utworzyć wpis rejestru dla danej aplikacji:

 
HKEY_CLASSES_ROOT 
    alert 
     (Default) = "URL:Alert Protocol" 
     URL Protocol = "" 
     DefaultIcon 
     (Default) = "alert.exe,1" 
     shell 
     open 
      command 
       (Default) = "C:\Program Files\Alert\alert.exe" "%1" 

Potem, gdy aplikacja jest prowadzony przez okna, powinieneś być w stanie zobaczyć argumenty w process.argv[]. Upewnij się, że uruchamiasz powłokę, aby uruchomić węzeł, a nie tylko aplikację.

Original MSDN article

Uwaga ta wymaga uprawnień administratora i ustawia całego systemu obsługi. Aby to zrobić dla każdego użytkownika, można użyć zamiast niego HKEY_CURRENT_USER\Software\Classes, jako implementację elektronu does it.

Apple:

Wspomniany "OS X" artykuł w komentarzu github jest rzeczywiście dla iOS.Chciałbym spojrzeć na poniższej instrukcji programowania do informacji na temat rejestrowania aplikacji do obsługi systemu URL:

Apple Dev Documentation

Podsumowując, trzeba stworzyć usługę uruchamiania i wypełnić plik .plist z CFBundleURLTypes , to pole jest tablicą i powinno być wypełnione tylko nazwą protokołu, tj. http

Następujące Super User Question ma lepsze rozwiązanie, ale jest na ustawienie użytkownika.

„Plik szukacie jest ~/Library/Preferences/com.apple.LaunchServices.plist.

Posiada tablicę o nazwie LSHandlers i słownika dzieci, które definiują się LSHandlerURLScheme może zostać odpowiednio zmodyfikowany z LSHandlerRole . "

Linux: (? Zaskoczenia)

Z tego co mogę powiedzieć, istnieje kilka sposobów, aby tego dokonać w Linux

Gnome posiada narzędzie, które pozwoli Ci zarejestrować program obsługi url w3 archives

gconftool-2 -t string -s /desktop/gnome/url-handlers/tel/command "bin/vonage-call %s" 
gconftool-2 -s /desktop/gnome/url-handlers/tel/needs_terminal false -t bool 
gconftool-2 -t bool -s /desktop/gnome/url-handlers/tel/enabled true 

Niektóre z lżejszych menedżerów wagi wyglądają tak, jakby pozwalały tworzyć fałszywe typy mime i rejestrować je jako procedury obsługi protokołów URI.

„Fake-typy MIME są tworzone przez URI z różnym systemem tak: application/x-xdg-od protokołu Aplikacje wspierające specyficzną protokołu URI można dodać fałszywe mime-type z ich klucz mimeType w swoich plikach wejściowych stacjonarnych Łatwo jest więc znaleźć wszystkie aplikacje zainstalowane w systemie obsługującym schemat URI, szukając w pliku mimeinfo.cache. Ponownie plik defaults.list może być użyty do określenia domyślnego programu dla sproficowanego typu URI. " wiki.lxde.org

KDE obsługuje również ich własny sposób manipulowania obsługi URL protokołu:

utworzyć plik: $KDEDIR/share/services/your.protocol i wypełnić go z odpowiednimi danymi:

 
[Protocol] 
exec=/path/to/player "%u" 
protocol=lastfm 
input=none 
output=none 
helper=true 
listing= 
reading=false 
writing=false 
makedir=false 
deleting=false 

od last.fm forums wszystkich miejscach

Nadziei to pomaga.

+0

OK, to wydaje się odpowiadać na części MacOS i Windows. Jeśli możesz podać więcej informacji o Linuksie, w tym o tym, jak będzie działał w systemach wykorzystujących lżejsze środowiska graficzne, na przykład XFCE i LXDE w systemie Linux; Przyznam nagrodę. (Jest to w dużej mierze oparte na linkach, więc proszę przytoczyć te zasoby w przypadku zgnilizny linków). – FakeRainBrigand

+0

Z badań wynika, że ​​Windows prawdopodobnie radzi sobie z tym najlepiej, po stronie Maca nie powinno to być zbyt trudne. Po stronie Linuxa, jeśli wiesz, czego użyje użytkownik końcowy, powinieneś znaleźć szczęśliwą medianę i być może powodzenia z jednym z systemów, który działa. Byłby to NIESAMOWITY moduł npm, jeśli w końcu coś stworzysz, powiedz mi o tym, chciałbym to zobaczyć! Byłbym nawet skłonny rzucić rękę z kodowaniem i testowaniem. – jeremy

+0

Świetnie! To bardzo pomaga. Myślę, że zawinę to wszystko w moduł węzła, a tutaj dodam inny komentarz. Nie będę jednak mógł tego zrobić przez krótką chwilę. – FakeRainBrigand

-17

Przede wszystkim tworzenie własnego protokołu jest szalone, nie rób tego.

Wygląda na to, że wszystko, co chcesz zrobić, to móc uruchomić pakiet węzłów z przeglądarki internetowej. Normalnym sposobem uruchomienia zewnętrznego programu z poziomu przeglądarki internetowej jest napisanie wtyczki przeglądarki.

W ten sposób pliki pdf, torrenty i iTunes są uruchamiane z przeglądarki.

Podsumowując, aby zrobić to, co chcesz, musisz napisać wtyczkę i poprosić użytkowników o zainstalowanie. Nie jest to dobry pomysł, który mógłbym powiedzieć.

+6

Nie zgadzam się z tym, że wtyczka do przeglądarki jest najlepszym sposobem, aby to zrobić, musi to być natywne rozszerzenie, a nie zwykłe rozszerzenie chrome. iTunes używa protokołu, a nie wtyczki (itms: //), podobnie jak github, spotify itp. Chociaż może być dość trudno zarejestrować program obsługi protokołu, to z pewnością nie jest to niemożliwe i byłoby znacznie trudniej napisać wtyczkę do przeglądarki. (potrzebujesz osobnej dla każdej platformy). –

3

Oto jak to zrobiłem na Mac OS z NW.js aplikacji:

  1. otworzyć aplikację /Applications/Utilities/Script Editor

    wpisz następujący kod w edytorze

    on open location this_URL 
        do shell script "/Applications/X.app/Contents/MacOS/x '" & this_URL & "'" 
    end open location 
    

    Zamień X pod nazwą aplikacji.

    Zapisz skrypt jako Zastosowanie Bundle nigdzie

  2. idź do skryptu, kliknij prawym przyciskiem myszy, a następnie „Pokaż Zawartość opakowania” następnie edytować Contents/info.plist

    Dodaj poniższe linie na końcu pliku tuż przed </dict></plist>:

    <key>CFBundleIdentifier</key> 
    <string>com.mycompany.AppleScript.AppName</string> <!-- edit here --> 
    <key>CFBundleURLTypes</key> 
    <array> 
        <dict> 
        <key>CFBundleURLName</key> 
        <string>AppName</string> <!-- edit here --> 
        <key>CFBundleURLSchemes</key> 
        <array> 
         <string>myurlscheme</string> <!-- your url scheme here --> 
        </array> 
        </dict> 
    </array> 
    
  3. teraz można otworzyć łącze zaczynając od myurlscheme: i widzisz, że twoja aplikacja się otwiera!

+0

Tworzysz aplikację, by otworzyć inną aplikację? Dlaczego po prostu nie umieść tych plików info.plist w pliku info.plist aplikacji, którą chcesz otworzyć? Czy to nie zadziała z jakiegoś powodu? – Houseman

Powiązane problemy