Add sound support for desktop notifications in Tauri v2 (#2678)

* Add sound support for desktop notifications in Tauri v2

* ci

---------

Co-authored-by: Lucas Nogueira <lucas@tauri.app>

Committed via a GitHub action: https://github.com/tauri-apps/plugins-workspace/actions/runs/17127784916

Co-authored-by: lucasfernog <lucasfernog@users.noreply.github.com>
This commit is contained in:
Keerthi
2025-08-21 13:06:24 +00:00
committed by tauri-bot
parent 5dccdcc893
commit a3f886efc8
5 changed files with 70 additions and 3 deletions

View File

@@ -95,6 +95,45 @@ export async function enqueueNotification(title, body) {
}
```
### Notification with Sound
You can add sound to your notifications on all platforms (desktop and mobile):
```javascript
import { sendNotification } from '@tauri-apps/plugin-notification'
import { platform } from '@tauri-apps/api/os'
// Basic notification with sound
sendNotification({
title: 'New Message',
body: 'You have a new message',
sound: 'notification.wav' // Path to sound file
})
// Platform-specific sounds
async function sendPlatformSpecificNotification() {
const platformName = platform()
let soundPath
if (platformName === 'darwin') {
// On macOS: use system sounds or sound files in the app bundle
soundPath = 'Ping' // macOS system sound
} else if (platformName === 'linux') {
// On Linux: use XDG theme sounds or file paths
soundPath = 'message-new-instant' // XDG theme sound
} else {
// On Windows: use file paths
soundPath = 'notification.wav'
}
sendNotification({
title: 'Platform-specific Notification',
body: 'This notification uses platform-specific sound',
sound: soundPath
})
}
```
## Contributing
PRs accepted. Please make sure to read the Contributing Guide before making a pull request.

8
dist-js/index.d.ts vendored
View File

@@ -60,7 +60,13 @@ interface Options {
*/
groupSummary?: boolean;
/**
* The sound resource name. Only available on mobile.
* The sound resource name or file path for the notification.
*
* Platform specific behavior:
* - On macOS: use system sounds (e.g., "Ping", "Blow") or sound files in the app bundle
* - On Linux: use XDG theme sounds (e.g., "message-new-instant") or file paths
* - On Windows: use file paths to sound files (.wav format)
* - On Mobile: use resource names
*/
sound?: string;
/**

View File

@@ -71,7 +71,13 @@ interface Options {
*/
groupSummary?: boolean
/**
* The sound resource name. Only available on mobile.
* The sound resource name or file path for the notification.
*
* Platform specific behavior:
* - On macOS: use system sounds (e.g., "Ping", "Blow") or sound files in the app bundle
* - On Linux: use XDG theme sounds (e.g., "message-new-instant") or file paths
* - On Windows: use file paths to sound files (.wav format)
* - On Mobile: use resource names
*/
sound?: string
/**

View File

@@ -39,6 +39,9 @@ impl<R: Runtime> crate::NotificationBuilder<R> {
if let Some(icon) = self.data.icon {
notification = notification.icon(icon);
}
if let Some(sound) = self.data.sound {
notification = notification.sound(sound);
}
#[cfg(feature = "windows7-compat")]
{
notification.notify(&self.app)?;
@@ -102,6 +105,8 @@ mod imp {
title: Option<String>,
/// The notification icon.
icon: Option<String>,
/// The notification sound.
sound: Option<String>,
/// The notification identifier
identifier: String,
}
@@ -136,6 +141,13 @@ mod imp {
self
}
/// Sets the notification sound file.
#[must_use]
pub fn sound(mut self, sound: impl Into<String>) -> Self {
self.sound = Some(sound.into());
self
}
/// Shows the notification.
///
/// # Examples
@@ -177,6 +189,9 @@ mod imp {
} else {
notification.auto_icon();
}
if let Some(sound) = self.sound {
notification.sound_name(&sound);
}
#[cfg(windows)]
{
let exe = tauri::utils::platform::current_exe()?;
@@ -250,6 +265,7 @@ mod imp {
}
}
/// Shows the notification on Windows 7.
#[cfg(all(windows, feature = "windows7-compat"))]
fn notify_win7<R: tauri::Runtime>(self, app: &tauri::AppHandle<R>) -> crate::Result<()> {
let app_ = app.clone();

View File

@@ -132,7 +132,7 @@ impl<R: Runtime> NotificationBuilder<R> {
self
}
/// The sound resource name. Only available on mobile.
/// The sound resource name for the notification.
pub fn sound(mut self, sound: impl Into<String>) -> Self {
self.data.sound.replace(sound.into());
self