【一起学Rust | 框架篇 | Tauri2.0框架】高级概念之安全特性的权限与能力

news2024/12/25 2:42:39

文章目录

  • 前言
  • 一、开发前准备
    • 1. 准备项目
    • 2. 需求分析
      • 1. 监听系统热键
      • 2. 切换窗口无边框
      • 3. 切换窗口全屏
  • 二、安装插件
  • 三、前端实现功能
  • 四、配置权限


前言

当前时间为 2024 年 9 月,距离Tauri 2.0 的 RC 版本发布迄今已近一个月。从 Tauri 官方渠道可以看出,其团队在编写和翻译官方文档方面付出了极大的努力,尤其是在对中文的支持方面表现得尤为突出。

具体表现就是开发文档界面选项基本上都是中文,而且插件栏目基本上都翻译完了。即便如此,仍有诸多内容尚未完成翻译。在母语为中文的开发者群体中,应存在不少英语水平较高之人。然而,当中文仅翻译了一半时,在查阅文档的过程中确实会让人感到颇为别扭。
在这里插入图片描述

在进行 Tauri 开发的过程中,倘若开发者并非能够将所有内容都自行编写一遍的资深专业人士,那么 Tauri 的安全部分必然会被涉及。这是因为 Tauri 的插件系统配置了相应权限。Tauri 支持众多功能,然而,若不进行配置以允许使用这些功能,即便复制官方文档中的代码也无法达到相同的效果。这是由于在默认情况下,许多功能需要手动开启。例如,若期望实现代码关闭应用程序、执行 shell 命令、注册热键等操作,若不配置开启这些功能,则无法正常使用。

现在的tauri都是插件化开发的,插件中又带有很多的命令,而tauri对这些命令有着严格的限制。

权限(Permissons)是对于插件而言的,用来描述插件中命令的权限,它可以使命令在 Tauri 应用程序的前端可访问。它可以将作用域映射到命令并定义哪些命令是启用的。权限可以启用或拒绝某些命令、定义作用域或两者结合。你可以对权限进行分组(但是一定要注意命名要规范)。如果你是开发应用程序,你们你可以通过他们拓展自己的命令(当然也要配置权限)。

能力(Capabilities)是tauri或插件所提供的,是对于应用开发者而言的,功能是一组权限,通过各自的标签映射到应用程序窗口和 web 视图。功能可以影响多个窗口和 web 视图,并且可以在多个功能中被引用。通过配置能力,可以逐步启用tauri或插件的一些功能,而功能是权限的组合,二者密不可分。

这套体系在主要作用是约束前端行为,如果你是在后端写rust来调用一些API是不需要这么多弯弯绕绕的。

官方用下面这张图来描述运行时权限的执行流程。当一个窗口通过invoke来调用后端的command时需要先经过IPC处理器,这时候会检查当前窗口是否有相应的能力,有对应的命令的权限就传回后端执行命令,否则就拒绝调用,这就是为什么原封不动的代码复制过去就是无法使用的原因。

在这里插入图片描述
以上大多是官方文档的转述,纯属理解概念。但是只理解概念是不够的,学习+动手才能更好的将知识掌握,接下来我将通过实现一个按下F11切换无边框全屏的功能来演示这部分内容如何使用。


一、开发前准备

1. 准备项目

首先要准备一个能用的项目,如果你已经有了,可以直接新建个分支测试一下,或者新建个tauri2.0的项目也是可以的。比如新建项目

# 注意:一定要用这个创建,是最新版的,旧版的tauri是用不了的
pnpm create tauri-app --rc

运行以后

  • 选择您的前端语言:TypeScript / JavaScript
  • 选择您的包管理器:pnpm
  • 选择您的UI模板:Angular(你自己看,我是这么选的,可以不一样,你擅长就好)

然后安装依赖即可

cd tauri-app
pnpm install
pnpm tauri dev

2. 需求分析

