---
name: admob
description: AdMob 전면 광고 구현 및 디버깅. 광고 표시, 로드 실패, foreground 이슈 시 사용.
allowed-tools: Read, Edit, Grep
---

# AdMob Integration

## 핵심 파일

| 파일 | 역할 |
|------|------|
| `lib/services/ad_service.dart` | 전면 광고 서비스 |

## 광고 ID

| 플랫폼 | ID | 비고 |
|--------|-----|------|
| Android | `ca-app-pub-6691216385521068/5281562472` | 프로덕션 |
| iOS | `ca-app-pub-3940256099942544/1033173712` | 테스트 |

## Completer 패턴 (필수)

광고 완료를 기다리려면 Completer 사용:

```dart
Future<bool> showInterstitialAd(BuildContext context) async {
  final completer = Completer<bool>();

  ad.fullScreenContentCallback = FullScreenContentCallback(
    onAdDismissedFullScreenContent: (ad) {
      ad.dispose();
      completer.complete(true);
    },
    onAdFailedToShowFullScreenContent: (ad, error) {
      ad.dispose();
      completer.complete(false);
    },
  );

  ad.show();
  return completer.future;
}
```

## "App not in foreground" 해결

광고 로드 중 앱이 백그라운드로 가면 오류 발생.

**해결책: 로딩 오버레이**

```dart
// 광고 로드 전 다이얼로그 표시 → 앱이 foreground 유지
final closeLoading = _showLoadingOverlay(context);
await _enterImmersiveMode();
final loaded = await _ensureAdLoaded();
closeLoading();
```

## 몰입형 모드

```dart
await SystemChrome.setEnabledSystemUIMode(
  SystemUiMode.immersiveSticky,
  overlays: [],
);
```

## 흐름도

```
startScan()
    ↓
showLoadingOverlay() ← 앱 foreground 유지
    ↓
enterImmersiveMode()
    ↓
loadAd()
    ↓
closeOverlay()
    ↓
ad.show()
    ↓
await Completer.future ← 광고 완료 대기
    ↓
restoreSystemUI()
    ↓
continueWithScan()
```
