Flutter 2.0 새로운 AdMob 플러그인 Google Mobile Ads 사용법! (Banner Ads)

Written by 코드팩토리 JC

1월 15, 2024

Flutter 2.0 새로운 AdMob 플러그인

Google Mobile Ads?

기존에 Flutter 에서는 firebase_admob 이라는 플러그인으로 Admob 설정을 했었어요. 이 Admob 플러그인을 사용해보신 분들은 모두 느끼셨겠지만 단점이 정말 많습니다. 여러 단점중 가장 유저들이 불편해 했던건 Flutter 의 위젯 형태로 광고가 들어가는게 아니라 ListView 같은 곳에 배너를 추가할수가 없었어요. 하지만 이번에 google_mobile_ads 플러그인이 배너 광고를 플러터 위젯 형태로 제공을 해주면서 오랜 요청사항이었던 리스트뷰에 광고를 엠베드시키는게 가능해졌습니다!

사용 가능한 광고 형태

Google Mobile Ads

Overlay Banner

오버레이 배너는 저희가 개인 앱에서 흔하게 볼 수 있는 앱의 맨 위 또는 맨 아래에 오버레이로 넣을 수 있는 배너 형태예요. 기존 firebase_admob 플러그인에서도 사용이 가능했으나 UI/UX 를 크게 해치는 형태라 기업들은 사용하기를 꺼려 했었어요.

Inline Banner

이게 바로 이번에 추가된 배너형태예요. 사용하는 방법은 사실상 Overlay Banner 와 같다고 봐도 되는데 Flutter 위젯 형태로 생성이 되기때문에 위젯과 위젯 사이에 끼워넣는게 가능해져요! 오늘은 이 기능에 가장 포커스를 맞춰볼거예요!

Interstitial

Interstitial Ad 는 어떤 특정 액션을 취하기전에 거쳐가는 광고를 보여주려고 할때 사용하는 광고 형태예요. 예를들어서 채용공고를 리스트로 보여주는데 채용공고의 상세내용을 보려면 광고를 한번 보고 상세내용을 볼 수 있게 하고싶을때 사용하는 광고의 형태예요.

Rewarded

Rewarded Ad 는 보상형 광고예요. 광고를 보면 사용할 수 있는 포인트나 아이템같은걸 줄 수 있는 형태의 광고예요. 일반적으로 게임에서 굉장히 많이 사용되는 형태의 광고죠 (모두 랜덤다이스 하면서 무료 상자 받으려고 광고 봤던 기억이 있으리라 생각합니다 ㅎㅎ)

Native

네이티브 광고는 앱의 테마에 자연스럽게 스며들게 색상을 조절한 광고형태예요. 어떻게 보면 Banner Ad 와 개념은 비슷하지만 Banner Ad 는 누가봐도 광고인 것 처럼 앱의 디자인과 잘 어울어지지 않는 것에 반해 네이티브 광고는 말 그대로 디자인적으로 자연스럽게 앱에 스며드는 광고입니다.

Firebase 세팅하기

Firebase 를 세팅하는 방법까지 하나 하나 짚어가진 않도록 할게요! 대신 설명이 정말 잘 되어있는 공식 사이트를 첨부 해드리도록 하겠습니다! 그리고 google-services.json 파일 세팅하는 방법은 대부분의 Flutter 개발자분들이 이미 알고 계시리라 믿어요!

Firebase 세팅 링크 안드로이드

Firebase 세팅 링크 iOS

Admob 프로젝트 생성하기

Admob 프로젝트 생성하는 방법도 크게 어렵지 않습니다. 잘 모르겠는 분들은 아래 링크를 사용해서 Admob 프로젝트를 등록 해보시면 되겠습니다.

Admob 프로젝트 생성하기

iOS 세팅하기

ios/runner/Info.plist 파일에 Admob 에서 생성한 iOS 프로젝트의 앱 ID 를 등록 할 필요가 있습니다. 아래 코드를 Info.plist 파일에 추가해주세요!

