アプリ起動・終了時の処理を書く (ライフサイクル)

Recipe ID: rust-012

「アプリが起動した瞬間に初期設定ファイルを読み込みたい」「アプリが終了するときにログを保存したい」といった処理は、Tauri のライフサイクルフックを利用して記述します。

1. 起動時の処理: setup フック

アプリの起動直後、まだウィンドウが表示される前などに実行されます。
ここで初期データのロードや、ディレクトリの作成などを行います。
Tauri v2 では通常 src-tauri/src/lib.rs に記述します。

// src-tauri/src/lib.rs
use tauri::Manager; // app.path() などを使うために必要

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .setup(|app| {
            // --- 起動時の処理ここから ---
            
            println!("アプリの初期化を開始します...");

            // 例: データ保存用ディレクトリのパスを取得
            // app.path().app_data_dir() は Result を返すため unwrap 等で処理
            let app_data_dir = app.path().app_data_dir().unwrap();
            
            // ディレクトリが存在しない場合は作成する
            if !app_data_dir.exists() {
                std::fs::create_dir_all(&app_data_dir)?;
                println!("データディレクトリを作成しました: {:?}", app_data_dir);
            }

            // --- 起動時の処理ここまで ---
            
            // Ok(()) を返さないとアプリが起動せずに終了します
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

2. 実行中・終了時の処理: run コールバック

.run() メソッドにクロージャ(関数)を渡すことで、イベントループ内の様々なイベントを捕捉できます。
特に アプリ終了時 の処理を書きたい場合に便利です。

// src-tauri/src/lib.rs

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    // 1. ビルダーを作成し、.build() で App インスタンスを生成する
    let app = tauri::Builder::default()
        .setup(|app| {
             // ... setup処理 ...
             Ok(())
        })
        .build(tauri::generate_context!())
        .expect("error while running tauri application");

    // 2. app.run() にクロージャを渡してイベントを監視する
    app.run(|_app_handle, event| {
        match event {
            // アプリ終了リクエスト (ウィンドウの閉じるボタンや CMD+Q など)
            tauri::RunEvent::ExitRequested { api, .. } => {
                println!("アプリが終了しようとしています");
                
                // 終了前に保存処理などを行う
                // save_app_state(); 

                // 必要であれば終了をキャンセルする
                // api.prevent_exit();
            }
            _ => {}
        }
    });
}

// 補足: 状態保存用の関数例
fn save_app_state() {
    println!("データを保存しました");
}