배너

배너 광고는 기기 화면의 상단이나 하단에서 앱의 레이아웃 안에 게재됩니다. 배너 광고는 사용자가 앱과 상호작용하는 동안 화면에 표시되며 일정 시간이 지나면 자동으로 새로고침될 수 있습니다.

이 가이드에서는 앵커링된 적응형 배너 광고를 시작하는 방법을 안내합니다. 고정된 적응형 배너는 지정된 광고 너비를 사용하여 각 기기에 맞게 광고 크기를 최적화합니다.

앵커 적응형 배너 광고는 고정 크기 광고가 아닌 고정 가로세로 비율 광고입니다. 가로세로 비율은 320x50과 비슷합니다. 사용 가능한 전체 너비를 지정하면 Google 모바일 광고 SDK에서 해당 너비에 맞는 높이의 광고를 반환합니다. 광고의 최적 높이는 여러 광고 요청에서 일정하게 유지되며 광고가 새로고침될 때 광고를 둘러싼 콘텐츠는 제자리에 유지됩니다.

항상 테스트 광고로 테스트

앱을 빌드하고 테스트할 때는 실제 프로덕션 광고 대신 테스트 광고를 사용하세요. 이렇게 하지 않으면 계정이 정지될 수 있습니다.

테스트 광고를 로드하는 가장 쉬운 방법은 배너 광고 전용 테스트 광고 단위 ID를 사용하는 것입니다.

Android

ca-app-pub-3940256099942544/9214589741

iOS

ca-app-pub-3940256099942544/2435281174

테스트 광고 단위는 모든 요청에 대해 테스트 광고를 반환하도록 구성되며, 코딩, 테스트, 디버깅 중에 앱에서 자유롭게 사용할 수 있습니다. 단, 앱을 게시하기 전에 이 테스트 광고 단위 ID를 자체 광고 단위 ID로 바꿔야 합니다.

광고 크기 가져오기

올바른 광고 크기의 배너 광고를 요청하려면 다음 단계를 따르세요.

  1. MediaQuery.of(context)를 사용하여 기기 화면의 너비를 밀도 독립형 픽셀 (dp) 단위로 가져옵니다. 전체 화면 너비를 사용하지 않으려면 직접 너비를 설정하면 됩니다.

  2. AdSize 클래스에 적절한 정적 메서드를 사용하여 AdSize 객체를 가져옵니다. 예를 들어 AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(int width)을 사용하여 현재 방향의 광고 크기를 가져옵니다.

// Get an AnchoredAdaptiveBannerAdSize before loading the ad.
final size = await AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(
    MediaQuery.sizeOf(context).width.truncate());

광고 로드

다음 예에서는 배너 광고를 인스턴스화합니다.

class BannerExampleState extends State<BannerExample>{
  BannerAd? _bannerAd;
  bool _isLoaded = false;

  // TODO: replace this test ad unit with your own ad unit.
  final adUnitId = Platform.isAndroid
    ? 'ca-app-pub-3940256099942544/9214589741'
    : 'ca-app-pub-3940256099942544/2435281174';

  /// Loads a banner ad.
  void loadAd() async {
    // Get an AnchoredAdaptiveBannerAdSize before loading the ad.
    final size = await AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(
        MediaQuery.sizeOf(context).width.truncate());

    _bannerAd = BannerAd(
      adUnitId: adUnitId,
      request: const AdRequest(),
      size: size,
      listener: BannerAdListener(
        // Called when an ad is successfully received.
        onAdLoaded: (ad) {
          debugPrint('$ad loaded.');
          setState(() {
            _isLoaded = true;
          });
        },
        // Called when an ad request failed.
        onAdFailedToLoad: (ad, err) {
          debugPrint('BannerAd failed to load: $error');
          // Dispose the ad here to free resources.
          ad.dispose();
        },
      ),
    )..load();
  }
}

BannerAdListener를 사용하면 광고 로드와 같은 수명 주기 이벤트를 수신할 수 있습니다. 이 예에서는 각 메서드를 구현하고 콘솔에 메시지를 기록합니다.

class BannerExampleState extends State<BannerExample> {
  BannerAd? _bannerAd;
  bool _isLoaded = false;

