Skip to content

Commit c9bedcd

Browse files
committed
Improve deep link for debug build on macOS
1 parent 6c1c6c2 commit c9bedcd

File tree

2 files changed

+46
-6
lines changed

2 files changed

+46
-6
lines changed

plugins/single-instance/src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ pub fn init<R: Runtime, F: FnMut(&AppHandle<R>, Vec<String>, String) + Send + Sy
3535
#[cfg(feature = "deep-link")]
3636
if let Some(deep_link) = app.try_state::<tauri_plugin_deep_link::DeepLink<R>>() {
3737
deep_link.handle_cli_arguments(args.iter());
38+
#[cfg(all(target_os = "macos", debug_assertions))]
39+
{
40+
let mut args = args.iter();
41+
args.next();
42+
let arg = args.next();
43+
use tauri::Emitter;
44+
if let Some(url) = arg {
45+
let _ = app.emit("deep-link://new-url", vec![url]);
46+
}
47+
}
3848
}
3949
f(app, args, cwd)
4050
}))

plugins/single-instance/src/platform_impl/macos.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// SPDX-License-Identifier: MIT
44

55
use std::{
6-
io::{BufWriter, Error, ErrorKind, Read, Write},
6+
io::{BufWriter, ErrorKind, Read, Write},
77
os::unix::net::{UnixListener, UnixStream},
88
path::PathBuf,
99
};
@@ -16,17 +16,25 @@ use tauri::{
1616
AppHandle, Config, Manager, RunEvent, Runtime,
1717
};
1818

19+
#[cfg(debug_assertions)]
20+
static IS_PRIMARY_APP: std::sync::OnceLock<bool> = std::sync::OnceLock::new();
21+
1922
pub fn init<R: Runtime>(cb: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
2023
plugin::Builder::new("single-instance")
2124
.setup(|app, _api| {
2225
let socket = socket_path(app.config(), app.package_info());
2326

2427
// Notify the singleton which may or may not exist.
25-
match notify_singleton(&socket) {
28+
match notify_singleton(&socket, &std::env::args().collect::<Vec<_>>()) {
2629
Ok(_) => {
30+
#[cfg(debug_assertions)]
31+
IS_PRIMARY_APP.set(false).unwrap();
32+
#[cfg(not(debug_assertions))]
2733
std::process::exit(0);
2834
}
2935
Err(e) => {
36+
#[cfg(debug_assertions)]
37+
IS_PRIMARY_APP.set(true).unwrap();
3038
match e.kind() {
3139
ErrorKind::NotFound | ErrorKind::ConnectionRefused => {
3240
// This process claims itself as singleton as likely none exists
@@ -44,10 +52,32 @@ pub fn init<R: Runtime>(cb: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
4452
}
4553
Ok(())
4654
})
47-
.on_event(|app, event| {
48-
if let RunEvent::Exit = event {
55+
.on_event(|app, event| match event {
56+
RunEvent::Exit => {
4957
destroy(app);
5058
}
59+
#[cfg(debug_assertions)]
60+
RunEvent::Opened { urls } => {
61+
if let Some(true) = IS_PRIMARY_APP.get() {
62+
return;
63+
}
64+
let socket = socket_path(app.config(), app.package_info());
65+
match notify_singleton(
66+
&socket,
67+
&std::env::args()
68+
.take(1)
69+
.chain(urls.iter().map(|url| url.to_string()))
70+
.collect::<Vec<String>>(),
71+
) {
72+
Ok(_) => {
73+
std::process::exit(0);
74+
}
75+
Err(e) => {
76+
tracing::error!(?e);
77+
}
78+
}
79+
}
80+
_ => {}
5181
})
5282
.build()
5383
}
@@ -74,10 +104,10 @@ fn socket_cleanup(socket: &PathBuf) {
74104
let _ = std::fs::remove_file(socket);
75105
}
76106

77-
fn notify_singleton(socket: &PathBuf) -> Result<(), Error> {
107+
fn notify_singleton(socket: &PathBuf, args: &[String]) -> Result<(), std::io::Error> {
78108
let stream = UnixStream::connect(socket)?;
79109
let mut bf = BufWriter::new(&stream);
80-
let args_joined = std::env::args().collect::<Vec<String>>().join("\0");
110+
let args_joined = args.join("\0");
81111
bf.write_all(args_joined.as_bytes())?;
82112
bf.flush()?;
83113
drop(bf);

0 commit comments

Comments
 (0)