티스토리 뷰

Flutter 애플리케이션을 개발하면서 광고 수익화를 고려하고 있다면, Google Mobile Ads 플러그인은 꼭 알아야 할 필수 도구입니다. 이 글에서는 Google Mobile Ads 플러그인의 주요 기능과 Flutter에서 이를 어떻게 통합하고 활용할 수 있는지 단계별로 안내합니다.

참고. Add ads to your mobile Flutter app or game

Google Mobile Ads란 무엇인가?

Google Mobile Ads는 Google AdMob 네트워크를 Flutter 애플리케이션에 통합할 수 있게 하는 플러그인입니다. 이를 통해 앱 개발자는 배너 광고, 전면 광고, 보상형 광고, 네이티브 광고를 구현하여 광고 수익화를 극대화할 수 있습니다.

주요 광고 유형

Google Mobile Ads 플러그인을 사용하면 다음과 같은 주요 광고 형식을 앱에 쉽게 추가할 수 있습니다.

1. 배너 광고

  • 특징: 화면 하단 또는 상단에 고정되어 지속적으로 노출됩니다.
  • 사용 예시: 사용자가 앱을 탐색하는 동안 노출.

2. 전면 광고 (Interstitial Ads)

  • 특징: 앱 전환 시 전체 화면에 표시됩니다.
  • 사용 예시: 레벨 완료 후, 페이지 이동 시.

3. 보상형 광고 (Rewarded Ads)

  • 특징: 사용자가 광고를 시청하면 보상을 받습니다.
  • 사용 예시: 게임 아이템, 프리미엄 콘텐츠 해제.

4. 네이티브 광고

  • 특징: 앱 디자인에 맞춘 맞춤형 광고.
  • 사용 예시: 피드 형식의 앱에서 자연스럽게 광고를 삽입.

Flutter에서 Google Mobile Ads 통합하기

1. 플러그인 설치

pubspec.yaml 파일에 다음을 추가하여 플러그인을 설치합니다.

dependencies:
  google_mobile_ads: ^2.0.0

이후 flutter pub get 명령어로 의존성을 설치합니다.

2. 초기화

앱 실행 시 Google Mobile Ads SDK를 초기화해야 합니다. main.dart 파일의 main() 함수에서 초기화를 설정합니다.

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

3. 광고 구현

(1) 배너 광고 추가

BannerAd myBanner = BannerAd(
  adUnitId: '광고 단위 ID',
  size: AdSize.banner,
  request: AdRequest(),
  listener: BannerAdListener(),
);

myBanner.load();

(2) 전면 광고 추가

InterstitialAd.load(
  adUnitId: '광고 단위 ID',
  request: AdRequest(),
  adLoadCallback: InterstitialAdLoadCallback(
    onAdLoaded: (InterstitialAd ad) {
      ad.show();
    },
    onAdFailedToLoad: (LoadAdError error) {
      print('전면 광고 로드 실패: $error');
    },
  ),
);

(3) 보상형 광고 추가

RewardedAd.load(
  adUnitId: '광고 단위 ID',
  request: AdRequest(),
  rewardedAdLoadCallback: RewardedAdLoadCallback(
    onAdLoaded: (RewardedAd ad) {
      ad.show(
        onUserEarnedReward: (AdWithoutView ad, RewardItem reward) {
          print('보상 획득: ${reward.amount}');
        },
      );
    },
    onAdFailedToLoad: (LoadAdError error) {
      print('보상형 광고 로드 실패: $error');
    },
  ),
);

팁과 주의사항

  1. 광고 단위 ID:
    Google AdMob 계정을 통해 광고 단위 ID를 생성하고 각 광고 유형에 적절히 설정합니다.
  2. 사용자 경험 고려:
    과도한 광고는 사용자 경험을 해칠 수 있으므로, 적절한 빈도로 광고를 배치하세요.
  3. 테스트 광고 활용:
    앱 개발 중에는 실제 광고 대신 테스트 광고를 사용하여 정책 위반을 방지하세요.
  4. 앱 정책 준수:
    Google의 광고 정책을 준수하여 광고 게재가 중단되는 상황을 방지해야 합니다.

Google Mobile Ads 활용의 장점

  • 수익화 극대화: 다양한 광고 형식을 제공하여 수익 창출 가능성을 높임.
  • 글로벌 네트워크: Google AdMob의 글로벌 광고 네트워크를 통해 높은 광고 수익률을 기대할 수 있음.
  • 사용자 데이터 기반 최적화: 광고 노출 빈도 및 타겟팅을 자동으로 최적화.

결론

Google Mobile Ads 플러그인은 Flutter 애플리케이션의 수익화를 위한 강력한 도구입니다. 배너, 전면, 보상형, 네이티브 광고를 적절히 활용하면 사용자 경험을 유지하면서도 수익성을 극대화할 수 있습니다. Flutter 앱을 성공적으로 광고 수익화하려면 위의 단계를 참고하여 Google Mobile Ads를 통합해 보세요.

 

import 'dart:io';

import 'package:flutter/widgets.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

class MyBannerAdWidget extends StatefulWidget {
  /// The requested size of the banner. Defaults to [AdSize.banner].
  final AdSize adSize;

  /// The AdMob ad unit to show.
  ///
  /// TODO: replace this test ad unit with your own ad unit
  final String adUnitId = Platform.isAndroid
      // Use this ad unit on Android...
      ? 'ca-app-pub-3940256099942544/6300978111'
      // ... or this one on iOS.
      : 'ca-app-pub-3940256099942544/2934735716';

  MyBannerAdWidget({
    super.key,
    this.adSize = AdSize.banner,
  });

  @override
  State<MyBannerAdWidget> createState() => _MyBannerAdWidgetState();
}

class _MyBannerAdWidgetState extends State<MyBannerAdWidget> {
  /// The banner ad to show. This is `null` until the ad is actually loaded.
  BannerAd? _bannerAd;

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: SizedBox(
        width: widget.adSize.width.toDouble(),
        height: widget.adSize.height.toDouble(),
        child: _bannerAd == null
            // Nothing to render yet.
            ? SizedBox()
            // The actual ad.
            : AdWidget(ad: _bannerAd!),
      ),
    );
  }

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

  @override
  void dispose() {
    _bannerAd?.dispose();
    super.dispose();
  }

  /// Loads a banner ad.
  void _loadAd() {
    final bannerAd = BannerAd(
      size: widget.adSize,
      adUnitId: widget.adUnitId,
      request: const AdRequest(),
      listener: BannerAdListener(
        // Called when an ad is successfully received.
        onAdLoaded: (ad) {
          if (!mounted) {
            ad.dispose();
            return;
          }
          setState(() {
            _bannerAd = ad as BannerAd;
          });
        },
        // Called when an ad request failed.
        onAdFailedToLoad: (ad, error) {
          debugPrint('BannerAd failed to load: $error');
          ad.dispose();
        },
      ),
    );

    // Start loading.
    bannerAd.load();
  }
}