概要
本アプリは Banner と Rewarded の2種類の広告を活用。プレミアムユーザーは非表示。
Rewarded 視聴で1回限りプレミアム機能を一時解放できる導線あり。
広告の種類と配置
| 種類 | 配置 | 無料/プレミアム |
| Banner | ContentView 下部 | 無料のみ |
| Rewarded | 能動視聴(プレミアム機能一時解放) | 常時利用可 |
AdMob ID 構成
// App ID
"ca-app-pub-4104853755894501~7490751129"
// Rewarded Ad Unit
#if DEBUG
"ca-app-pub-3940256099942544/1712485313" // Google公式テストID
#else
"ca-app-pub-4104853755894501/1172971356" // 本番ID
#endif
RewardedAdManager API
@Observable @MainActor
final class RewardedAdManager {
var isAdReady: Bool
private var adContinuation: CheckedContinuation<Bool, Never>?
func loadAd()
func showAd() async -> Bool // true=報酬獲得
}
continuation leak 対策
Google AdMob の callback ベースAPI を CheckedContinuation でブリッジ。
重複表示・メモリリーク防止のため、callback 実行後に必ず resume + nil 化。
ビジネスルール
- Banner はプレミアムユーザーには表示しない
- Rewarded はプレミアム判定不要(常時表示可)
- Rewarded 視聴で
tempPremiumExpiresAt を保存し時限解放
- 本番リリース時は本番 Ad Unit ID へ切替必須
外部連携
| 連携先 | 用途 |
| Google AdMob SDK v12.0+ | Banner / Rewarded 広告 |
| App Tracking Transparency | IDFA許可 |
| Info.plist (NSUserTrackingUsageDescription) | ATT説明文 |
エラー処理
| 発生条件 | 対応 |
| Banner ロード失敗 | サイレント(高さ0) |
| Rewarded ロード失敗 | 「広告を読み込めませんでした」 |
| 視聴中断 | 報酬なし |
変更履歴
| バージョン | 日付 | 変更内容 |
|---|
| 1.0 | 2026-05-09 | 初版作成 |