アプリの二重起動(多重起動)を防止し、既に起動しているインスタンスにフォーカスを当てたり、引数を渡したりするための 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 の仕組み上、デフォルトで単一インスタンスのような挙動をしますが、このプラグインを使うことでクロスプラットフォームで統一的な挙動を実現できます。