<dict>
    <!--맨 아래-->
    <key>GADApplicationIdentifier</key>
    <string>여기에 iOS 앱 admob ID 를 넣어주세요!</string>
    <key>SKAdNetworkItems</key>
    <array>
        <dict>
            <key>SKAdNetworkIdentifier</key>
            <string>cstr6suwn9.skadnetwork</string>
        </dict>
    </array>
</dict>
XML

Android 세팅하기

안드로이드는 android/app/src/main/AndroidManifest.xml 파일 및 android/app/src/debug/AndroidManifest.xml 파일에 아래 코드를 추가해주셔야 합니다.

<meta-data
        android:name="com.google.android.gms.ads.APPLICATION_ID"
        android:value="여기에 Android Admob 앱 ID 를 입력해주세요!"/>
XML

플러그인 추가하기

Admob 앱 ID 세팅이 끝났으면 google_mobile_ads 플러그인을 pubspec.yaml 파일에 추가해야합니다.

dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2
  google_mobile_ads: ^0.11.0+4
YAML

Google Mobile Ads 초기화하기

Google Mobile Ads 플러그인 초기화는 어렵지 않습니다! 기존 main 함수에 아래처럼 Mobile Ads 플러그인을 초기화 하는 코드를 삽입 해줄게요!

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  MobileAds.instance.initialize();
  
  runApp(MyApp());
}
Dart

Banner 생성하기

Banner 를 생성하려면 ad unit ID 가 필요합니다. ad unit ID 는 Admob 에 생성한 앱에서 생성을 할 수 있는데 이 ID 는 필수적으로 프로덕션 환경에서만 사용을 해야합니다. 개발 환경에서 사용했다가 계정 정지를 받을수도 있으니 개발환경에서는 꼭 테스트 ID 를 사용하세요! 각 광고 형태별로 테스트 ID는 구글에서 제공해주는데 iOS 와 Android 의 광고 테스트 ID를 아래에 링크로 제공 해드릴게요!

iOS 광고 테스트 ID

Android 광고 테스트 ID

iOS 와 Android 각각 테스트 유닛 ID 가 다르니 확인하고 사용 해주세요!

  final String iOSTestId = 'ca-app-pub-3940256099942544/2934735716';
  final String androidTestId = 'ca-app-pub-3940256099942544/6300978111';

  BannerAd? banner;

  @override
  void initState() {
    super.initState();

    banner = BannerAd(
      size: AdSize.banner,
      adUnitId: Platform.isIOS ? iOSTestId : androidTestId,
      listener: AdListener(),
      request: AdRequest(),
    )..load();
  }
Dart

위 코드처럼 initState 에서 banner 오브젝트를 초기화합니다. 이제 이 초기화된 배너 오브젝트를 보여주기만 하면 돼요!

  @override
  Widget build(BuildContext context) {
    return DefaultLayout(
      body: Column(
        children: [
          Expanded(
            child: ListView.separated(
              itemBuilder: (_, index) {
                return Padding(
                  padding: EdgeInsets.all(16.0),
                  child: Container(
                    child: Text(index.toString()),
                  ),
                );
              },
              separatorBuilder: (c, index) {
                return Divider();
              },
              itemCount: 100,
            ),
          ),
          Container(
            height: 50.0,
            child: AdWidget(
              ad: banner,
            ),
          ),
        ],
      ),
    );
  }
Dart

그럼 아래와같이 아름다운 테스트 광고가 뜨는걸 볼 수 있어요!

배너

기존 플러그인에서는 플러 위젯에 직접 광고가 엠베딩 되지 않기때문에 오버레이 형식으로 들어갔는데 google_mobile_ads 플러그인은 완전 Flutter 위젯으로 엠베딩이 되기때문에 실제 위젯처럼 사용할 수 있어요!

그럼 이번엔 리스트뷰 사이사이에 광고를 한번 띄워볼게요!

일단 리스트에 보여줄 아이템들을 만들어야합니다.

  List items = [];

  @override
  void initState() {
    super.initState();

    items = List.generate(
      100,
      (index) => index,
    );
  }
Dart

