<AI>
ブラウザのリンク(myapp:// など)からローカルのJavaFXアプリを起動する仕組みは、
「OSのカスタムURLスキーム(プロトコルハンドラー)登録」と「コマンドライン引数の受け渡し」の組み合わせによって実現されます。
Java単体ではブラウザと直接通信できないため、OSの機能を仲介させる必要があります。
具体的な仕組みと実装の流れは以下の通りです。
1. 全体の仕組み
ブラウザでのクリック: Webページ上の myapp://login?token=xyz のようなリンクをクリックする。
OSによる検知: ブラウザがそのスキーマ(myapp)をOSに渡す。
アプリの起動: OSがレジストリ(Windows)や設定ファイル(Mac)を読み込み、指定されたJavaFXアプリ(.exe や .app)を起動する。
引数の受け渡し: 起動時にURL全体がコマンドライン引数としてアプリに渡される。
JavaFX側での処理: アプリ(Applicationクラス)の getParameters() メソッド等で引数を受け取り、URLのパスやパラメータを解析して目的の画面を開く。
2. OSごとの設定方法
【Windowsの場合】(レジストリ登録)
Windowsでは、OSのレジストリに「どのプロトコルが呼ばれたら、どのアプリを起動するか」を書き込みます。
HKEY_CLASSES_ROOT 配下に新しいキー(例: myapp)を作成し、実行ファイルのパスと引数("%1")を登録します。
text
HKEY_CLASSES_ROOT
└─ myapp
├─ (既定値): "URL:myapp Protocol"
├─ URL Protocol: (空の文字列)
└─ shell
└─ open
└─ command
└─ (既定値): "C:\Path\To\YourApp.exe" "%1"
【Macの場合】(Info.plist の設定)
macOSのバンドルアプリ(.app)では、パッケージ内の Info.plist に CFBundleURLTypes キーを追加します。
xml
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.example.myapp</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
3. JavaFX(Java)側での処理
アプリケーションが起動した際、渡されたURL文字列をキャッチして処理します。
java
import javafx.application.Application;
import javafx.stage.Stage;
import java.util.List;
public class MainApp extends Application {
@Override
public void start(Stage primaryStage) {
// 起動時に渡された引数(パラメータ)を取得
Parameters parameters = getParameters();
List rawArguments = parameters.getRaw();
if (!rawArguments.isEmpty()) {
String url = rawArguments.get(0); // 例: "myapp://action/123"
// URLをパースして画面遷移などの処理を実行するメソッドへ
processDeepLink(url);
}
}
}
4. 注意点・実装のポイント
すでにアプリが起動している場合: デフォルトのままだとURLをクリックするたびにアプリの多重起動(別プロセス)が発生します。
多重起動を防ぎたい場合は、初回起動時にローカルポート(ソケット通信)で待ち受けを行い、
2回目以降の起動時にURL引数を初回プロセスに転送するような排他制御の実装が必要になります。
インストーラーの活用: カスタムURLスキームの登録はシステム管理者権限(管理者モード)が必要になるため、
アプリ配布時に Inno Setup などのインストーラーを使用して自動でOS設定を行うのが一般的です。