콘텐츠로 이동

Flutter AdMob 적용 완벽 가이드

머리말

Flutter 앱에 Google AdMob 광고를 적용하는 방법을 단계별로 설명합니다. 이 가이드를 따르면 Android와 iOS 모두에서 AdMob 광고를 성공적으로 표시할 수 있어요.

내용이 겹쳐서, ATT & Admob 관련 게시글을 참고 하세요 - history 글은 펼쳐보세요

테스트 앱 ID 사용

이 가이드에서는 개발 및 테스트용 앱 ID를 사용합니다. 실제 배포 시에는 Google AdMob 콘솔에서 발급받은 실제 앱 ID로 변경해야 해요.

1. 공통 설정

패키지 설치

pubspec.yaml 파일에 필요한 패키지들을 추가합니다:

1
2
3
4
dependencies:
  google_mobile_ads: ^6.0.0
  url_launcher: ^6.3.1
  app_tracking_transparency: ^2.0.6+1

패키지 설치:

flutter pub get

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 콘솔에서 앱 등록

  1. Google AdMob 콘솔 접속
  2. 새 앱 등록
  3. 플랫폼별 앱 ID 확인

테스트 ID를 실제 ID로 변경

Android (AndroidManifest.xml):

1
2
3
4
5
6
7
8
9
<!-- 테스트 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):

1
2
3
<!-- 실제 ID로 변경 -->
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-XXXXXXXXXX~YYYYYYYYYY</string>

5. 테스트 및 확인

개발 중 확인사항

  1. 앱 실행 시 에러 없음
  2. iOS에서 추적 권한 팝업 표시
  3. 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.plistNSUserTrackingUsageDescription 추가 확인
  • iOS 14.5+ 기기에서 테스트
  • 앱 재설치 후 테스트

3. 앱이 크래시 날 때

  • MobileAds.instance.initialize() 호출 확인
  • 패키지 버전 호환성 확인
  • 디바이스 로그 확인

마무리

이제 Flutter 앱에 AdMob이 성공적으로 적용되었습니다!

다음 단계:

  1. 배너 광고, 전면 광고 등 구체적인 광고 유형 구현
  2. 실제 앱 ID로 변경 후 배포
  3. AdMob 콘솔에서 수익 확인

체크리스트:

  • 패키지 설치 완료
  • main.dart 초기화 코드 추가
  • Android AndroidManifest.xml 설정
  • iOS Info.plist 설정
  • 테스트 실행 및 권한 팝업 확인
  • 실제 배포 전 앱 ID 변경

AdMob 광고 구현에 대한 추가 질문이 있다면 언제든 물어보세요! 🚀