【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现软件开机自启

前言

桌面应用开发中,开机自启是一个常见但重要的功能。无论是工具类软件还是系统增强类应用,开机自启都能提升用户体验,方便用户快速使用。然而,实现开机自启需要对操作系统的底层机制有一定的了解。本文将结合 Rust 编程语言和 Tauri 2.0 框架,详细讲解如何在不同平台(Windows、Linux、macOS)实现软件的开机自启功能。

Rust 以其强大的内存安全和跨平台能力,成为越来越多开发者的首选。而 Tauri 2.0 作为一个现代化的桌面应用框架,支持使用 Web 技术构建高性能的跨平台应用。结合这两者,我们可以轻松实现开机自启功能。

本文将从基础概念开始,逐步深入,涵盖 Windows、Linux 和 macOS 三个平台的实现方法,并提供详细的代码示例和实操步骤。同时还要给出Tauri官方给出的一键式终极解决方案,助你更加简单,优雅,安全的实现软件开机自启。


一、准备工作

1.1 环境搭建

在开始开发之前,需要确保你的开发环境已经准备就绪。以下是需要安装的工具和库:

  1. Rust 编程语言 :访问 Rust 官方网站,按照指引安装 Rust。
  2. Tauri 2.0 框架 :按照 Tauri 官方文档 安装 Tauri CLI 和相关依赖。
  3. 代码编辑器:推荐使用 VS Code,并安装 Rust 和 Tauri 的插件。
  4. 操作系统权限:根据目标平台的不同,可能需要管理员权限或其他特殊权限。

1.2 创建 Tauri 项目

首先,创建一个新的 Tauri 项目:

lua 复制代码
pnpm create tauri-app

1

这将创建一个基本的 Tauri 应用框架。

1.3 添加依赖

Cargo.toml 文件中添加以下依赖:

csharp 复制代码
pnpm tauri add autostart

1

二、实现开机自启的基本原理

2.1 开机自启的基本概念

开机自启是指在操作系统启动时自动运行指定的程序。不同的操作系统实现开机自启的方式不同:

  • Windows:通过注册表或任务计划程序。
  • Linux:通过 systemd 服务或启动脚本。
  • macOS:通过 LaunchAgents 或 LaunchDaemons。

2.2 Tauri 应用的生命周期

Tauri 应用的生命周期由以下几个阶段组成:

  1. 启动:应用初始化。
  2. 运行:应用主循环。
  3. 退出:应用关闭。

在实现开机自启时,我们需要在应用安装或首次运行时向操作系统注册启动项。


三、Windows 平台实现

3.1 Windows 注册表机制

Windows 通过注册表中的 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 分支来管理开机自启项。

3.2 实现步骤

  1. 获取可执行文件路径:在安装时获取应用的可执行文件路径。
  2. 写入注册表:将应用路径写入注册表的指定位置。

以下是示例代码:

rust 复制代码
use winreg::enums::*;
use winreg::RegKey;

fn set_autostart() -> Result<(), Box<dyn std::error::Error>> {
    let app_name = "MyTauriApp";
    let app_path = std::env::current_exe()?.to_str().unwrap();

    let key = RegKey::predef(HKEY_CURRENT_USER)
        .open(SUBKEY_WRITE, "Software\Microsoft\Windows\CurrentVersion\Run")?;
    
    key.set_value(app_name, &format!("{} {}", app_path, "--autostart"))?;
    
    Ok(())
}

1234567891011121314

3.3 注意事项

  • 需要管理员权限才能写入注册表。
  • 应用卸载时需要清理注册表项。

四、Linux 平台实现

4.1 Linux systemd 服务

Linux 上,systemd 是大多数发行版的初始化系统。通过创建 systemd 服务文件,可以实现开机自启。

4.2 实现步骤

  1. 创建服务文件 :在 /etc/systemd/system/ 目录下创建服务文件。
  2. 配置服务文件:指定应用的启动命令。
  3. 启用服务 :使用 systemctl enable 启用服务。

以下是服务文件示例:

ini 复制代码
[Unit]
Description=My Tauri App
After=network.target

[Service]
ExecStart=/usr/bin/my_tauri_app
Restart=always

[Install]
WantedBy=multi-user.target

12345678910

4.3 Rust 实现

在 Rust 中,可以通过执行 shell 命令来创建和启用服务:

css 复制代码
use std::process::Command;

fn set_autostart() -> Result<(), Box<dyn std::error::Error>> {
    let app_path = std::env::current_exe()?.to_str().unwrap();

    Command::new("sudo")
        .arg("cp")
        .arg(format!("{} /etc/systemd/system/my_tauri_app.service", app_path))
        .status()?
        .expect("Failed to copy service file");

    Command::new("sudo")
        .arg("systemctl")
        .arg("enable")
        .arg("my_tauri_app")
        .status()?
        .expect("Failed to enable service");

    Ok(())
}

1234567891011121314151617181920

4.4 注意事项

  • 需要 root 权限才能创建和启用服务。
  • 应用卸载时需要禁用并删除服务文件。

五、macOS 平台实现

5.1 macOS LaunchAgent

macOS 通过 LaunchAgent 和 LaunchDaemon 管理开机自启。LaunchAgent 在用户登录时启动,LaunchDaemon 在系统启动时启动。

