目的・役割
プレミアム会員の特典を訴求し、月額・年額プランから選択して StoreKit 経由で購入してもらう画面。
PaywallView を中心に Header / Plan / Purchase / Benefits / Footer の5つのサブViewで構成。
UI 構成(サブView)
| サブView | 役割 |
| PaywallHeaderView | キャッチコピー・アイキャッチ画像 |
| PaywallBenefitsView | 特典リスト(広告非表示・ポイント増量・無料作成枠拡大 等) |
| PaywallPlanSelectionView | 月額/年額のプラン選択(ボタンスタイル) |
| PaywallPurchaseButton | 購入実行ボタン(StoreKit起動) |
| PaywallFooterView | 利用規約・プライバシーポリシー・「購入を復元」リンク |
提供商品
| プラン | Product ID |
| 月額 | com.happyboy1002.RankingStadium.premium.monthly |
| 年額 | com.happyboy1002.RankingStadium.premium.yearly |
状態
| 状態 | 表示内容 |
| 商品取得中 | ProgressView |
| 商品取得完了 | プラン選択UI表示 |
| 購入処理中 | ボタン無効化 + ProgressView |
| 購入成功 | 「ようこそプレミアム会員へ」表示 → 戻る |
| 購入失敗 | エラーアラート |
| すでにプレミアム | 「すでにプレミアム会員です」表示 |
遷移
| 操作 | 遷移先 |
| プラン選択 + 購入ボタン | StoreKit 購入フロー |
| 復元ボタン | StoreKitService.restorePurchases() |
| 利用規約・プライバシー | SafariView で表示 |
| 戻る | SettingsView |
使用するデータモデル
StoreKitService {
var products: [Product] // 月額・年額
var purchasedProductIDs: Set
var isPremium: Bool
func purchase(_ product: Product) async throws
func restorePurchases() async throws
}
実装メモ
- products は loadProducts() で月額→年額の順にソート
- isAppStoreRelease で本番判定(DEBUG/TestFlight/本番)
- listenForTransactions() でトランザクション監視
- checkCurrentEntitlements() で起動時の購買状態確認
- StoreKit Configuration ファイルでローカルテスト
関連
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成 |