# 画面設計書 38-NotificationsCenterOnboarding画面

## 概要

本ドキュメントは、Wikipedia iOSアプリにおけるNotificationsCenterOnboarding画面の設計仕様を定義するものです。

### 本画面の処理概要

NotificationsCenterOnboarding画面は、ユーザーが初めて通知センターにアクセスした際に表示されるオンボーディング画面です。通知センターの機能を説明し、ユーザーに通知機能の利点を理解してもらうための教育的なモーダル画面です。

**業務上の目的・背景**：
通知センター機能の認知度向上と利用促進を目的としています。ユーザーに通知機能の価値を伝え、プッシュ通知のオプトインへ誘導するための重要なステップです。

**画面へのアクセス方法**：
NotificationsCenter画面に初めてアクセスした際に自動的にモーダル表示されます（`wmf_userHasOnboardedToNotificationsCenter`がfalseの場合）。

**主要な操作・処理内容**：
1. オンボーディングコンテンツの表示
2. 「Dismiss」アクションでの閉じる処理
3. UserDefaultsへのオンボーディング完了フラグ設定

**画面遷移**：
- 遷移元：NotificationsCenter画面（自動モーダル表示）
- 遷移先：プッシュ通知オプトインパネル（閉じた後）

**権限による表示制御**：
特に権限による表示制御はありません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 29 | 通知センター | 補助機能 | 通知センターオンボーディング |

## 画面種別

モーダル（オンボーディング）

## URL/ルーティング

本画面は独立したURLを持たず、NotificationsCenter画面から自動的にモーダル表示されます。

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|---------|------|
| theme | 入力 | Theme | テーマ設定 |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|---------|------|
| NotificationsCenterOnboardingView | SwiftUI View | オンボーディングコンテンツ |

## イベント仕様

### 1-Dismissアクション

オンボーディング画面の閉じるボタンをタップすると、モーダルをdismissし、delegateを通じてNotificationsCenterViewControllerに通知します。その後、プッシュ通知オプトインパネルが表示される可能性があります。

### 2-スワイプで閉じる

iOS標準のシートスワイプジェスチャーで閉じた場合も、presentationControllerDidDismiss()を通じてdelegateに通知されます。

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Dismiss | UserDefaults | UPDATE | wmf_userHasOnboardedToNotificationsCenterをtrueに設定（親VCで） |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|--------------|---------|
| - | - | オンボーディングコンテンツはSwiftUI Viewで定義 | 常時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 特になし | 本画面は表示専用のため例外処理は限定的 |

## 備考

- UIHostingControllerを継承
- SwiftUIで実装されたNotificationsCenterOnboardingViewをホスト
- Themeableプロトコルに準拠
- RMessageSuppressingプロトコルに準拠（アラート抑制）
- UIAdaptivePresentationControllerDelegateでスワイプdismiss検知

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | NotificationsCenterOnboardingHostingViewController.swift | `Wikipedia/Code/NotificationsCenterOnboardingHostingViewController.swift` | UIHostingController継承 |

**主要処理フロー**:
1. **16-23行目**: init(theme:)でSwiftUI Viewを初期化、dismissAction設定
2. **19-21行目**: rootView.dismissActionにdismiss()メソッドをバインド
3. **29-31行目**: viewWillAppearでpresentationController.delegateを設定

#### Step 2: Dismiss処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | NotificationsCenterOnboardingHostingViewController.swift | `Wikipedia/Code/NotificationsCenterOnboardingHostingViewController.swift` | dismiss()とdelegate通知 |

**主要処理フロー**:
- **36-40行目**: dismiss()で閉じて、delegate.userDidDismissNotificationsCenterOnboardingView()を呼び出し
- **44-46行目**: presentationControllerDidDismiss()でスワイプ閉じを検知

#### Step 3: 呼び出し元を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | NotificationsCenterViewController.swift | `Wikipedia/Code/NotificationsCenterViewController.swift` | オンボーディング表示ロジック |

**主要処理フロー**:
- **558-569行目**: presentOnboardingEducationModalIfNecessary()でオンボーディング表示判定
- **559行目**: wmf_userHasOnboardedToNotificationsCenterのチェック
- **564-568行目**: オンボーディングVC生成、delegate設定、present

### プログラム呼び出し階層図

```
NotificationsCenterViewController
    │
    ├─ viewDidAppear()
    │      └─ presentOnboardingEducationModalIfNecessary()
    │             │
    │             ├─ Check: wmf_userHasOnboardedToNotificationsCenter
    │             │
    │             └─ NotificationsCenterOnboardingHostingViewController
    │                    │
    │                    ├─ init(theme:)
    │                    │      └─ NotificationsCenterOnboardingView (SwiftUI)
    │                    │
    │                    ├─ dismiss()
    │                    │      └─ delegate?.userDidDismissNotificationsCenterOnboardingView()
    │                    │
    │                    └─ UIAdaptivePresentationControllerDelegate
    │                           └─ presentationControllerDidDismiss()
    │
    └─ NotificationsCenterOnboardingDelegate
           └─ userDidDismissNotificationsCenterOnboardingView()
                  └─ presentOnboardingPushOptInIfNecessary()
```

### データフロー図

```
[入力]                          [処理]                              [出力]

viewDidAppear()        ──────▶ UserDefaults Check         ──────▶ Modal表示判定
                               │
                               ▼
theme                  ──────▶ NotificationsCenterOnboardingHostingViewController
                               │
                               └─ NotificationsCenterOnboardingView (SwiftUI)
                               │
                               ▼
Dismiss action         ──────▶ delegate.userDidDismissNotificationsCenterOnboardingView()
                               │
                               └─ presentOnboardingPushOptInIfNecessary()
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| NotificationsCenterOnboardingHostingViewController.swift | `Wikipedia/Code/NotificationsCenterOnboardingHostingViewController.swift` | ソース | ホスティングVC |
| NotificationsCenterOnboardingView.swift | `Wikipedia/Code/NotificationsCenterOnboardingView.swift` | ソース | SwiftUI View |
| NotificationsCenterViewController.swift | `Wikipedia/Code/NotificationsCenterViewController.swift` | ソース | 呼び出し元VC |
| NotificationsCenterOnboardingDelegate | `Wikipedia/Code/NotificationsCenterOnboardingHostingViewController.swift` | プロトコル | デリゲート |
