1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tauri v2のmacOSアプリがApp Storeで「Quitが無い」とリジェクト。Appメニューを自作して通した話

1
Posted at

結論(先に)

Tauri v2 で Menu::new() から独自メニューを組むと、macOS標準の「Appメニュー」(アプリ名のメニュー、Quit が入っている所)が消えます。これに気づかず App Store に出すと、

Guideline 4 - Design: required Quit option missing in App Menu

でリジェクトされます。直し方は、macOS のときだけ Appメニューを PredefinedMenuItem で自作してメニューバーの先頭に足すだけです。

環境

  • Tauri 2.0tauri / 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) でも書いています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?