Saltar al contenido

Reinicio, instancia única y reapertura

Las tres formas de volver a entrar: reiniciarse a sí misma, recibir un segundo lanzamiento, y el icono del dock. Cierre de la fase IV.

Reiniciarse

Rust
// tras aplicar una actualización, o un cambio que exija arrancar de nuevoapp.restart();

Termina el proceso y lanza uno nuevo. Dos cosas hay que tener en cuenta:

El apagado del nivel 25.4 tiene que ocurrir igual. Reiniciar no exime de parar tareas ni de escribir lo pendiente; si tu procedimiento está en el evento de petición de salida, comprueba que también se dispara al reiniciar, y si no, llámalo antes.

Lo que quieras conservar entre las dos vidas, escríbelo. El proceso nuevo no hereda nada de memoria. Si el usuario estaba a mitad de algo, hay que persistir el punto y restaurarlo al arrancar — y avisarle de qué va a pasar antes de reiniciar es lo mínimo.

Instancia única

Por defecto, lanzar la aplicación dos veces arranca dos procesos, cada uno con su ventana y su estado. Para casi todo tipo de aplicación eso es un error: dos instancias escribiendo en la misma base de datos, dos que compiten por el mismo puerto, dos iconos de bandeja.

El plugin de instancia única lo resuelve, y hace algo más interesante que impedirlo:

Rust
.plugin(tauri_plugin_single_instance::init(|app, args, cwd| {    // el segundo lanzamiento no arranca: sus argumentos llegan AQUÍ    if let Some(w) = app.get_webview_window("main") {        let _ = w.unminimize();        let _ = w.set_focus();    }    abrir_lo_que_pidan(app, &args, &cwd);}))

Lo que trae es lo valioso. El segundo lanzamiento suele venir con información: el usuario hizo doble clic en un fichero, o abrió un enlace de tu esquema —nivel 51—. Sin este plugin, ese lanzamiento arrancaría una segunda instancia con el fichero; con él, la instancia que ya existe recibe la ruta y abre el documento en una pestaña o en una ventana nueva. Que es lo que el usuario esperaba.

Y las dos líneas del principio no sobran: desminimizar y enfocar. Sin ellas, el usuario hace doble clic, no arranca nada nuevo, y aparentemente no pasa nada — porque la ventana existente estaba minimizada. Es la misma corrección del nivel 12.1.

La reapertura de macOS

La tercera, y la que solo existe en una plataforma:

Rust
tauri::RunEvent::Reopen { has_visible_windows, .. } => {    if !has_visible_windows {        // no hay ventanas: hay que crear o mostrar una        if let Some(w) = app.get_webview_window("main") {            let _ = w.show();            let _ = w.set_focus();        } else {            crear_ventana_principal(app);        }    }}

Recuerda el nivel 24.4: en macOS, cerrar la última ventana deja la aplicación viva. El usuario vuelve al dock, pulsa el icono, y si no tratas este evento no ocurre absolutamente nada. Es una de las quejas más frecuentes de las aplicaciones de escritorio multiplataforma mal terminadas.

La bandera que trae dice si ya había ventanas visibles, para no hacer nada cuando no hace falta.

Las tres quejas