关于 distributing-tauri-for-macos
介绍 Tauri v2 应用在 macOS 上分发的参考技能,帮助开发者配置应用包、DMG 安装器、元数据、权限及随包文件。
主要功能
- 01应用包与 DMG 构建命令
- 02DMG 外观配置
- 03Info.plist 自定义与本地化
- 04权限和最低系统版本设置
- 05框架与文件打包
适用场景
- 01准备 macOS Tauri 应用包
- 02配置拖放式 DMG 安装器
- 03添加本地化的权限用途说明
- 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 上分发时,主要涉及两种格式:
- 应用包(.app) - 包含所有应用组件的可执行目录
- 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 配置选项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
background | string | - | 相对于 src-tauri 的背景图片路径 |
windowSize.width | number | 660 | DMG 窗口宽度,单位为像素 |
windowSize.height | number | 400 | DMG 窗口高度,单位为像素 |
windowPosition.x | number | - | 窗口在屏幕上的初始 X 坐标 |
windowPosition.y | number | - | 窗口在屏幕上的初始 Y 坐标 |
appPosition.x | number | 180 | 应用图标在窗口中的 X 坐标 |
appPosition.y | number | 220 | 应用图标在窗口中的 Y 坐标 |
applicationFolderPosition.x | number | 480 | Applications 文件夹的 X 坐标 |
applicationFolderPosition.y | number | 480 | Applications 文件夹的 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 | 照片图库访问说明 |
NSAppleEventsUsageDescription | AppleScript/自动化访问 |
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.usb | USB 设备访问权限 |
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.plist | src-tauri/Info.plist | 应用元数据扩展 |
Entitlements.plist | src-tauri/Entitlements.plist | 功能权限 |
DMG Background | 项目中的任意路径 | DMG 窗口背景 |
Localized strings | src-tauri/infoplist/<lang>.lproj/ | 本地化的 Info.plist 值 |
构建输出位置
src-tauri/target/release/bundle/
macos/
<ProductName>.app # Application bundle
dmg/
<ProductName>_<version>_<arch>.dmg # DMG installer
评论
支持 Markdown