13

Linux で Google Chrome 用のカスタム プロトコル ハンドラを作成しています。私のリンクは次のようになります。

<a href="myprotocol:someargument">Trigger my app with param</a>

「myprotocol:」が登録されていない (アプリがインストールされていない) 場合、Linux 上の Google Chrome は「外部プロトコル要求」ダイアログを表示し、xdg-open を使用しようとすることに気付きました。

ここに画像の説明を入力

Windows 10 や OS X El Capitan などの他の OS では、プロトコルが登録されていないと何も表示されません。

また、Firefox が Windows、OS X、および Linux 上の不明なプロトコルに対して一貫して動作することも確認しました - 何も表示されません。

Linux での Chrome の動作は、ユーザーにとって非常に紛らわしいものです。

Linux 上の Chrome (私は Ubuntu 14.04 でテストしていました) が他の OS や Web ブラウザーと異なる動作をする理由は何ですか?

4

1 に答える 1

6

問題は、Chrome にローカル プロトコル ハンドラがない場合、ユーザーの環境で構成されたハンドラを使用したいということです。デフォルト ハンドラを起動するためのまったく同じ API を提供する OS は 2 つとありません。実際に起動する前にこのプログラムが何であるかを理解することは、Windows や Linux の明確な API でさえありません。

「Mac」と Windows の両方の実装は、どの外部アプリケーションが最終的にプロトコルを担当するかを認識しているため、呼び出しの警告を発行せずに未処理の呼び出しを抑制することができます。しかし、実際には、Windows の実装は、Windows 上の既存のバージョンでの Windows レジストリの観察に依存しているクラッジです。このタイプの API 違反は、多くのフレーバーが関連する設定ツールのフォークが大きく異なる Linux ではより危険です。

Windows と OsX が何も呼び出していないという別の警告を発行しないのは、実際にはバグと見なされるため、それが正しい動作であると思われる場合は、ここにコメントしてください。

これは、現在のソースに基づいて3つのシステムがどのように機能するかについての私の観察です。

Linux

Linux では、プロトコル ハンドラを (ウィンドウ) システムに登録するときは、次のようにします。

xdg-settings set default-url-scheme-handler myprotocol evolution.desktop

今、アプリケーションの進化はあなたのプロトコルを担当しており、何でも呼び出すことができます:

 xdg-open myprotocol:...

これらのリンクで進化を開きます。他の OS にも同様のメカニズムがありますが、呼び出しスタブとして外部プログラムがない場合があります。

これは素晴らしく抽象的であり、呼び出している外部アプリが xdg-open であることを知っている/言っていると、Linux 実装の複雑さが大幅に回避されます。しかし、それはおそらくユーザーが望んでいる情報ではありません。その情報を取得するには、xdg-settings代わりに使用する必要があり、このシステムのいくつかのフレーバーでデフォルトハンドラーを条件付きでオーバーライドする方法がある場合、またはその方法がある場合は、正しくないというリスクがあります。

ウィンドウズ

Windows ハンドラーでは、レジストリ内をスヌーピングして、API の呼び出しが実際に何をするかについて知識に基づいて推測できるようです。xdg-open技術的には、クロムは外部プログラムを開く方法がシステム API を介して行われるため、これを行う必要があります。そのため、警告で参照されるような外部スタブはありません。

マック

「mac」ハンドラーには、特定の URL が起動するアプリについて問い合わせる適切な API があるため、chromeはそうします。アプリケーション名が空の文字列の場合、警告を生成する前に呼び出しを完全にドロップできます。

于 2016-03-05T00:17:23.157 に答える