# 画面設計書 68-Help画面

## 概要

本ドキュメントは、Wikipedia iOSアプリのHelp画面の設計を記載したものです。この画面はFAQ（よくある質問）をWebViewで表示し、バグ報告やユーザーデータエクスポート機能を提供するヘルプ画面です。

### 本画面の処理概要

Help画面は、MediaWikiのFAQページをWebViewで表示し、ユーザーがアプリに関する疑問を解決できるようにするとともに、バグ報告やユーザーデータのエクスポート機能を提供する画面です。

**業務上の目的・背景**：アプリ利用中にユーザーが困った際に、自己解決できるようFAQを提供することでサポートコストを削減します。また、問題が発生した場合にバグ報告を簡単に行えるようにし、サポートチームとのコミュニケーションを円滑にします。ユーザーデータエクスポート機能は、技術的な診断に必要なデータを安全に共有するために提供されています。

**画面へのアクセス方法**：設定画面から「Help」項目をタップして遷移します。

**主要な操作・処理内容**：
1. MediaWiki iOS FAQページをWebViewで表示
2. ツールバーの「Report a bug」ボタンでメール作成画面を起動
3. ツールバーの「Export User Data」ボタンでユーザーデータをZIPファイルとして共有
4. WebView内のリンクをタップして関連ページへ遷移

**画面遷移**：
- 遷移元：設定画面
- 遷移先：メール作成画面（Report a bug）、システム共有シート（Export User Data）

**権限による表示制御**：
- ユーザーデータエクスポートの確認ダイアログ表示
- ログインユーザーの場合はリーディングリスト同期情報も含む

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 59 | ヘルプ表示 | 主機能 | アプリヘルプ・FAQの表示 |

## 画面種別

WebView / ヘルプ

## URL/ルーティング

| 名称 | URL |
|------|-----|
| FAQ | https://m.mediawiki.org/wiki/Wikimedia_Apps/iOS_FAQ |

## 入出力項目

| 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|--------|-----|----------|------|------|
| dataStore | MWKDataStore | 入力 | 必須 | データストア（リーディングリスト同期情報取得用） |
| theme | Theme | 入力 | 必須 | 適用するテーマ |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|----------|------|
| webView | 全体 | FAQページを表示するWebView |
| toolbar | 下部 | ツールバー |
| exportUserDataToolbarItem | ツールバー左 | 「Export User Data」ボタン |
| sendEmailToolbarItem | ツールバー右 | 「Report a bug」ボタン |
| spinnerToolbarItem | ツールバー左 | エクスポート処理中のスピナー |
| activityIndicator | ツールバー内 | ローディングインジケータ |

## イベント仕様

### 1-init

初期化処理。

- dataStore, themeを受け取り
- FAQのURLからSinglePageWebViewController.StandardConfigを作成
- useSimpleNavigationBar = falseで初期化

### 2-viewDidLoad

画面がロードされた際の初期化処理。

- navigationItem.rightBarButtonItemをnil設定
- setupToolbar()でツールバーを設定

### 3-setupToolbar

ツールバーの設定。

- toolbarContainerViewとtoolbarをビューに追加
- 制約を設定
- setupToolbarItems(isExportingUserData: false)でアイテムを配置
- WebViewのcontentInsetを調整してツールバー分の余白を追加

### 4-exportUserData

ユーザーデータエクスポートボタン押下時の処理。

- 確認ダイアログを表示（「Share app library?」）
- 「Share」ボタンでkickoffExportUserDataProcess()を呼び出し
- 「Cancel」ボタンで処理中止

### 5-kickoffExportUserDataProcess

ユーザーデータエクスポートの実行。

- ツールバーアイテムをスピナーに切り替え
- saveSyncedReadingListResultsToAppContainer()でリーディングリスト同期情報を保存
- ディスク空き容量をチェック
- アプリコンテナを一時ディレクトリにコピー
- ログファイルをコピー
- 不要なファイル/ディレクトリを削除（Event Logging, Library, 通知キャッシュ等）
- ZIPファイルに圧縮
- UIActivityViewControllerで共有シートを表示

### 6-sendEmail

バグ報告ボタン押下時の処理。

- メールアドレス: ios-support@wikimedia.org
- 件名: "Bug:"
- 本文: バージョン情報（WikipediaAppUtils.versionedUserAgent()）
- mailto:URLスキームでメールアプリを起動
- メールクライアントがない場合はエラーメッセージ表示

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Export User Data | - | SELECT | リーディングリスト同期情報の取得 |

### テーブル別更新項目詳細

この画面ではデータベースの更新は発生しません。エクスポート時はデータの読み取りのみです。

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| button-report-a-bug | ボタン | Report a bug | 常時 |
| export-user-data-title | ボタン | Export User Data | 常時 |
| export-user-data-confirmation-title | 確認 | Share app library? | エクスポートボタン押下時 |
| export-user-data-confirmation-message | 確認 | Sharing your app library includes... | エクスポートボタン押下時 |
| export-user-data-generic-error | エラー | There was an error while exporting your data... | エクスポート失敗時 |
| export-user-data-space-error | エラー | You do not have enough device space... | 空き容量不足時 |
| no-email-client | エラー | （メールクライアントなし） | メール送信不可時 |

