5.2 macOS 应用目录与构建

原文链接: macOS Application Bundle

5.2 macOS 应用目录与构建

macOS 应用不是一个“单个 exe”,而是一个被称为 Application Bundle(.app) 的目录结构。Finder 看到的是普通应用图标,实际上它是一个组织良好的文件夹。

构建命令

在你的 Mac 上执行:

1
npm run tauri build

只想生成 .app(不生成 DMG):

1
npm run tauri build -- --bundles app

输出目录

构建完成后,最常见的位置是:

1
2
3
4
5
src-tauri/target/release/bundle/
├── macos/
│   └── <产品名>.app
└── dmg/
    └── <产品名>_<版本>_aarch64.dmg   # 如果你启用了 DMG target

在 Apple Silicon 上,Rust 默认构建 aarch64-apple-darwin。想让同一个 .app 同时兼容 Apple Silicon 与 Intel Mac,可构建 universal binary:

1
npm run tauri build -- --bundles app --target universal-apple-darwin

这种构建的输出目录通常是:

1
src-tauri/target/universal-apple-darwin/release/bundle/macos/<产品名>.app

如果确定只支持 Apple Silicon,则不传 --target,继续使用 target/release/ 即可;此时通常建议把上文提到的“最低系统版本”提高到 12.0。

.app 内部布局

一个典型 .app 的目录:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<产品名>.app
└── Contents
    ├── Info.plist            # macOS 读取的应用元数据
    ├── MacOS/
    │   └── <可执行文件名>    # Rust 编译出的原生程序
    ├── Resources/
    │   ├── icon.icns         # 应用图标
    │   └── ...               # 你在 bundle.resources 配置的资源
    ├── Frameworks/           # 需要内嵌的 framework
    ├── PlugIns/
    └── _CodeSignature/       # 代码签名信息

对用户来说,拖到“应用程序”文件夹的是整个 <产品名>.app。

为什么这个布局重要?

在开发 Tauri 时,你通常不用手写这个结构,但理解它有实际价值:

  • 图标、系统文件、扩展内容放错目录会导致签名或启动失败;
  • 需要给 macOS 权限说明(摄像头、麦克风)时要改 Info.plist;
  • 上架 Mac App Store 时要提供 entitlements。

自定义 Info.plist

在 src-tauri/Info.plist 中补充键值对,Tauri 会与自动生成的值合并:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?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>NSCameraUsageDescription</key>
  <string>需要使用摄像头进行视频通话</string>
  <key>NSMicrophoneUsageDescription</key>
  <string>需要使用麦克风进行语音通话</string>
</dict>
</plist>

应用沙盒与 Entitlements

如果上架 Mac App Store,通常要开启 App Sandbox,需要 Entitlements 文件并在 tauri.conf.json 指定:

1
2
3
4
5
6
7
{
  "bundle": {
    "macOS": {
      "entitlements": "./Entitlements.plist"
    }
  }
}

设置最低系统版本

默认 Tauri v2 支持 macOS 10.13 以上。若需要更高版本:

1
2
3
4
5
6
7
{
  "bundle": {
    "macOS": {
      "minimumSystemVersion": "12.0"
    }
  }
}

在开发中查看 .app 内部

在 Finder 中对 .app 右键,选择“显示包内容”(Show Package Contents),即可看到上面的目录。用命令也可以:

1
open src-tauri/target/release/bundle/macos/你的应用.app/Contents

常见问题

  1. 双击打不开:通常是没有签名或刚从其他 Mac 拷贝。可执行 xattr -dr com.apple.quarantine 你的应用.app 临时处理,正式分发请做签名。
  2. 版本冲突:tauri.conf.json 的 version 会同步到 Info.plist,不要在 Info.plist 里再覆盖一套。
  3. PATH 问题:macOS GUI 应用不继承 shell 的 PATH。如果需要从 Rust 调用 ffmpeg 等命令,参考 Tauri 的 fix-path-env-rs 工具或传绝对路径。

相关页面