結論(先に)
Tauri v2 で Menu::new() から独自メニューを組むと、macOS標準の「Appメニュー」(アプリ名のメニュー、Quit が入っている所)が消えます。これに気づかず App Store に出すと、
Guideline 4 - Design: required Quit option missing in App Menu
でリジェクトされます。直し方は、macOS のときだけ Appメニューを PredefinedMenuItem で自作してメニューバーの先頭に足すだけです。
環境
- Tauri 2.0(
tauri/tauri-buildともに 2.0) - 対象: macOS(Mac App Store 配信)
- 個人開発の diff ツール「Diff Pro Max」での実話
何が起きたか
Tauri v2 製の macOS アプリを App Store に提出したら、リジェクトされました。
Guideline 4 - Design: required Quit option missing in App Menu
(Submission ID: 37eb8573)
「Appメニューに Quit が無い」。⌘Q では普通に終了できていたので、最初は意味が分かりませんでした。
原因:カスタムメニューを組むと、標準の Appメニューが消える
Tauri v2 で独自メニューを作るとき、こう書いていました。
let menu = Menu::new(handle)?;
let file_menu = SubmenuBuilder::new(handle, "File") /* ... */ .build()?;
let edit_menu = SubmenuBuilder::new(handle, "Edit") /* ... */ .build()?;
menu.append(&file_menu)?;
menu.append(&edit_menu)?;
// View, Help ...
File / Edit / View だけを足していました。動くし、見た目も問題ありません。
でも macOS には掟があります。メニューバーの一番左には、アプリ名のついた「Appメニュー」が必要で、その中に About / Services / Hide / Quit が入っていなければいけません。Finder でも Safari でも、左端に太字でアプリ名のメニューがありますよね。あれです。
Menu::new() で自分でメニューを組んだ瞬間、「標準項目は付けない、全部自分で組め」モードになります。だから File から始まるメニューバーになり、Appメニュー(= Quit の置き場所)がまるごと欠落していました。⌘Q のショートカットが効いていても、メニュー項目として存在しないので Apple は Guideline 4 でリジェクトします。
直し方:macOS限定で Appメニューを先頭に足す
src-tauri/src/menu/mod.rs に、macOS のときだけ Appメニューを追加します。
// App menu (macOS requires the first submenu to be the app menu containing Quit, About, etc.)
#[cfg(target_os = "macos")]
let app_menu = SubmenuBuilder::new(handle, "Diff Pro Max")
.item(&PredefinedMenuItem::about(handle, None, None)?)
.separator()
.item(&PredefinedMenuItem::services(handle, None)?)
.separator()
.item(&PredefinedMenuItem::hide(handle, None)?)
.item(&PredefinedMenuItem::hide_others(handle, None)?)
.item(&PredefinedMenuItem::show_all(handle, None)?)
.separator()
.item(&PredefinedMenuItem::quit(handle, None)?)
.build()?;
// メニューバーの「一番先頭」に追加する
#[cfg(target_os = "macos")]
menu.append(&app_menu)?;
menu.append(&file_menu)?;
menu.append(&edit_menu)?;
// ...
ポイントは3つです。
-
PredefinedMenuItemを使う。quit/about/hideなどは Tauri が用意した定義済み項目で、ローカライズも ⌘Q などのショートカットも自動で付きます。自前でMenuItemを作ってイベントを書く必要はありません。 -
先頭に
appendする。macOS は「メニューバーの最初のサブメニュー=Appメニュー」と解釈します。File より前に入れること。 -
#[cfg(target_os = "macos")]で囲う。Windows / Linux にはこの概念が無いので、macOS のときだけ追加します。
おまけの罠:リジェクトされたバージョン番号は再利用できない
1.7.0 が reject 済みだったので、同じ 1.7.0 では再提出できませんでした。package.json / Cargo.toml / tauri.conf.json の3か所を 1.7.0 → 1.7.1 に上げて出し直しています。バージョンが3か所に分散しているのも地味なハマりどころです。
まとめ
- Tauri v2 でカスタムメニューを組むと、macOS標準の Appメニュー(Quit)が消える
-
#[cfg(target_os = "macos")]で AppメニューをPredefinedMenuItemで自作し、先頭に append - 提出前にメニューバー左端に「アプリ名メニュー → Quit」があるか確認すれば、審査を1往復節約できます
個人開発の diff ツール「Diff Pro Max」(Tauri v2 + Vue)での実話でした。同じく Tauri v2 で macOS アプリを出す方の参考になれば。個人開発の話は X(@rkpg10) でも書いています。