# 機能設計書 59-ヘルプ表示

## 概要

本ドキュメントは、Wikipedia iOSアプリにおけるヘルプ表示機能の設計を記述する。この機能は、FAQ（よくある質問）の表示、バグ報告メール送信、ユーザーデータエクスポートの機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：ユーザーがアプリの使い方について疑問を持った際に自己解決できるようFAQを提供し、問題が解決しない場合はサポートチームへ直接連絡できる手段を提供する。また、技術サポート目的でユーザーデータのエクスポート機能も提供する。

**機能の利用シーン**：
- アプリの使い方がわからない場合のFAQ閲覧
- バグ発見時のサポートチームへのメール送信
- 技術サポート依頼時のユーザーデータエクスポート

**主要な処理内容**：
1. MediaWiki FAQページの表示（WebView）
2. メールクライアントの起動とバグ報告メール作成
3. ユーザーデータのZIPアーカイブ作成とエクスポート
4. サーバー上のリーディングリストとの同期情報保存

**関連システム・外部連携**：
- MediaWiki FAQ（Webページ）
- iOSメールクライアント
- UIActivityViewController（共有）

**権限による制御**：特別な権限は不要。メール送信にはメールクライアントの設定が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 26 | SettingsTableViewController | 起点画面 | 設定からヘルプ画面へ遷移 |

## 機能種別

ヘルプ表示 / メール送信 / データエクスポート

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| dataStore | MWKDataStore | Yes | データストア | nil不可 |
| theme | Theme | Yes | 現在のテーマ | nil不可 |

### 入力データソース

ユーザーのタップ操作

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| faqWebPage | WKWebView | FAQ表示 |
| emailDraft | URL | メールリンク |
| zipArchive | URL | エクスポートZIPファイル |

### 出力先

WebView、メールクライアント、共有シート

## 処理フロー

### 処理シーケンス

```
1. ヘルプ画面表示
   └─ HelpViewController初期化
2. FAQ Webページ読み込み
   └─ SinglePageWebViewController.loadURL()
3. ツールバー表示
   └─ Report a Bug / Export User Data ボタン
4a. Report a Bug タップ
   └─ sendEmail() - メールクライアント起動
4b. Export User Data タップ
   └─ exportUserData() - データエクスポート開始
5. データエクスポート確認
   └─ 確認アラート表示
6. エクスポート処理
   └─ kickoffExportUserDataProcess()
7. ZIP作成と共有
   └─ UIActivityViewController表示
```

### フローチャート