items 리스트에 0부터 99까지 숫자를 순차대로 집어넣었어요. 이제 이 리스트 사이사이에 광고를 넣을겁니다.

  @override
  void initState() {
    super.initState();

    items = List.generate(
      100,
      (index) => index,
    );

    for (int i = items.length - 2; i >= 1; i -= 4) {
      items.insert(
        i,
        BannerAd(
          size: AdSize.banner,
          adUnitId: Platform.isIOS ? iOSTestId : androidTestId,
          listener: AdListener(),
          request: AdRequest(),
        )..load(),
      );
    }
  }
Dart

insert 함수를 사용해서 리스트의 중간중간에 배너를 넣었어요.

이 배너를 위젯으로 보여주는건 생각보다 어렵지 않아요.

  @override
  Widget build(BuildContext context) {
    return DefaultLayout(
      body: Column(
        children: [
          Expanded(
            child: ListView.separated(
              itemBuilder: (_, index) {
                final item = this.items[index];

                if (item is int) {
                  return Padding(
                    padding: EdgeInsets.all(16.0),
                    child: Container(
                      child: Text(index.toString()),
                    ),
                  );
                } else {
                  return Container(
                    height: 50.0,
                    child: AdWidget(
                      ad: item,
                    ),
                  );
                }
              },
              separatorBuilder: (c, index) {
                return Divider();
              },
              itemCount: items.length,
            ),
          ),
        ],
      ),
    );
  }
Dart

이렇게 하면 끝! 리스트에 포함되어 있는 아이템의 타입에 따라서 광고 또는 다른 위젯을 보여줄 수 있어요. 광고를 추가하는 패턴만 살짝 변경하면 원하는 형태로 광고를 중간에 삽입할 수 있겠죠? 아래가 결과물입니다.

리스트뷰 광고

google_mobile_ads 플러그인으로 모두 돈 많이 버시면 좋겠어요~

관련 포스트

플러터에서의 Immutable Programming: copyWith 함수 마스터하기!

플러터에서의 Immutable Programming: copyWith 함수 마스터하기!

서론 불변 프로그래밍: 현대 개발의 핵심 현대 소프트웨어 개발에서 불변 프로그래밍(Immutable Programming)의 중요성은 간과할 수 없는 요소입니다. 플러터(Flutter)에서도 마찬가지로 불변 프로그래밍 개념이 매우 중요하며, copyWith 함수는 이러한 불변성을 유지하는 데 핵심적인 역할을 합니다. 이 글에서는 플러터를 배우기 시작하는 개발자들에게 불변 프로그래밍의 중요성을 강조하고, copyWith 함수의 역할과 사용 방법에 대해 설명 해보겠습니다!...

ChatGPT가 이야기하는 2024년 개발자 로드맵

ChatGPT가 이야기하는 2024년 개발자 로드맵

서론 개발자의 여정을 시작하며 안녕하세요, 미래의 개발자 여러분! 오늘부터 시작하는 여러분의 개발 여정에 함께할 수 있어서 기쁩니다. 2023년은 기술이 매우 빠르게 변화하는 해였으며, 이러한 변화 속에서 개발자가 되기 위한 길은 더욱 다채롭고 흥미로워졌습니다. 이 로드맵은 초보자인 여러분이 개발의 세계에 첫발을 내딛는 데 필요한 기초부터 시작해, 점차 심화 단계로 나아가는 길을 안내해 드릴 것입니다. 백엔드 개발 이 글은 단순히 기술을 배우는 것 이상의 의미를 가집니다....

Flutter Freezed 플러그인! Entity Code Generation은 이거 하나로 끝!

Flutter Freezed 플러그인! Entity Code Generation은 이거 하나로 끝!

https://youtu.be/i5p6wXLAX7I 서론 Flutter 는 Code Generation 기능이 상당히 많이 활성화되어 있어요. 흔히들 많이 사용하는 json_serializable 라이브러리도 있고 retrofit 및 chopper 라이브러리도 있습니다. 오늘 알려드릴 freezed 또한 데이터 클래스에 편의 기능들을 제공해주는 code generation 라이브러리입니다. Freezed vs Json Serializable Code Generation 이라는...