通知の許可をユーザーに求める

Recipe ID: dlg-010

macOS や最近の Windows、モバイル OS では、アプリがユーザーに通知を送るためには明示的な許可が必要です。

前提条件

プラグインの追加

通知機能を利用するには notification プラグインが必要です。

npm run tauri add notification

src-tauri/src/lib.rs.plugin(tauri_plugin_notification::init()) が追加されていることを確認してください。

Permissions (権限) の設定

src-tauri/capabilities/default.jsonnotification:default 権限を追加します。

{
  "permissions": [
    ...,
    "notification:default"
  ]
}

1. フロントエンドから作成する (TypeScript)

@tauri-apps/plugin-notificationrequestPermission 関数を使用します。

許可状態の確認とリクエスト

最も一般的な実装パターンです。「許可されているか確認」→「されていなければリクエスト」→「結果に応じて処理」という流れになります。

import { isPermissionGranted, requestPermission, sendNotification } from '@tauri-apps/plugin-notification';

async function checkAndNotify() {
  // 1. 現在の許可状態を確認する
  let permission = await isPermissionGranted();

  // 2. 許可されていない場合、ユーザーに許可を求める
  if (!permission) {
    const request = await requestPermission();
    permission = request === 'granted';
  }

  // 3. 結果の確認
  if (permission) {
    console.log('通知が許可されました');
    sendNotification('これはテスト通知です');
  } else {
    console.log('通知が拒否されました');
    // 必要に応じて、設定画面への誘導などを表示する
  }
}

2. バックエンドから作成する (Rust)

Rust 側で許可状態を管理する場合の例です。

許可リクエスト

#[tauri::command]
fn request_permission(app: tauri::AppHandle) {
    use tauri_plugin_notification::NotificationExt;

    match app.notification().request_permission() {
        Ok(permission) => {
            println!("Permission granted: {:?}", permission);
        }
        Err(e) => {
            println!("Error requesting permission: {}", e);
        }
    }
}

// main.rs または lib.rs でハンドラを登録します
// .invoke_handler(tauri::generate_handler![request_permission])

補足

  • isPermissionGranted(): 現在のアプリが通知を表示する権利を持っているかどうかを boolean で返します。
  • requestPermission():
    • まだユーザーが判断を下していない場合、OS 標準の「通知を許可しますか?」というダイアログを表示します。
    • 既にユーザーが「拒否」を選択済みの場合、ダイアログは表示されずに即座に 'denied' が返されることが多いです(OSの仕様による)。この場合、アプリ側から設定画面を開くようユーザーに案内する必要があります。
  • OSごとの挙動:
    • macOS: 非常に厳格です。許可がないと通知は一切表示されません。
    • Windows: アクションセンターの設定によりますが、比較的緩やかです。ただし、今後のバージョンで挙動が変わる可能性があります。
    • Linux: デスクトップ環境(GNOME, KDEなど)に依存します。