mcpField
D
distributing-tauri-for-macos

distributing-tauri-for-macos

github.com/dchuk开发36168 次安装40 周前更新
代码仓库

关于 distributing-tauri-for-macos

介绍 Tauri v2 应用在 macOS 上分发的参考技能,帮助开发者配置应用包、DMG 安装器、元数据、权限及随包文件。

主要功能

  1. 01应用包与 DMG 构建命令
  2. 02DMG 外观配置
  3. 03Info.plist 自定义与本地化
  4. 04权限和最低系统版本设置
  5. 05框架与文件打包

适用场景

  1. 01准备 macOS Tauri 应用包
  2. 02配置拖放式 DMG 安装器
  3. 03添加本地化的权限用途说明
  4. 04将框架或自定义文件打入应用包

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dchuk/claude-code-tauri-skills --skill distributing-tauri-for-macos

安装后在 Claude Code 中输入/distributing-tauri-for-macos确认已加载。

详细介绍

Tauri macOS 分发

本技能介绍如何在 macOS 上分发 Tauri v2 应用,包括 DMG 安装器和应用包配置。

概述

Tauri 应用在 macOS 上分发时,主要涉及两种格式:

  1. 应用包(.app) - 包含所有应用组件的可执行目录
  2. DMG 安装器(.dmg) - 将应用包封装成磁盘映像,方便通过拖放进行安装

为 macOS 构建

构建命令

使用 Tauri CLI 生成指定的包类型:

# Build app bundle only
npm run tauri build -- --bundles app
yarn tauri build --bundles app
pnpm tauri build --bundles app
cargo tauri build --bundles app

# Build DMG installer only
npm run tauri build -- --bundles dmg
yarn tauri build --bundles dmg
pnpm tauri build --bundles dmg
cargo tauri build --bundles dmg

# Build both
npm run tauri build -- --bundles app,dmg

应用包结构

.app 目录遵循 macOS 规范:

<productName>.app/
Contents/
    Info.plist              # App metadata and configuration
    MacOS/
        <app-name>          # Main executable
    Resources/
        icon.icns           # App icon
        [bundled resources] # Additional resources
    _CodeSignature/         # Code signature files
    Frameworks/             # Bundled frameworks
    PlugIns/                # App plugins
    SharedSupport/          # Support files

DMG 安装器配置

在 tauri.conf.json 中配置 DMG 外观:

完整的 DMG 配置示例
{
  "bundle": {
    "macOS": {
      "dmg": {
        "background": "./images/dmg-background.png",
        "windowSize": {
          "width": 660,
          "height": 400
        },
        "windowPosition": {
          "x": 400,
          "y": 400
        },
        "appPosition": {
          "x": 180,
          "y": 220
        },
        "applicationFolderPosition": {
          "x": 480,
          "y": 220
        }
      }
    }
  }
}
DMG 配置选项
选项类型默认值说明
backgroundstring-相对于 src-tauri 的背景图片路径
windowSize.widthnumber660DMG 窗口宽度,单位为像素
windowSize.heightnumber400DMG 窗口高度,单位为像素
windowPosition.xnumber-窗口在屏幕上的初始 X 坐标
windowPosition.ynumber-窗口在屏幕上的初始 Y 坐标
appPosition.xnumber180应用图标在窗口中的 X 坐标
appPosition.ynumber220应用图标在窗口中的 Y 坐标
applicationFolderPosition.xnumber480Applications 文件夹的 X 坐标
applicationFolderPosition.ynumber480Applications 文件夹的 Y 坐标

注意: 在 CI/CD 平台上构建时,由于无头环境中的一个已知问题,图标大小和位置可能无法正确应用。

自定义 Info.plist

创建自定义 Info.plist

创建 src-tauri/Info.plist 以扩展默认配置。Tauri CLI 会自动将其与生成的值合并。

<?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>This app requires camera access for video calls</string>

    <key>NSMicrophoneUsageDescription</key>
    <string>This app requires microphone access for audio recording</string>

    <key>NSLocationUsageDescription</key>
    <string>This app requires location access for mapping features</string>

    <key>NSPhotoLibraryUsageDescription</key>
    <string>This app requires photo library access to import images</string>

    
    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeName</key>
            <string>My Document</string>
            <key>CFBundleTypeExtensions</key>
            <array>
                <string>mydoc</string>
            </array>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
        </dict>
    </array>

    
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.example.myapp</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>myapp</string>
            </array>
        </dict>
    </array>
</dict>
</plist>
常见的 Info.plist 键
键说明
NSCameraUsageDescription摄像头访问说明
NSMicrophoneUsageDescription麦克风访问说明
NSLocationUsageDescription位置访问说明
NSPhotoLibraryUsageDescription照片图库访问说明
NSAppleEventsUsageDescriptionAppleScript/自动化访问
CFBundleDocumentTypes支持的文档类型
CFBundleURLTypes自定义 URL 方案
LSMinimumSystemVersion最低 macOS 版本(建议在 tauri.conf.json 中配置)
Info.plist 本地化

使用本地化字符串支持多种语言:

目录结构:

src-tauri/
    infoplist/
        en.lproj/
            InfoPlist.strings
        de.lproj/
            InfoPlist.strings
        fr.lproj/
            InfoPlist.strings
        es.lproj/
            InfoPlist.strings

InfoPlist.strings 示例(德语):