首先要明确实现的功能是什么,我们本次要实现的功能是实现《按下F11切换无边框全屏功能》,分析这句话就知道,要想实现这个功能

  1. 首先要能够检测按下了什么键,才能实现后面的功能
  2. 然后是要能切换窗口的风格未无边框
  3. 最后是能够实现窗口全屏

拆分好3个功能点后,就可以寻找tauri中对应功能的实现了。tauri2.0提供了丰富的插件,可以实现各种功能,于是可以先在插件里面找,

1. 监听系统热键

监听系统热键可以实现检测按下了什么键,如果你使用rust很熟练,可以试试使用纯rust来实现,本期内容主要是权限和能力,因此只考虑插件实现。

tauri中有个插件global-shortcut(全局快捷方式),其实就是快捷键,翻译问题,如果你看官方文档就会看到这个插件是检测是否按下了某个键,然后执行某段代码。

import { register } from '@tauri-apps/plugin-global-shortcut';

await register('CommandOrControl+Shift+C', () => {
  console.log('Shortcut triggered');
});

当然也有rust版本,但是如果你用rust版本就不需要配置能力了。

2. 切换窗口无边框

要想要修改窗口风格,tauri提供了3种方式

  1. 通过 tauri.conf.json
  2. 通过 JavaScript API
  3. 通过 Rust 的 Window

1和3是本次不会使用的,1是因为如果需要一开始就确定窗口风格,那么可以在这修改;3是因为rust不需要权限,因此也不会使用。

在window的api文档下有如下描述
在这里插入图片描述
可以看到获取了window之后可以调用setDecorations()开指定是否需要边框。

3. 切换窗口全屏

这个同2,可以直接用ts的api来做。
在这里插入图片描述

二、安装插件

经过上一部分,我们已经知道需要安装一个插件global-shortcut,其余都用tauri来实现,tauri安装插件很方便,只需要执行以下命令就会自动安装好插件,并且注册配置到当前的tauri项目。

pnpm tauri add global-shortcut
pnpm install

三、前端实现功能

打开src/app/app.component.ts,然后写个构造方法,在程序一运行的时候就执行注册按键事件。

  constructor(){
    register("f11", (event) => {
      if (event.state === "Released") {
        console.log("F11 pressed")
        
      }
    })
  }

接下来定义一个bool变量,来判断当前是否是全屏,按下f11以后修改其值


  private isFullscreen = signal(false);

  constructor(){
    register("f11", (event) => {
      if (event.state === "Released") {
        console.log("F11 pressed")
        this.isFullscreen.set(!this.isFullscreen())
        
      }
    })
  }

最后在根据状态来设置窗口状态,这样就完成了

  private isFullscreen = signal(false);

  constructor(){
    register("f11", (event) => {
      if (event.state === "Released") {
        console.log("F11 pressed")
        this.isFullscreen.set(!this.isFullscreen())
        const window = getCurrentWindow()
        window.setFullscreen(this.isFullscreen())
        window.setDecorations(!this.isFullscreen())
      }
    })
  }

四、配置权限

在经过以上修改后直接运行会发现快捷键没有起作用,这时候就需要配置权限了。在安装好插件后就会发现有了src-tauri/capabilities/desktop.json文件,这个文件来定义窗口可以使用的能力。文件内容如下

{
  "$schema": "../../src-tauri/gen/schemas/desktop-schema.json",
  "identifier": "desktop-capability",
  "platforms": [
    "macOS",
    "windows",
    "linux"
  ],
  "windows": ["main"],
  "permissions": [
    "global-shortcut:default" // 启用的权限
  ]
}

其中能力标识需要复制一下,打开tauri.conf.json,在app>security下添加

"security": {
      "csp": null,
      "capabilities": ["desktop-capability"] // 添加这行,标识启用能力
 }

然后就可以在src-tauri/capabilities/desktop.json配置能力了

