Saltar al contenido

Instancia Única

GitHubcrates.io
Referencia de la API

Asegúrate de que solo se ejecute una instancia de tu aplicación Tauri a la vez utilizando el Plugin Single Instance.

Este plugin requiere una versión de Rust de al menos 1.77.2

PlataformaNivelNotas
windows
linux
macos
android
ios

Instala el plugin Single Instance para comenzar.

Usa el gestor de paquetes de tu proyecto para agregar la dependencia:

npm run tauri add single-instance

El plugin ya está instalado e inicializado, y debería funcionar correctamente de inmediato. Sin embargo, también podemos mejorar su funcionalidad con el método init().

El método init() del plugin toma un closure que se invoca cuando se inició una nueva instancia de la app, pero fue cerrada por el plugin. El closure tiene tres argumentos:

  1. app: El AppHandle de la aplicación.
  2. args: La lista de argumentos que fue pasada por el usuario para iniciar esta nueva instancia.
  3. cwd: El Directorio de Trabajo Actual (Current Working Directory) denota el directorio desde el cual se lanzó la nueva instancia de la aplicación.

Por lo tanto, el closure debería verse como a continuación

.plugin(tauri_plugin_single_instance::init(|app, args, cwd| {
// Write your code here...
}))

Por defecto, cuando inicias una nueva instancia mientras la aplicación ya se está ejecutando, no se realiza ninguna acción. Para enfocar la ventana de la instancia en ejecución cuando el usuario intente abrir una nueva instancia, altera el closure del callback de la siguiente manera:

src-tauri/src/lib.rs
use tauri::{AppHandle, Manager};
pub fn run() {
let mut builder = tauri::Builder::default();
#[cfg(desktop)]
{
builder = builder.plugin(tauri_plugin_single_instance::init(|app, args, cwd| {
let _ = app.get_webview_window("main")
.expect("no main window")
.set_focus();
}));
}
builder
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

En Linux, el plugin Single Instance usa DBus para asegurar que solo habrá una instancia ejecutándose. Lo hace publicando un servicio en DBus cuando la primera instancia comienza a ejecutarse. Luego, las siguientes instancias intentarán publicar el mismo servicio y, si ya está publicado, enviarán una solicitud al servicio para notificar a la primera instancia, y saldrán de inmediato.

A pesar de que esto funciona bastante bien cuando tu aplicación está empaquetada como un paquete deb o rpm o una AppImage, no funcionará según lo previsto para paquetes snap o flatpak por defecto debido a que estos paquetes se ejecutan en un entorno aislado (sandbox), donde la mayor parte de la comunicación con los servicios DBus estará bloqueada si no se declara explícitamente en el manifiesto de empaquetado.

Aquí tienes una guía que muestra cómo declarar los permisos necesarios para habilitar Single Instance para paquetes snap y flatpak:

El plugin Single Instance publicará un servicio llamado org.{id}.SingleInstance.

{id} será el identifier de tu archivo tauri.conf.json, pero con los puntos (.) y guiones (-) reemplazados por guión bajo (_).

Por ejemplo, si tu identificador es net.mydomain.MyApp:

  • net_mydomain_MyApp será el {id} de tu app
  • org.net_mydomain_MyApp.SingleInstance será el nombre del servicio SingleInstance de tu app

Necesitarás el nombre del servicio para autorizar a tu aplicación a usar el servicio DBus en los manifiestos de snap y flatpak, como se muestra a continuación.

En tu archivo snapcraft.yml, declara un plug y un slot para el servicio single instance, y usa ambos en la declaración de tu app:

snapcraft.yml
# ...
slots:
single-instance:
interface: dbus
bus: session
name: org.net_mydomain_MyApp.SingleInstance # Remember to change net_mydomain_MyApp to your app ID
plugs:
single-instance-plug:
interface: dbus
bus: session
name: org.net_mydomain_MyApp.SingleInstance # Remember to change net_mydomain_MyApp to your app ID
# .....
apps:
my-app:
# ...
plugs:
# ....
- single-instance-plug
slots:
# ...
- single-instance
# ....

Esto permitirá que tu aplicación envíe y reciba solicitudes desde/hacia el servicio DBus según lo esperado por el plugin Single Instance.

En tu archivo manifiesto de flatpak (tu.app.id.yml o tu.app.id.json), declara un finish args --talk-name y --own-name con el nombre del servicio:

net.mydomain.MyApp.yml
# ...
finish-args:
- --socket=wayland
- --socket=fallback-x11
- --device=dri
- --share=ipc
# ....
- --talk-name=org.net_mydomain_MyApp.SingleInstance # Remember to change net_mydomain_MyApp to your app ID
- --own-name=org.net_mydomain_MyApp.SingleInstance # Remember to change net_mydomain_MyApp to your app ID
# ...

Esto permitirá que tu aplicación envíe y reciba solicitudes desde/hacia el servicio DBus según lo esperado por el plugin Single Instance.

Debido a que este Plugin actualmente no tiene APIs de JavaScript, no tienes que configurar capabilities para usarlo.


© 2026 Colaboradores de Tauri. CC-BY / MIT