  // TODO: replace this test ad unit with your own ad unit.
  final adUnitId = Platform.isAndroid
    ? 'ca-app-pub-3940256099942544/9214589741'
    : 'ca-app-pub-3940256099942544/2435281174';


  /// Loads a banner ad.
  void loadAd() async {
    // Get an AnchoredAdaptiveBannerAdSize before loading the ad.
    final size = await AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(
        MediaQuery.sizeOf(context).width.truncate());

    _bannerAd = BannerAd(
      adUnitId: adUnitId,
      request: const AdRequest(),
      size: size,
      listener: BannerAdListener(
        // Called when an ad is successfully received.
        onAdLoaded: (ad) {
          debugPrint('$ad loaded.');
          setState(() {
            _isLoaded = true;
          });
        },
        // Called when an ad request failed.
        onAdFailedToLoad: (ad, err) {
          debugPrint('BannerAd failed to load: $error');
          // Dispose the ad here to free resources.
          ad.dispose();
        },
        // Called when an ad opens an overlay that covers the screen.
        onAdOpened: (Ad ad) {},
        // Called when an ad removes an overlay that covers the screen.
        onAdClosed: (Ad ad) {},
        // Called when an impression occurs on the ad.
        onAdImpression: (Ad ad) {},
      ),
    )..load();
  }
}

배너 광고 표시

BannerAd를 위젯으로 표시하려면 load()를 호출한 후 지원되는 광고로 AdWidget를 인스턴스화해야 합니다. load()를 호출하기 전에 위젯을 만들 수 있지만 위젯 트리에 위젯을 추가하기 전에 load()를 호출해야 합니다.

AdWidget은 Flutter의 위젯 클래스에서 상속되며 다른 위젯처럼 사용할 수 있습니다. iOS에서는 지정된 너비와 높이를 바탕으로 위젯에 위젯을 배치해야 합니다. 그렇지 않으면 광고가 게재되지 않을 수 있습니다. BannerAd는 광고와 일치하는 크기의 컨테이너에 배치할 수 있습니다.

if (_bannerAd != null) {
  Align(
    alignment: Alignment.bottomCenter,
    child: SafeArea(
      child: SizedBox(
        width: _bannerAd!.size.width.toDouble(),
        height: _bannerAd!.size.height.toDouble(),
        child: AdWidget(ad: _bannerAd!),
      ),
    ),
  )
}

광고에 액세스할 필요가 없어지면 광고를 폐기해야 합니다. dispose()를 호출하기 가장 좋은 시점은 위젯 트리나 BannerAdListener.onAdFailedToLoad() 콜백에서 AdWidget을 제거한 후입니다.

작업이 끝났습니다. 이제 앱에서 배너 광고를 게재할 수 있습니다.

Android 9 이하의 스크롤 제한

Android 9 이하를 실행하는 일부 오래되었거나 성능이 낮은 기기에서는 스크롤 보기 내에 인라인 배너 광고를 표시할 때 최적의 성능이 발휘되지 않을 수 있습니다. 이러한 유형의 배너는 Android 10 이상에서만 사용하는 것이 좋습니다. 고정된 배너(예: 고정된 배너)는 영향을 받지 않으며 모든 Android API 수준에서 최적의 성능으로 사용할 수 있습니다.

GitHub의 전체 예시

이 페이지에서 다룬 배너 통합의 전체 예는 banner_example을 참고하세요.

다른 배너 유형 알아보기

이 섹션에 정의된 다른 유형의 배너를 Flutter 애플리케이션에 적용하는 방법을 숙지합니다.

인라인 적응형 배너

인라인 적응형 배너는 높이가 가변적이며 앵커 적응형 배너에 비해 더 크고 더 높은 배너입니다. 스크롤 가능한 콘텐츠에 배너 광고를 게재하는 앱의 경우 앵커링된 적응형 배너 광고보다 인라인 적응형 배너를 사용하는 것이 좋습니다. 자세한 내용은 인라인 적응형 배너를 참고하세요.

접을 수 있는 배너

접을 수 있는 배너 광고는 처음에는 더 큰 오버레이로 표시되며, 광고를 더 작은 크기로 접을 수 있는 버튼이 있습니다. 이 배너를 사용하여 실적을 더욱 최적화해 보세요. 자세한 내용은 접을 수 있는 배너 광고를 참고하세요.