{
  "$schema": "../../src-tauri/gen/schemas/desktop-schema.json",
  "identifier": "desktop-capability",
  "platforms": [
    "macOS",
    "windows",
    "linux"
  ],
  "windows": ["main"],
  "permissions": [
    "global-shortcut:allow-is-registered",// 允许检查是否注册了热键
    "global-shortcut:allow-register", // 允许注册热键
    "global-shortcut:allow-unregister", // 允许反注册热键
    "core:window:allow-get-all-windows", // 允许获取所有窗口
    "core:window:allow-set-decorations", // 允许设置窗口风格
    "core:window:allow-set-fullscreen" // 允许设置窗口全屏
  ]
}

经过以上修改,程序就可以得到我们想要的结果了。

本期代码已经放到我的gitcode,如果你感兴趣可以下载来看看,对比差异学习。

git仓库地址: https://gitcode.com/weixin_47754149/tauri-example-project.git

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李飞飞:我不知道什么是AGI

图片来源:Stanford University 你对人工通用智能(AGI)感到困惑吗?这就是 OpenAI 执着于最终以“造福全人类”的方式创造的东西。你可能想认真对待他们,因为他们刚筹集了 66 亿美元以更接近这个目标。 但如果你仍然在…

揭秘Sui存储基金:灵活且可持续的链上数据管理解决方案

链上数据存储的方法常常被忽视,因为所使用的机制通常是传统和常见的。然而,在去中心化网络中,数据存储对确保数据完整性和长期可访问性至关重要。Sui的链上存储与其他区块链有所不同。 Sui存储基金是为了解决链上数据永久存储问题而设计的核…

企业架构系列(16)ArchiMate第14节:实施和迁移视角

在企业架构中,为了有效地规划和管理架构的变更与实施,通常会使用不同的视角来描述架构的不同方面。本篇涉及到三个主要视角:项目视角、迁移视角以及实施与迁移视角。 一、实施和迁移视角概览 1.项目视角 元素与关系:关注项目本身…

“网络安全等级保护测评入门:基础概念与重要性“

网络安全等级保护测评(简称“等保测评”)是依据国家网络安全等级保护制度,对信息系统安全等级进行评估和评定的过程。它是提高信息系统安全性、保障信息安全的重要手段。以下是关于等保测评的基础概念与重要性的详细解读: 一、等…

【钱拿不回来了,中介说开源吧】《刚体旋转的四元数模型及捷联惯性导航系统中定向算法》

《刚体旋转的四元数模型及捷联惯性导航系统中定向算法》 1. 摘要 本文深入探讨了四元数在刚体旋转描述中的核心作用以及其在捷联惯性导航系统(SINS)中确定方向的算法。详细阐述了四元数的理论基础、数学性质和实际应用优势,包括与卡丹角和欧…

小红书AI商单变现,单月收入10000+,真猛!

AI相关的话题在这两年来一直很火爆,很多行业也纷纷和AI结合起来, 从而达到更好的变现效果,这也是未来的发展趋势, 有这个工具确实能给我们的工作和生活带来一些便利 之前也拆解过很多类似的玩法, 比如AI古诗词、数…

软件测试之压力测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 压力测试 压力测试是一种软件测试,用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…

GSLAM——一个通用的SLAM架构和基准

GSLAM: A General SLAM Framework and Benchmark 开源地址 摘要: SLAM技术最近取得了许多成功,并吸引了高科技公司的关注。然而,如何同一现有或新兴算法的界面,一级有效地进行关于速度、稳健性和可移植性的基准测试仍然是问题。本…

芯片干货 | 同步内置MOS升压恒压5V/2A芯片FP6276B,输入限流可调

芯片概述 FP6276B是一个具有PWM/PSM控制的电流模式增压直流-直流转换器。它的PWM电路内置40mΩ高侧开关和40mΩ低侧开关使该调节器高高效。内部补偿网络还将外部组件计数最小化到只有6个。一个内部的0.6V电压被连接到误差放大器的非反相输入作为精度参考电压。内置的软启动功能…

