Instancia Única
Asegúrate de que solo se ejecute una instancia de tu aplicación Tauri a la vez utilizando el Plugin Single Instance.
Plataformas Soportadas
Sección titulada “Plataformas Soportadas”Este plugin requiere una versión de Rust de al menos 1.77.2
| Plataforma | Nivel | Notas |
|---|---|---|
| windows | ||
| linux | ||
| macos | ||
| android | ||
| ios |
Configuración
Sección titulada “Configuración”Instala el plugin Single Instance para comenzar.
Usa el gestor de paquetes de tu proyecto para agregar la dependencia:
npm run tauri add single-instanceyarn run tauri add single-instancepnpm tauri add single-instancedeno task tauri add single-instancebun tauri add single-instancecargo tauri add single-instance-
Ejecuta el siguiente comando en la carpeta
src-tauripara agregar el plugin a las dependencias del proyecto enCargo.toml:cargo add tauri-plugin-single-instance --target 'cfg(any(target_os = "macos", windows, target_os = "linux"))' -
Modifica
lib.rspara inicializar el plugin:lib.rs #[cfg_attr(mobile, tauri::mobile_entry_point)]pub fn run() {tauri::Builder::default().setup(|app| {#[cfg(desktop)]app.handle().plugin(tauri_plugin_single_instance::init(|app, args, cwd| {}));Ok(())}).run(tauri::generate_context!()).expect("error while running tauri application");}
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:
app: El AppHandle de la aplicación.args: La lista de argumentos que fue pasada por el usuario para iniciar esta nueva instancia.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...}))Enfocar en la Nueva Instancia
Sección titulada “Enfocar en la Nueva Instancia”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:
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");}Uso en Snap y Flatpak
Sección titulada “Uso en Snap y Flatpak”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:
Obtener el ID de tu app
Sección titulada “Obtener el ID de tu app”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_MyAppserá el{id}de tu apporg.net_mydomain_MyApp.SingleInstanceserá 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:
# ...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.
Flatpak
Sección titulada “Flatpak”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:
# ...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.
Permisos
Sección titulada “Permisos”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