Flutter AdMob 적용 완벽 가이드
머리말
Flutter 앱에 Google AdMob 광고를 적용하는 방법을 단계별로 설명합니다. 이 가이드를 따르면 Android와 iOS 모두에서 AdMob 광고를 성공적으로 표시할 수 있어요.
내용이 겹쳐서, ATT & Admob 관련 게시글을 참고 하세요 - history 글은 펼쳐보세요
이 가이드에서는 개발 및 테스트용 앱 ID를 사용합니다. 실제 배포 시에는 Google AdMob 콘솔에서 발급받은 실제 앱 ID로 변경해야 해요.
1. 공통 설정
패키지 설치
pubspec.yaml
파일에 필요한 패키지들을 추가합니다:
| dependencies:
google_mobile_ads: ^6.0.0
url_launcher: ^6.3.1
app_tracking_transparency: ^2.0.6+1
|
패키지 설치:
Main.dart 설정
앱 시작 시 AdMob 초기화와 iOS 추적 권한 요청을 설정합니다:
| import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 세로 방향 고정
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
// ✅ AdMob 초기화 (필수!)
await MobileAds.instance.initialize();
// 기타 초기화 작업
await initHive();
// ✅ iOS에서 ATT 권한 요청 (광고 추적 동의)
if (Platform.isIOS) {
final status = await AppTrackingTransparency.trackingAuthorizationStatus;
if (status == TrackingStatus.notDetermined) {
await AppTrackingTransparency.requestTrackingAuthorization();
}
}
runApp(const ProviderScope(child: MyApp()));
}
|
주요 포인트:
MobileAds.instance.initialize()
: AdMob 초기화 (필수)
AppTrackingTransparency
: iOS에서 광고 추적 권한 요청
Platform.isIOS
: iOS에서만 추적 권한 요청 실행
2. Android 설정
AndroidManifest.xml 수정
android/app/src/main/AndroidManifest.xml
파일을 수정합니다:
| <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ✅ 필수 권한들 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- ✅ AdMob SDK 20.4.0 이하 버전 사용시 필수 -->
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
<application
android:label="your_app_name"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<!-- 기타 activity 설정들... -->
<!-- ✅ AdMob 앱 ID 등록 (테스트용) -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713"/>
</application>
</manifest>
|
중요 사항:
- INTERNET
권한: 광고 로드에 필수
- ACCESS_NETWORK_STATE
권한: 네트워크 상태 확인
- AD_ID
권한: 구버전 AdMob SDK 호환성
- 테스트 앱 ID: ca-app-pub-3940256099942544~3347511713
실제 배포시 주의
실제 앱 배포 시에는 Google AdMob 콘솔에서 발급받은 실제 앱 ID로 반드시 변경해야 합니다!
3. iOS 설정
Podfile 수정
먼저 ios/Podfile
파일을 수정하여 AdMob과 추적 권한을 위한 설정을 추가합니다:
| # iOS 최소 버전 설정
platform :ios, '15.0'
# CocoaPods 통계 비활성화 (빌드 속도 향상)
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
# 프로젝트 빌드 구성
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
# ✅ AdMob 및 권한 설정을 위한 post_install 스크립트
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
# 기본 설정
config.build_settings['ENABLE_BITCODE'] = 'NO'
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
# 시뮬레이터 ARM64 제외 (Intel Mac 호환성)
config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
# ✅ 광고 추적 권한 설정 (Google Mobile Ads + App Tracking Transparency)
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
]
end
end
end
|
주요 AdMob 관련 설정:
PERMISSION_APP_TRACKING_TRANSPARENCY=1
: iOS 14+ 추적 권한 활성화
IPHONEOS_DEPLOYMENT_TARGET
: iOS 12.0 이상 (AdMob 최소 요구사항)
ENABLE_BITCODE = 'NO'
: AdMob SDK와의 호환성
Podfile 설정 후 필수 작업
Podfile 수정 후 다음 명령어들을 실행하세요:
| # iOS 폴더로 이동
cd ios
# 기존 Pods 정리
rm -rf Pods Podfile.lock
# Pod 재설치
pod install --repo-update
# 프로젝트 루트로 돌아가기
cd ..
|
Podfile 수정 후 주의사항
Podfile을 수정한 후에는 반드시 pod install
을 실행해야 합니다.
기존에 설치된 Pods가 있다면 삭제 후 재설치하는 것을 권장합니다.
Info.plist 수정
ios/Runner/Info.plist
파일에 다음 설정들을 추가합니다:
| <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 기존 설정들... -->
<!-- ✅ URL Launcher 패키지용 설정 -->
<key>LSApplicationQueriesSchemes</key>
<array>
<string>https</string>
</array>
<!-- ✅ Google AdMob 앱 ID (실제 앱 ID 예시) -->
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-5673747993774414~2343851447</string>
<!-- ✅ AdMob 광고 어트리뷰션 설정 -->
<key>NSAdvertisingAttributionReportEndpoint</key>
<string>https://adservice.google.com</string>
<!-- ✅ SKAdNetwork 식별자 (iOS 14+ 광고 추적) -->
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cstr6suwn9.skadnetwork</string>
</dict>
<!-- 필요시 다른 네트워크 식별자들 추가 -->
</array>
<!-- ✅ 사용자 추적 권한 요청 메시지 -->
<key>NSUserTrackingUsageDescription</key>
<string>사용자에게 맞춤형 광고를 제공하기 위해 광고 활동 정보를 수집합니다.</string>
<!-- ✅ 네트워크 보안 설정 -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<!-- ✅ Flutter 개발용 네트워크 설정 -->
<key>NSBonjourServices</key>
<array>
<string>_dartobservatory._tcp</string>
</array>
<key>NSLocalNetworkUsageDescription</key>
<string>Flutter Devtools uses your local network for debugging.</string>
</dict>
</plist>
|
각 설정의 역할
기본 AdMob 설정:
GADApplicationIdentifier
: AdMob 앱 ID
NSAdvertisingAttributionReportEndpoint
: 광고 어트리뷰션 서버
iOS 14+ 대응:
SKAdNetworkItems
: App Store 광고 추적 지원
NSUserTrackingUsageDescription
: 추적 권한 요청 시 사용자에게 보여질 메시지
네트워크 설정:
NSAppTransportSecurity
: HTTP 통신 허용
LSApplicationQueriesSchemes
: URL 실행 권한
4. 실제 앱 ID로 변경하기
Google AdMob 콘솔에서 앱 등록
- Google AdMob 콘솔 접속
- 새 앱 등록
- 플랫폼별 앱 ID 확인
테스트 ID를 실제 ID로 변경
Android (AndroidManifest.xml):
| <!-- 테스트 ID (개발용) -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713"/>
<!-- 실제 ID (배포용) -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-XXXXXXXXXX~YYYYYYYYYY"/>
|
iOS (Info.plist):
| <!-- 실제 ID로 변경 -->
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-XXXXXXXXXX~YYYYYYYYYY</string>
|
5. 테스트 및 확인
개발 중 확인사항
- 앱 실행 시 에러 없음
- iOS에서 추적 권한 팝업 표시
- AdMob 초기화 완료 로그 확인
로그 확인
// AdMob 초기화 상태 확인
MobileAds.instance.initialize().then((initializationStatus) {
print('AdMob 초기화 완료: $initializationStatus');
});
// iOS 추적 권한 상태 확인 (iOS only)
if (Platform.isIOS) {
AppTrackingTransparency.trackingAuthorizationStatus.then((status) {
print('추적 권한 상태: $status');
});
}
6. 문제 해결
자주 발생하는 문제들
1. Android에서 광고가 안 나올 때
- 인터넷 권한 확인
- 앱 ID 정확성 확인
- 테스트 기기 등록 여부 확인
2. iOS에서 추적 권한 팝업이 안 나올 때
Info.plist
에 NSUserTrackingUsageDescription
추가 확인
- iOS 14.5+ 기기에서 테스트
- 앱 재설치 후 테스트
3. 앱이 크래시 날 때
MobileAds.instance.initialize()
호출 확인
- 패키지 버전 호환성 확인
- 디바이스 로그 확인
마무리
이제 Flutter 앱에 AdMob이 성공적으로 적용되었습니다!
다음 단계:
- 배너 광고, 전면 광고 등 구체적인 광고 유형 구현
- 실제 앱 ID로 변경 후 배포
- AdMob 콘솔에서 수익 확인
체크리스트:
AdMob 광고 구현에 대한 추가 질문이 있다면 언제든 물어보세요! 🚀