Llama 3.2 智能代理开发教程

构建研究代理可能很复杂,但使用 LangChain 和 Ollama,它会变得更加简单和模块化。 在本教程中,我们将向你展示如何基于Llama 3.2创建一个研究代理,该代理可以路由查询、执行网络搜索并使用工作流和 LLM 的组合生成详细响应。最后…

我的书第三次重印啦,做一波活动,参与可抽现金红包~

大家好,我是拭心,好久不见。 四月份我的《Android 性能优化入门与实战》顺利出版,在朋友们帮忙宣传下,初印的两三千册很快卖完,四月份第二次重印,五个月后,又迎来了第三次重印。 这样的销量算不…

如何解决Lenovo笔记本电脑很快就自动休眠,自动锁屏,需要密码登录的问题

前段时间电脑经常会很快就锁屏了,只要离开电脑1分钟不到,就自动锁屏,然后就要输入密码登录,太烦了,后来百度和谷歌了不少帖子和方案,给的建议都是调整电源选项之类的参数。 尝试了各种修改参数&#xff0c…

栈和队列--DS

1. 栈(Stack) 1.1 栈的定义 **栈是一种特殊的线性表,其只允许在固定的一端(栈顶)进行元素插入和删除元素操作。**进行数据插入和删除操作的一段称为栈顶,另一端则称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)原则。 1.2 栈的核心操…

Android 无Bug版 多语言设计方案!

出海业务为什么要做多语言? 1.市场扩大与本地化需求: 通过支持多种语言,出海项目可以触及更广泛的国际用户群体,进而扩大其市场份额。 本地化是吸引国际用户的重要策略之一,而语言本地化是其中的核心。使用用户的母语…

E37.【C语言】动态内存管理练习题

目录 1. 答案速查 分析 源代码分析 反汇编代码分析(底层) 2. 答案速查 分析 3. 答案速查 分析 VS逐步调试 1. 求下列代码的执行结果 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str…

软件测试学习笔记丨allure学习指南

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32336 安装与下载 需要下载本地文件&#xff0c;并且添加到环境变量里 windows&#xff1a;下载&#xff0c;解压&#xff0c;并配置环境变量 mac&#xff1a;brew install allure 环境变量…

1688代采系统-反向海淘系统详细介绍

Onebound凡邦1688代采系统-反向海淘系统是一种专为海外买家及跨境电商提供一站式采购解决方案的平台。其核心功能和服务旨在解决跨境采购中的语言、货币等常见问题&#xff0c;并优化采购流程&#xff0c;提高采购效率。以下是对该系统的详细介绍。 一、核心功能 商品采集与展…

==与equals比较

在JVM中&#xff0c;内存分为堆内存跟栈内存。他们二者的区别是&#xff1a; 当我们创建一个对象&#xff08;new Object&#xff09;时&#xff0c;就会调用对象的构造函数来开辟空间&#xff0c;将对象数据存储到堆内存中&#xff0c;与此同时在栈内存中生成对应的引用&#…

【AI绘画】如何选择AI绘画工具?Midjourney VS Stable Diffusion?

前言 文章目录 &#x1f4af;如何选择合适的AI绘画工具 个人需求选择比较工具特点社区和资源 &#x1f4af; Midjourney VS Stable Diffusion&#xff1a;深度对比与剖析 使用费用对比使用便捷性与系统兼容性对比开源与闭源对比图片质量对比上手难易对比学习资源对比作品版权…

猎头是这样看简历的?

猎头在看简历时&#xff0c;会遵循一系列高效而系统的步骤&#xff0c;以确保筛选出最适合客户需求的候选人。以下是对猎头如何看简历的详细分析&#xff0c;内容虽无法精确控制在3000字以内&#xff0c;但将尽量精简并涵盖关键信息&#xff1a; 一、初步浏览与筛选 1.基本信…