You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tauri v2 macOS下如何打开Slack自定义slack://协议链接?

在Tauri v2 macOS应用中打开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命令。

步骤:

  1. 安装并引入插件:确保已安装插件,在代码中引入:

    import { open } from '@tauri-apps/plugin-shell';
    
  2. 调用open方法:

    async function openSlackLink() {
      try {
        await open('slack://user?team=EDUA2R4KG&id=WR9RY8KMF');
      } catch (err) {
        console.error('打开Slack链接失败:', err);
      }
    }
    
  3. 配置正确的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的正确接口。

步骤:

  1. 安装并引入插件:

    import { open } from '@tauri-apps/plugin-opener';
    
  2. 调用open方法:

    async function openSlackLink() {
      try {
        await open('slack://user?team=EDUA2R4KG&id=WR9RY8KMF');
      } catch (err) {
        console.error('打开Slack链接失败:', err);
      }
    }
    
  3. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:03:18