Tauri v2 macOS下如何打开Slack自定义slack://协议链接?
问题背景
我正在开发基于Svelte和Tabulator的Tauri v2应用,需要通过自定义协议链接(如slack://user?team=TEAM_ID&id=USER_ID)打开Slack深度链接,目标是在macOS上启动原生Slack应用,但尝试多种方法均未成功。
已尝试的方案
使用Opener插件的
openPath方法:
引入@tauri-apps/plugin-opener的openPath方法,执行await openPath('slack://user?team=EDUA2R4KG&id=WR9RY8KMF'),但失败,因openPath仅适用于文件路径而非URL。使用Shell插件的
Command调用系统open命令:
引入@tauri-apps/plugin-shell的Command,编写异步函数调用open命令执行链接,但即使更新了capabilities配置,仍报错Unhandled Promise Rejection: program not allowed on the configured shell scope: open。
配置文件src-tauri/capabilities/default.json:{ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", "windows": ["main"], "permissions": [ "core:default", "dialog:default", "fs:default", "shell:default", { "identifier": "shell:allow-open", "allow": [ { "name": "open", "cmd": "open", "args": ["*"] } ] } ] }
可行解决方案
方案1:使用Shell插件的open方法(推荐)
Tauri v2的@tauri-apps/plugin-shell提供了专门的open方法用于打开URL(包括自定义协议),无需手动调用系统open命令。
步骤:
安装并引入插件:确保已安装插件,在代码中引入:
import { open } from '@tauri-apps/plugin-shell';调用
open方法:async function openSlackLink() { try { await open('slack://user?team=EDUA2R4KG&id=WR9RY8KMF'); } catch (err) { console.error('打开Slack链接失败:', err); } }配置正确的capabilities权限:
修改src-tauri/capabilities/default.json,将shell:allow-open权限调整为允许Slack自定义协议:{ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", "windows": ["main"], "permissions": [ "core:default", "dialog:default", "fs:default", { "identifier": "shell:allow-open", "allow": [ { "url": "slack://**" } ] } ] }这个配置明确允许应用打开所有
slack://开头的链接,符合Tauri v2的权限模型要求。
方案2:使用Opener插件的open方法
之前误用了openPath(仅处理文件路径),Opener插件的open方法才是用于打开URL的正确接口。
步骤:
安装并引入插件:
import { open } from '@tauri-apps/plugin-opener';调用
open方法:async function openSlackLink() { try { await open('slack://user?team=EDUA2R4KG&id=WR9RY8KMF'); } catch (err) { console.error('打开Slack链接失败:', err); } }配置capabilities权限:
在default.json中添加Opener的权限:{ "permissions": [ // 其他权限... "opener:default" ] }
替代方案:使用Slack HTTPS链接
如果自定义协议仍有问题,可以改用Slack的HTTPS跳转链接,格式如https://slack.com/app_redirect?team=TEAM_ID&user=USER_ID。当用户系统中已安装Slack应用且浏览器配置了关联时,点击该链接会自动唤起原生Slack应用。这种方法无需额外的Tauri权限配置,但依赖用户的浏览器设置。
常见问题说明
- 为什么之前用
Command调用open命令会报错?
Tauri v2的shell权限模型中,shell:allow-open是用于打开URL的权限,而执行系统命令需要shell:allow-execute权限。但直接使用插件提供的open方法更符合Tauri的设计规范,也更安全。
内容的提问来源于stack exchange,提问作者Clément Liscot

