Single Instance プラグインで多重起動を防ぐ

Recipe ID: plugin-011

アプリの二重起動(多重起動)を防止し、既に起動しているインスタンスにフォーカスを当てたり、引数を渡したりするための tauri-plugin-single-instance プラグインの使用方法です。

1. セットアップ

npm run tauri add single-instance

※ このプラグインの主な機能(多重起動の防止と既存インスタンスへの通知)は、アプリが起動する瞬間(Rust 側)に処理されるものです。そのため、フロントエンド(JavaScript/TypeScript)のコードでこのプラグインを直接 import して関数を呼び出すことは基本的にありません。
ただし、npm run tauri add コマンドを使用すると、他のプラグインと同様に Rust 側の依存関係 (Cargo.toml) と JavaScript 側のパッケージ (package.json) の両方が追加されます。フロントエンド側で明示的に使用しない場合でも、インストールされたままで問題ありません。

src-tauri/src/lib.rs:

use tauri::Manager;
use tauri::Emitter;

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_single_instance::init(|app, argv, _cwd| {
            // 2つ目のインスタンスが起動しようとした時に呼び出されます
            println!("新しいインスタンスが起動されました: {:?}", argv);

            // メインウィンドウを取得して表示・フォーカスする
            if let Some(window) = app.get_webview_window("main") {
                let _ = window.show();
                let _ = window.set_focus();
                // 必要に応じてウィンドウにイベントを投げる
                let _ = window.emit("second-instance", argv);
            }
        }))
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

2. フロントエンドでの処理

2つ目のインスタンスから渡されたイベントを受け取ります。

import { listen } from '@tauri-apps/api/event';

await listen<string[]>('second-instance', (event) => {
    console.log('Another instance args:', event.payload);
    alert('既に起動しています');
});

注意点

  • macOS では OS の仕組み上、デフォルトで単一インスタンスのような挙動をしますが、このプラグインを使うことでクロスプラットフォームで統一的な挙動を実現できます。