概要
本アプリは 4種類のAdMob広告 を統合し、画面・タイミング別に最適な広告を出す。
プレミアム会員は全広告非表示。動画報酬やカレンダー解放で能動的な広告視聴も可能。
広告の種類と表示タイミング
| 種類 | Manager | 表示タイミング | 無料/プレミアム |
| Banner | —(BannerAdView) | HomeView 下部に常時 | 無料のみ |
| Interstitial | InterstitialAdManager | ジャンルクイズプレイ開始時 | 無料のみ |
| Rewarded | RewardedAdManager | 動画ボーナス・カレンダー解放(能動) | 常時利用可(報酬獲得) |
| AppOpen | AppOpenAdManager | 起動時・フォアグラウンド復帰時 | 無料のみ |
AdMob ID 構成
enum AdConfig {
static let appID = "ca-app-pub-4104853755894501~6924812325"
#if DEBUG
// Google公式テストID
static let bannerID = "ca-app-pub-3940256099942544/2934735716"
static let interstitialID = "ca-app-pub-3940256099942544/4411468910"
static let rewardedID = "ca-app-pub-3940256099942544/1712485313"
static let appOpenID = "ca-app-pub-3940256099942544/5575463023"
#else
// 本番ID(Info.plist管理)
#endif
}
関連画面
各 Manager の責務
RewardedAdManager(@MainActor : NSObject)
show(onReward:onFailed:) で表示
- 視聴完了時
onReward コールバック実行
- 失敗時
onFailed コールバックでエラー通知
- 動画ボーナス: CoinService.recordVideoBonus()
- カレンダー解放: HistoryService.markAsAdViewed()
InterstitialAdManager
- ジャンルクイズプレイ開始時に表示
- 未ロード時はサイレントで次画面へ
AppOpenAdManager
loadAd() で事前ロード
show(isPremium:) でプレミアム判定込みで表示
- scenePhase 変化監視でフォアグラウンド復帰時にも表示
ビジネスルール
- プレミアム会員は すべて非表示(Rewarded のみ報酬目的で利用可)
- 広告ロード失敗時は UXを止めない(Banner: 高さ0、Interstitial: スキップ)
- AppOpen は起動 UX を阻害しないため、ロード失敗時はサイレント
- 本番リリース前に 本番AdMob ID へ切替必須
外部連携
| 連携先 | 用途 |
| Google AdMob SDK | 4種広告のロード・表示 |
| App Tracking Transparency (ATT) | パーソナライズ広告のオプトイン |
| Info.plist(NSUserTrackingUsageDescription) | ATT説明文 |
| SKAdNetwork | アトリビューション計測 |
エラー処理
| 広告種類 | 失敗時の挙動 |
| Banner | 高さ0で非表示 |
| Interstitial | サイレントでスキップ |
| Rewarded | onFailed コールバックで「再試行してください」 |
| AppOpen | サイレントでスキップ |
実装メモ
- 各Manager は
@MainActor : NSObject
- DEBUG/Release で AdConfig がID切替
- scenePhase == .active で AppOpen 再表示判定
- AdMob テスト IDが本番に紛れないよう project.yml で確認
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成 |