5.2 实现步骤

  1. 创建 plist 文件 :在 ~/Library/LaunchAgents/ 目录下创建 plist 文件。
  2. 配置 plist 文件:指定应用的启动路径和参数。
  3. 加载 plist 文件 :使用 launchctl 加载配置。

以下是 plist 文件示例:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.mycompany.mytauriapp</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/my_tauri_app</string>
        <string>--autostart</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

123456789101112131415

5.3 Rust 实现

在 Rust 中,可以通过执行 shell 命令来创建和加载 plist 文件:

css 复制代码
use std::process::Command;

fn set_autostart() -> Result<(), Box<dyn std::error::Error>> {
    let app_path = std::env::current_exe()?.to_str().unwrap();

    Command::new("cp")
        .arg(format!("{}/org.mycompany.mytauriapp.plist", app_path))
        .arg("~/Library/LaunchAgents/")
        .status()?
        .expect("Failed to copy plist file");

    Command::new("launchctl")
        .arg("load")
        .arg("-w")
        .arg("~/Library/LaunchAgents/org.mycompany.mytauriapp.plist")
        .status()?
        .expect("Failed to load plist file");

    Ok(())
}

1234567891011121314151617181920

5.4 注意事项

  • plist 文件需要正确签名和权限。
  • 应用卸载时需要卸载和删除 plist 文件。

六、Tauri官方给的终极解决方案(推荐)

Tauri官方给出了跨平台开机自启动的终极解决方案------autostart插件,你可以在Tauri中不去操作操作系统而直接调用开机自启动功能,而无需关心底层实现,也就是说上面三种方式可以完全不用,而仅需要简单的配置。

首先确定你是否满足以下条件,再看是否适合你的需求:

  • x \] Rust版本大于`1.77.2`

如果两个条件全部满足,那么你可以继续往下看了。

6.1 添加依赖

Cargo.toml 文件中添加以下依赖:

csharp 复制代码
pnpm tauri add autostart

1

6.2 添加API权限

你需要打开src-tauri/capabilities/default.json文件来修改,添加以下内容,当然也可以根据你的需求酌情定制

json 复制代码
{
  "permissions": [
    ..., // 以上是原来的内容
    "autostart:allow-enable",
    "autostart:allow-disable",
    "autostart:allow-is-enabled"
  ]
}

12345678

6.3 在Javascript或者Typescript中调用代码

调用的部分主要是以下示例代码,以上配置没问题时直接写即可。

javascript 复制代码
import { enable, isEnabled, disable } from '@tauri-apps/plugin-autostart';
// 如果你使用了""withGlobalTauri": true",那么用下面的代码
// const { enable, isEnabled, disable } = window.__TAURI__.autostart;

// 启用开机启动
await enable();
// 检查是否已经开机启动
console.log(`registered for autostart? ${await isEnabled()}`);
// 禁用开机启动
disable();

12345678910

6.4 在Rust端实现开机自启动

rust 复制代码
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .setup(|app| {
            #[cfg(desktop)]
            {
                use tauri_plugin_autostart::MacosLauncher;
                use tauri_plugin_autostart::ManagerExt;

                app.handle().plugin(tauri_plugin_autostart::init(
                    MacosLauncher::LaunchAgent,
                    Some(vec!["--flag1", "--flag2"]),
                ));

                // 获取插件
                let autostart_manager = app.autolaunch();
                // 启用自启动
                let _ = autostart_manager.enable();
                // 查询自启动状态
                println!("registered for autostart? {}", autostart_manager.is_enabled().unwrap());
                // 禁用自启动
                let _ = autostart_manager.disable();
            }
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

12345678910111213141516171819202122232425262728

总结

通过本文,你学会了如何在 Rust 和 Tauri 2.0 框架下实现软件的开机自启功能。无论是 Windows、Linux 还是 macOS,都可以通过不同的机制轻松实现这一功能。记得在开发过程中注意权限管理和用户提示,确保应用符合平台规范和用户期望。

在实际开发中,可以根据需要扩展功能,如添加开机延迟、自定义启动参数等。同时,确保在应用卸载时清理相关配置,避免残留问题。

希望本文能帮助你在桌面应用开发中更好地实现开机自启功能。如果有任何问题或需要进一步的帮助,欢迎在评论区留言。

相关推荐
测试开发Kevin18 小时前
小tip:换行符CRLF 和 LF 的区别以及二者在实际项目中的影响
java·开发语言·python
笨手笨脚の18 小时前
Redis: Thread limit exceeded replacing blocked worker
java·redis·forkjoin·thread limit
Lenyiin18 小时前
Linux 基础IO
java·linux·服务器
松☆18 小时前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
编码者卢布18 小时前
【Azure Storage Account】Azure Table Storage 跨区批量迁移方案
后端·python·flask
编码者卢布19 小时前
【App Service】Java应用上传文件功能部署在App Service Windows上报错 413 Payload Too Large
java·开发语言·windows
q行19 小时前
Spring概述(含单例设计模式和工厂设计模式)
java·spring
好好研究20 小时前
SpringBoot扩展SpringMVC
java·spring boot·spring·servlet·filter·listener
毕设源码-郭学长20 小时前
【开题答辩全过程】以 高校项目团队管理网站为例,包含答辩的问题和答案
java