エラー分類
- StoreKitエラー: 購入・復元・検証失敗
- AdMobエラー: 広告ロード失敗(サイレント処理)
- SwiftDataエラー: 保存失敗・マイグレーション失敗
- 権限エラー: 通知許可・ATT拒否
- ビジネスエラー: 入力値不正など
定義済み Error 型
StoreError(StoreManager)
enum StoreError: Error {
case productNotFound
case verificationFailed
case userCancelled
case pending
case unknown(String)
}
エラー一覧
| エラーID | 分類 | 発生条件 | ユーザー表示 | 復旧 | ロギング |
| WD-SK-01 | StoreKit | productNotFound | 「商品が見つかりません」 | 復元ボタン誘導 | error |
| WD-SK-02 | StoreKit | verificationFailed | 「決済の検証に失敗しました」 | サポート問合せ | error |
| WD-SK-03 | StoreKit | pending | 「処理中です」 | 承認後に自動更新 | info |
| WD-AD-01 | 広告 | Banner ロード失敗 | サイレント(高さ0) | — | info |
| WD-AD-02 | 広告 | Rewarded ロード失敗 | 「広告を読み込めませんでした」 | 再試行 | warning |
| WD-DB-01 | SwiftData | context.save() 失敗 | 「データ保存に失敗しました」 | 再試行 / 再起動 | error |
| WD-DB-02 | SwiftData | マイグレーション失敗 | サイレント(旧データ保持) | — | error |
| WD-NOTIF-01 | 権限 | 通知許可拒否 | 「設定アプリで通知を有効に」 | 設定アプリ起動 | info |
| WD-ATT-01 | 権限 | ATT拒否 | サイレント | — | info |
| WD-INPUT-01 | ビジネス | 重量・レップ未入力 | 「入力してください」 | 入力促進 | — |
| WD-INPUT-02 | ビジネス | 負の値入力 | 赤枠 + 警告 | 正の値に修正 | — |
UI 表示パターン
| 重要度 | 表示形式 | 例 |
| 低 | インラインメッセージ | 入力検証 |
| 中 | Alertダイアログ | StoreKit / SwiftData失敗 |
| 高 | フルスクリーン誘導 | 該当なし(ローカル完結) |
RewardedAdManager の continuation leak 対策
adContinuation プロパティで CheckedContinuation を手動管理。重複表示やメモリリークを防止。
// 簡略例
private var adContinuation: CheckedContinuation<Bool, Never>?
func showAd() async -> Bool {
await withCheckedContinuation { continuation in
self.adContinuation = continuation
// 広告表示後、コールバックで resume
}
}
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成(ソースコードからリバース) |