```mermaid
flowchart TD
    A[ヘルプ画面表示] --> B[FAQ Webページ読込]
    B --> C[ツールバー表示]
    C --> D{ユーザー操作}
    D -->|Report a Bug| E{メールクライアントあり?}
    E -->|Yes| F[メール作成画面]
    E -->|No| G[エラー表示]
    D -->|Export User Data| H[確認アラート]
    H --> I{共有を選択?}
    I -->|Yes| J[スペース確認]
    I -->|No| K[キャンセル]
    J --> L{十分なスペース?}
    L -->|Yes| M[同期情報保存]
    L -->|No| N[スペースエラー]
    M --> O[コンテナコピー]
    O --> P[ログファイル追加]
    P --> Q[不要ファイル削除]
    Q --> R[ZIP作成]
    R --> S[共有シート表示]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-59-01 | FAQ URL | MediaWiki iOS FAQページを使用 | FAQ表示時 |
| BR-59-02 | メールアドレス | ios-support@wikimedia.org に送信 | バグ報告時 |
| BR-59-03 | メール件名 | "Bug:" をプレフィックス | バグ報告時 |
| BR-59-04 | バージョン情報 | メール本文にアプリバージョンを含む | バグ報告時 |
| BR-59-05 | プライバシー除外 | イベントログ、通知、ウィジェットキャッシュを除外 | エクスポート時 |

### 計算ロジック

- スペース確認: containerSize + logSize < systemFreeSpace

## データベース操作仕様

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| エクスポート | 全テーブル | READ | コンテナ全体をコピー |
| 同期情報保存 | SharedContainerCache | WRITE | リーディングリスト同期情報 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| noEmailClient | メール未設定 | メールクライアントなし | エラーメッセージ表示 |
| unableToDetectSystemFreeSpace | スペース確認失敗 | システム情報取得失敗 | 汎用エラー表示 |
| unableToDetectLogSize | ログサイズ確認失敗 | ログファイル情報取得失敗 | 汎用エラー表示 |
| insufficientSpace | スペース不足 | 空き容量不足 | スペースエラー表示 |

### リトライ仕様

なし（エラー時は手動での再試行）

## トランザクション仕様

ファイル操作はFileManager経由で実行、エラー時は部分データを削除

## パフォーマンス要件

- エクスポート処理はバックグラウンドキュー（userInitiated）で実行
- スピナー表示でフィードバック

## セキュリティ考慮事項

- エクスポートデータには個人情報が含まれる旨を確認アラートで警告
- 信頼できる受信者のみに共有するよう案内
- 通知関連データは除外

## 備考

HelpViewControllerはSinglePageWebViewControllerを継承し、WebViewでFAQを表示しつつ、ツールバーで追加機能を提供する。

---

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

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

### 推奨読解順序

#### Step 1: クラス構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | HelpViewController.swift | `Wikipedia/Code/HelpViewController.swift` | メインクラス |

**読解のコツ**: SinglePageWebViewControllerを継承し、ツールバーを追加

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | HelpViewController.swift | `Wikipedia/Code/HelpViewController.swift` | 初期化とツールバー設定 |

**主要処理フロー**:
1. **25-32行目**: init() - FAQ URL設定
2. **60-64行目**: viewDidLoad() - ツールバー設定
3. **124-136行目**: sendEmail() - メール送信
4. **113-122行目**: exportUserData() - エクスポート確認

#### Step 3: データエクスポート処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | HelpViewController extension | `Wikipedia/Code/HelpViewController.swift` | プライベート拡張 |

**主要処理フロー**:
- **325-382行目**: kickoffExportUserDataProcess() - エクスポート開始
- **184-224行目**: saveSyncedReadingListResultsToAppContainer() - 同期情報保存
- **226-237行目**: copyLogFile() - ログファイルコピー
- **239-256行目**: removeUnnecessaryFilesAndSubdirectories() - 不要ファイル削除
- **258-318行目**: zipUpAndShare() - ZIP作成と共有

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

```
SettingsTableViewController
    │
    └─ HelpViewController
           ├─ viewDidLoad()
           │      ├─ setupToolbar()
           │      └─ sendEmailToolbarItem / exportUserDataToolbarItem
           │
           ├─ sendEmail()
           │      └─ UIApplication.shared.open(mailtoURL)
           │
           └─ exportUserData()
                  └─ kickoffExportUserDataProcess()
                         ├─ saveSyncedReadingListResultsToAppContainer()
                         │      └─ apiController.getAllReadingLists()
                         │
                         ├─ userHasEnoughSpace()
                         ├─ FileManager.copyItem()
                         ├─ copyLogFile()
                         ├─ removeUnnecessaryFilesAndSubdirectories()
                         └─ zipUpAndShare()
                                └─ UIActivityViewController
```

### データフロー図

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

ヘルプ画面 ───▶ HelpViewController ───▶ WebView (FAQ)
表示リクエスト      │
                   │
Report a Bug ───▶ sendEmail() ───▶ mailto: URL
タップ                              メールクライアント起動
                   │
Export Data ───▶ kickoffExportUserDataProcess()
タップ                  │
                       ├─▶ 同期情報取得
                       ├─▶ コンテナコピー
                       ├─▶ ログ追加
                       ├─▶ 不要削除
                       └─▶ ZIP作成 ───▶ UIActivityViewController
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| HelpViewController.swift | `Wikipedia/Code/` | ソース | ヘルプ画面 |
| SinglePageWebViewController.swift | `Wikipedia/Code/` | ソース | WebView基底 |
| DDLog+WMFExtensions.swift | `WMF Framework/` | ソース | ログファイル取得 |
| SharedContainerCache.swift | `WMF Framework/` | ソース | 共有コンテナ |
| UserDataExportSyncInfo.swift | `WMF Framework/` | ソース | 同期情報モデル |
