--- 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 showInterstitialAd(BuildContext context) async { final completer = Completer(); 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() ```