"NSCameraUsageDescription" = "Diese App benötigt Kamerazugriff für Videoanrufe";
"NSMicrophoneUsageDescription" = "Diese App benötigt Mikrofonzugriff für Audioaufnahmen";

在 tauri.conf.json 中配置:

{
  "bundle": {
    "resources": {
      "infoplist/**": "./"
    }
  }
}

Entitlements 配置

Entitlements 可在应用进行代码签名时授予特殊功能。

创建 Entitlements.plist

创建 src-tauri/Entitlements.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>com.apple.security.app-sandbox</key>
    <true/>

    
    <key>com.apple.security.network.client</key>
    <true/>
    <key>com.apple.security.network.server</key>
    <true/>

    
    <key>com.apple.security.files.user-selected.read-write</key>
    <true/>
    <key>com.apple.security.files.downloads.read-write</key>
    <true/>

    
    <key>com.apple.security.device.camera</key>
    <true/>
    <key>com.apple.security.device.microphone</key>
    <true/>

    
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
</dict>
</plist>
在 tauri.conf.json 中配置 Entitlements
{
  "bundle": {
    "macOS": {
      "entitlements": "./Entitlements.plist"
    }
  }
}
常见权限参考

沙盒权限:

权限描述
com.apple.security.app-sandbox启用应用沙盒(App Store 要求)
com.apple.security.network.client出站网络连接
com.apple.security.network.server入站网络连接
com.apple.security.files.user-selected.read-write访问用户选择的文件
com.apple.security.files.downloads.read-write访问“下载”文件夹

硬件权限:

权限描述
com.apple.security.device.camera摄像头访问权限
com.apple.security.device.microphone麦克风访问权限
com.apple.security.device.usbUSB 设备访问权限
com.apple.security.device.bluetooth蓝牙访问权限

强化运行时权限:

权限描述
com.apple.security.cs.allow-jit允许 JIT 编译
com.apple.security.cs.allow-unsigned-executable-memory允许未签名的可执行内存
com.apple.security.cs.disable-library-validation加载任意插件

macOS Bundle 配置

完整的 macOS 配置示例
{
  "bundle": {
    "icon": ["icons/icon.icns"],
    "macOS": {
      "minimumSystemVersion": "10.13",
      "entitlements": "./Entitlements.plist",
      "frameworks": [
        "CoreAudio",
        "./libs/libcustom.dylib",
        "./frameworks/CustomFramework.framework"
      ],
      "files": {
        "embedded.provisionprofile": "./profiles/distribution.provisionprofile",
        "SharedSupport/README.md": "./docs/README.md"
      },
      "dmg": {
        "background": "./images/dmg-background.png",
        "windowSize": {
          "width": 660,
          "height": 400
        },
        "appPosition": {
          "x": 180,
          "y": 220
        },
        "applicationFolderPosition": {
          "x": 480,
          "y": 220
        }
      }
    }
  }
}
最低系统版本

设置支持的最低 macOS 版本:

{
  "bundle": {
    "macOS": {
      "minimumSystemVersion": "12.0"
    }
  }
}

默认值:macOS 10.13(High Sierra)

包含框架和库

将系统框架或自定义 dylib 文件打包:

{
  "bundle": {
    "macOS": {
      "frameworks": [
        "CoreAudio",
        "AVFoundation",
        "./libs/libmsodbcsql.18.dylib",
        "./frameworks/Sparkle.framework"
      ]
    }
  }
}
  • 系统框架: 仅指定名称(例如,"CoreAudio")
  • 自定义框架/dylib: 提供相对于 src-tauri 的路径
向 Bundle 添加自定义文件

将其他文件包含在 Bundle 的 Contents 目录中:

{
  "bundle": {
    "macOS": {
      "files": {
        "embedded.provisionprofile": "./profile.provisionprofile",
        "SharedSupport/docs/guide.pdf": "./assets/guide.pdf",
        "Resources/config.json": "./config/default.json"
      }
    }
  }
}

格式:"destination": "source",路径相对于 tauri.conf.json

故障排除

常见问题

CI/CD 上的 DMG 图标位置不正确:

  • 这是无头环境中的已知问题
  • 可考虑在本地构建 DMG,或接受默认位置

应用因缺少用途说明而被拒绝:

  • 将所有必需的 NS*UsageDescription 键添加到 Info.plist
  • 确保说明清楚解释需要访问权限的原因

权限未生效:

  • 检查 tauri.conf.json 中的权限文件路径
  • 确保应用已正确进行代码签名

运行时找不到框架:

  • 检查框架路径是否相对于 src-tauri 正确
  • 确认框架已正确签名
验证命令
# Check Info.plist contents
plutil -p path/to/App.app/Contents/Info.plist

# Verify entitlements
codesign -d --entitlements - path/to/App.app

# Check code signature
codesign -vvv --deep --strict path/to/App.app

# View bundle structure
find path/to/App.app -type f | head -50

快速参考

文件位置
文件位置用途
Info.plistsrc-tauri/Info.plist应用元数据扩展
Entitlements.plistsrc-tauri/Entitlements.plist功能权限
DMG Background项目中的任意路径DMG 窗口背景
Localized stringssrc-tauri/infoplist/<lang>.lproj/本地化的 Info.plist 值
构建输出位置
src-tauri/target/release/bundle/
    macos/
        <ProductName>.app         # Application bundle
    dmg/
        <ProductName>_<version>_<arch>.dmg  # DMG installer

评论

支持 Markdown