【一起学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,都可以通过不同的机制轻松实现这一功能。记得在开发过程中注意权限管理和用户提示,确保应用符合平台规范和用户期望。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31965.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows10下docker desktop命令行操作指南(大部分也适用于Linux)

Windows系统最大的特点就是可视化操作&#xff0c;点点鼠标就能操作软件。但是在特殊的情况下&#xff0c;比如docker desktop图标点了之后没反应&#xff0c;但是看后台程序&#xff0c;它又已经运行了&#xff0c;这时候就要使用命令行来操作了。 针对这次情况&#xff0c;所…

静态时序分析:无法满足的生成时钟(TIM-255警告、UITE-461或PTE-075错误)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在阅读本文前&#xff0c;强烈建议首先阅读介绍生成时钟的文章&#xff0c;尤其是其中关于时钟极性和反相的相关内容。 静态时序分析&#xff1a;SDC约束命令cr…

计算机网络--访问一个网页的全过程

文章目录 访问一个网页的全过程应用层在浏览器输入URL网址http://www.aspxfans.com:8080/news/index.aspboardID5&ID24618&page1#r_70732423通过DNS获取IP地址生成HTTP请求报文应用层最后 传输层传输层处理应用层报文建立TCP连接传输层最后 网络层网络层对TCP报文进行处…

从零开发Chrome广告拦截插件:开发、打包到发布全攻略

从零开发Chrome广告拦截插件&#xff1a;开发、打包到发布全攻略 想打造一个属于自己的Chrome插件&#xff0c;既能拦截烦人的广告&#xff0c;又能优雅地发布到Chrome Web Store&#xff1f;别担心&#xff0c;这篇教程将带你从零开始&#xff0c;动手开发一个功能强大且美观…

AI智能眼镜主控芯片:技术演进与产业生态的深度解析

一、AI智能眼镜的技术挑战与主控芯片核心诉求 AI智能眼镜作为XR&#xff08;扩展现实&#xff09;技术的代表产品&#xff0c;其核心矛盾在于性能、功耗与体积的三角平衡。主控芯片作为设备的“大脑”&#xff0c;需在有限空间内实现复杂计算、多模态交互与全天候续航&#xf…

elasticsearch 8.17.3部署文档

elasticsearch 8.17.3部署文档 一、架构拓扑 ip主机名角色192.168.241.151slave1master192.168.241.152slave2node1192.168.241.153slave3node2 二、安装包下载——分别下载上传至所有的节点 下载地址https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-…

PySide(PyQT),QGraphicsItem的pos()和scenePos()区别

在QGraphicsItem中&#xff0c;pos()和scenePos()是两个重要的方法&#xff0c;用于描述图形项的位置&#xff0c;但它们的含义和用途有所不同。理解它们的区别对于正确操作和管理QGraphicsItem的位置至关重要。 1. pos()方法 • 定义&#xff1a;pos()返回的是QGraphicsItem在…

Linux 进程控制:创建、终止、等待与程序替换全解析

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 1.进程创建 1-1 fork函数初识​ 1-2 fork函数返回值​ 1-3…

GStreamer —— 2.18、Windows下Qt加载GStreamer库后运行 - “播放教程 6:音频可视化“(附:完整源码)

运行效果 介绍 GStreamer 带有一组将音频转换为视频的元素。他们 可用于科学可视化或为您的音乐增添趣味 player 的本教程展示了&#xff1a; • 如何启用音频可视化 • 如何选择可视化元素 启用音频可视化实际上非常简单。设置相应的标志&#xff0c;当纯音频流为 found&#…

Excel多级联动下拉菜单设置

1.问题描述 现有数据表如下图所示&#xff1a; 该表中包括省、市、县三级目录。 现要将其整理成数据表模板&#xff0c;如下图所示&#xff1a; 要求制作成下拉菜单的形式&#xff0c;且每一级目录的下拉菜单列表要根据上一级目录的内容来确定。 如上图所示&#xff0c;只有…

Web基础:HTML快速入门

HTML基础语法 HTML&#xff08;超文本标记语言&#xff09; 是用于创建网页内容的 标记语言&#xff0c;通过定义页面的 结构和内容 来告诉浏览器如何呈现网页。 超文本&#xff08;Hypertext&#xff09; 是一种通过 链接&#xff08;Hyperlinks&#xff09; 将不同文本、图像…

VSTO(C#)Excel开发2:Excel对象模型和基本操作

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

PostgreSQL学习笔记:PostgreSQL vs MySQL

PostgreSQL 和 MySQL 都是广泛使用的关系型数据库管理系统&#xff0c;它们有以下一些对比&#xff1a; 一、功能特性 1. 数据类型支持 PostgreSQL&#xff1a;支持丰富的数据类型&#xff0c;包括数组、JSON、JSONB、范围类型、几何类型等。对于复杂数据结构的存储和处理非…

Matlab:矩阵运算篇——矩阵

目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…

从0到1入门Docker

一、快速入门 Docker run命令中的常见参数 -d&#xff1a;让容器后台运行--name&#xff1a;给容器命名&#xff08;唯一&#xff09;-e&#xff1a;环境变量-p&#xff1a;宿主机端口映射到容器内端口镜像名称结构&#xff1a;Repository &#xff1a;TAG&#xff08;镜像名&…

Python的浮点数

在 Python 中&#xff0c;有四种内置数值类型&#xff0c;分别是整型整数类型&#xff08;int&#xff09;、布尔类型&#xff08;bool&#xff09;、浮点数类型&#xff08;float&#xff09;和复数类型&#xff08;complex&#xff09;。浮点数默认是双精度类型&#xff0c;占…

从零开始 | C语言基础刷题DAY1

❤个人主页&#xff1a;折枝寄北的博客 DAY1[2025.3.11] 1. 求两个数的较大值2.从键盘输入的两个数的大小关系3.一个整数的奇偶性&#xff0c;请判断4. 考试分数是否通过5.考试成绩是否完美&#xff0c;请判断 1. 求两个数的较大值 题目&#xff1a; 写一个函数求两个整数的较…

[pytest] 配置

这里写目录标题 PytestInitRun3. 根据命令行选项将不同的值传递给测试函数 Report1. 向测试报告标题添加信息2. 分析测试持续时间 pytest --durations33. 增量测试 - 测试步骤--junitxml{report}.xml1. testsuite1.1 在测试套件级别添加属性节点 record_testsuite_property 2. …

物联网商业模式

物联网商业模式是一种战略规划&#xff0c;它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于&#xff0c;它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中&#xff0c;这种商业模式通过利用实时数据来提供创新服务…

springboot432-基于SpringBoot的酒店管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…