La instancia única
Ya ha hecho falta cuatro veces: para los enlaces, para abrir ficheros, para la base de datos y para la bandeja. Cómo se implementa bien y qué hacer con la segunda instancia.
Por qué hace falta
Cinco sistemas distintos rotos por la misma causa, y todos se arreglan de una vez.
Cómo se implementa
El mecanismo tiene dos partes: detectar que ya hay una, y comunicarle lo que traía la segunda.
tauri::Builder::default() .plugin(tauri_plugin_single_instance::init(|app, argv, cwd| { // esto corre en la instancia que YA estaba if let Some(w) = app.get_webview_window("main") { let _ = w.unminimize(); // puede estar minimizada let _ = w.show(); // o escondida en la bandeja let _ = w.set_focus(); // y hay que traerla al frente } procesar_argumentos(app, &argv, &cwd); }))Las tres llamadas de ventana hacen falta las tres, y en ese orden: una ventana escondida en la bandeja no se trae al frente solo con dar foco, y una minimizada tampoco.
Y el directorio de trabajo importa: si la segunda instancia recibió una ruta relativa, hay que resolverla contra el directorio desde donde se lanzó, no contra el de la primera.
El fallo peligroso
El que hay que evitar por encima de todo: una aplicación que cree que ya hay otra instancia y no arranca.
Ocurre cuando el mecanismo de detección deja rastro y ese rastro sobrevive a un cierre inesperado — un fichero de bloqueo que no se borra, por ejemplo. El usuario mata la aplicación, la vuelve a abrir, y no pasa nada: la aplicación arranca, ve el rastro, cree que hay otra, y se cierra.
El síntoma es brutal: la aplicación deja de abrirse y no hay ningún mensaje. Y la única salida para el usuario es reiniciar o borrar un fichero que no sabe que existe.
La regla 3 resume la actitud correcta: es mejor un fallo que el usuario puede ver y sortear que uno que le deja sin aplicación.
Cuándo sí conviene permitir varias
Para no absolutizar, hay dos casos legítimos:
- Aplicaciones de documento, donde cada ventana es un documento independiente. Y ahí la respuesta correcta suele ser una instancia con varias ventanas, no varias instancias: el proceso es uno y las ventanas muchas, con lo que la base y las preferencias siguen siendo únicas.
- Perfiles separados, si tu aplicación los soporta: cada perfil con su directorio de datos. Entonces la unicidad es por perfil, no por aplicación, y el mecanismo tiene que tenerlo en cuenta.
Fuera de esos dos, una instancia.