distributing-tauri-for-macos について
Tauri v2 アプリを macOS 向けに配布するためのスキルです。アプリバンドルや DMG インストーラー、メタデータ、権限、同梱するフレームワークやファイルの設定を開発者向けに解説します。
主な機能
- 01アプリバンドルと DMG のビルドコマンド
- 02DMG の外観設定
- 03Info.plist のカスタマイズとローカライズ
- 04権限と最小 OS バージョンの設定
- 05フレームワークとファイルの同梱
活用シーン
- 01macOS 向け 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 の配布
このスキルでは、DMG インストーラーやアプリケーションバンドルの設定など、macOS で Tauri v2 アプリケーションを配布する方法を説明します。
概要
Tauri アプリを macOS で配布する際に使う主な形式は、次の 2 つです。
- アプリケーションバンドル(.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 | アプリケーションフォルダの X 座標 |
applicationFolderPosition.y | number | 480 | アプリケーションフォルダの 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.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 でのエンタイトルメントの設定
{
"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 | Bluetooth へのアクセス |
Hardened Runtime のエンタイトルメント:
| エンタイトルメント | 説明 |
|---|---|
com.apple.security.cs.allow-jit | JIT コンパイルを許可します |
com.apple.security.cs.allow-unsigned-executable-memory | 署名されていない実行可能メモリを許可します |
com.apple.security.cs.disable-library-validation | 任意のプラグインを読み込みます |
macOS バンドルの設定
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からの相対パスを指定します
カスタムファイルをバンドルに追加
バンドルの 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