## 例外処理

| 例外条件 | 対処 |
|----------|------|
| FAQのURL生成失敗 | init?でnil返却 |
| メールクライアントがない | エラーアラート表示 |
| ディスク空き容量不足 | エラーアラート表示 |
| エクスポート処理エラー | 汎用エラーアラート表示、DDLogでエラーログ |
| ファイル操作エラー | DDLogでエラーログ、処理継続（FileManagerDelegate） |

## 備考

- SinglePageWebViewControllerを継承
- FAQ URLは https://m.mediawiki.org/wiki/Wikimedia_Apps/iOS_FAQ
- バグ報告先メールアドレスは ios-support@wikimedia.org
- エクスポートファイルはapp-container.zipとして生成
- FileManagerDelegateを実装してコピーエラー時も処理を継続
- 同期済みリーディングリストはAPIから取得してJSON保存

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

ヘルプ画面の設定と関連データを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | HelpViewController.swift | `Wikipedia/Code/HelpViewController.swift` | static定数（faqURLString, emailAddress, emailSubject） |

**読解のコツ**: SinglePageWebViewControllerを継承しているため、WebViewの基本機能は親クラスを参照してください。

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

初期化とUI構築の流れを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | HelpViewController.swift | `Wikipedia/Code/HelpViewController.swift` | init, viewDidLoad, setupToolbar |

**主要処理フロー**:
1. **25-32行目**: init - FAQのURL設定、StandardConfig作成
2. **60-64行目**: viewDidLoad - ツールバー設定
3. **85-106行目**: setupToolbar - ツールバーレイアウト、contentInset調整

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

ユーザーデータエクスポートの詳細フローを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | HelpViewController.swift | `Wikipedia/Code/HelpViewController.swift` | exportUserData, kickoffExportUserDataProcess |

**主要処理フロー**:
- **113-122行目**: exportUserData - 確認ダイアログ表示
- **325-381行目**: kickoffExportUserDataProcess - 完全なエクスポートフロー
- **184-224行目**: saveSyncedReadingListResultsToAppContainer - リーディングリスト同期情報保存
- **258-318行目**: zipUpAndShare - ZIPファイル作成と共有

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

```
設定画面
    |
    +-- HelpViewController.init(dataStore:theme:)
           |
           +-- viewDidLoad()
           |      +-- setupToolbar()
           |             +-- setupToolbarItems(isExportingUserData: false)
           |
           +-- exportUserData() [ボタン押下]
           |      +-- wmf_showAlert()
           |      +-- kickoffExportUserDataProcess()
           |             +-- saveSyncedReadingListResultsToAppContainer()
           |             +-- userHasEnoughSpace()
           |             +-- copyItem(at:to:) [コンテナコピー]
           |             +-- copyLogFile()
           |             +-- removeUnnecessaryFilesAndSubdirectories()
           |             +-- zipUpAndShare()
           |                    +-- NSFileCoordinator.coordinate()
           |                    +-- UIActivityViewController
           |
           +-- sendEmail() [ボタン押下]
                  +-- UIApplication.shared.open(mailtoURL)
```

### データフロー図

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

dataStore              --> HelpViewController               --> WebView表示
theme                       |
                            +-- setupToolbar()
                            |
                            +-- exportUserData()
                            |      |
                            |      v
                            |   確認ダイアログ
                            |      |
                            |      v
                            |   kickoffExportUserDataProcess()
                            |      |
                            |      +-- saveSyncedReadingListResults
                            |      |      |
                            |      |      v
                            |      |   APIReadingListEntry取得
                            |      |
                            |      +-- コンテナコピー
                            |      +-- ログファイルコピー
                            |      +-- 不要ファイル削除
                            |      +-- ZIPファイル生成
                            |      |
                            |      v
                            |   UIActivityViewController --> 共有
                            |
                            +-- sendEmail()
                                   |
                                   v
                               mailto: URL --> メールアプリ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| HelpViewController.swift | `Wikipedia/Code/HelpViewController.swift` | ソース | ヘルプ画面のViewController |
| SinglePageWebViewController.swift | `Wikipedia/Code/SinglePageWebViewController.swift` | ソース | 親クラス（WebView表示） |
| SharedContainerCache.swift | `WMF/Sources/WMF/` | ソース | 共有コンテナキャッシュ |
| ReadingListsAPIController.swift | `WMF/Sources/WMF/` | ソース | リーディングリストAPI |
| WikipediaAppUtils.swift | `Wikipedia/Code/WikipediaAppUtils.swift` | ソース | アプリバージョン情報 |
| WMFAlertManager.swift | `WMF/Sources/WMF/` | ソース | アラート表示管理 |
