当前位置: 首页 > news >正文

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

文章目录

    • 前言
  • 一、准备工作
    • 1.1 环境搭建
    • 1.2 创建 Tauri 项目
    • 1.3 添加依赖
  • 二、实现开机自启的基本原理
    • 2.1 开机自启的基本概念
    • 2.2 Tauri 应用的生命周期
  • 三、Windows 平台实现
    • 3.1 Windows 注册表机制
    • 3.2 实现步骤
    • 3.3 注意事项
  • 四、Linux 平台实现
    • 4.1 Linux systemd 服务
    • 4.2 实现步骤
    • 4.3 Rust 实现
    • 4.4 注意事项
  • 五、macOS 平台实现
    • 5.1 macOS LaunchAgent
    • 5.2 实现步骤
    • 5.3 Rust 实现
    • 5.4 注意事项
  • 六、Tauri官方给的终极解决方案(推荐)
    • 6.1 添加依赖
    • 6.2 添加API权限
    • 6.3 在Javascript或者Typescript中调用代码
    • 6.4 在Rust端实现开机自启动
  • 总结


前言

在桌面应用开发中,开机自启是一个常见但重要的功能。无论是工具类软件还是系统增强类应用,开机自启都能提升用户体验,方便用户快速使用。然而,实现开机自启需要对操作系统的底层机制有一定的了解。本文将结合 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 项目:

pnpm create tauri-app

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

1.3 添加依赖

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

pnpm tauri add autostart

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

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. 写入注册表:将应用路径写入注册表的指定位置。

以下是示例代码:

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(())
}

3.3 注意事项

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

四、Linux 平台实现

4.1 Linux systemd 服务

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

4.2 实现步骤

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

以下是服务文件示例:

[Unit]
Description=My Tauri App
After=network.target

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

[Install]
WantedBy=multi-user.target

4.3 Rust 实现

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

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(())
}

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 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>

5.3 Rust 实现

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

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(())
}

5.4 注意事项

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

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

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

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

  • [ x ] Rust版本大于1.77.2
  • [ x ] 插件只允许在Windows,linux,macos中使用

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

6.1 添加依赖

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

pnpm tauri add autostart

6.2 添加API权限

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

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

6.3 在Javascript或者Typescript中调用代码

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

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();

6.4 在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");
}

总结

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

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

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

相关文章:

  • 方案精读:IBM方法论-IT规划方法论
  • centos linux安装mysql8 重置密码 远程连接
  • ctf-web: Gopher伪协议利用 -- GHCTF Goph3rrr
  • python---pickle库
  • 关于sqlalchemy的ORM的使用
  • 物联网商业模式
  • Java算术运算符与算术表达式
  • 第一章:大模型的起源与发展
  • 二、重学C++—C语言核心
  • JavaWeb——Mybatis、JDBC、数据库连接池、lombok
  • 【Linux系统编程】操作文件和目录的函数
  • 03_NLP常用的文本数据分析处理方法
  • elasticsearch 8.17.3部署文档
  • 『VUE』vue 引入Font Awesome图标库(详细图文注释)
  • 二、docker 存储
  • 文件系统调用(下) ─── linux第18课
  • 【redis】string应用场景:缓存功能和计数功能
  • UVa12303 Composite Transformations
  • c#客户端请求 Server-Sent Events
  • 音视频开发面试准备
  • 48岁黄世芳履新中国驻毛里求斯大使,曾在广西工作多年
  • 让党的理论“飞入寻常百姓家”,他如何做到有新意?
  • “彩虹滑道”项目两男童相撞飞跌出去,景区:工作人员误判导致
  • 马克思主义理论研究教学名师系列访谈|高福进:思想政治理论课要伴随时代不断更新和变化
  • 美商界报告:全美超86万岗位依赖对华出口,关税将重创美国出口商
  • 武汉楼市新政:二孩、三孩家庭购买新房可分别享受6万元、12万元购房补贴