アプリ起動時広告

アプリ起動時広告は、収益化を目指すパブリッシャー様向けの特別な広告フォーマットです アプリの読み込み画面ですアプリ起動時広告はいつでも閉じることができます。 ユーザーがアプリをフォアグラウンドに戻したときに表示されます。

アプリ起動時広告では、小さなブランディング領域が自動的に表示されるため、ユーザーはそのエリアにいることがわかる 説明します。アプリ起動時広告の例を以下に示します。

前提条件

  • Flutter プラグイン 0.13.6 以降。
  • スタートガイドの手順を踏みます。Flutter アプリは、 Google Mobile Ads Flutter プラグインをインポート済みであると 確認できます

必ずテスト広告でテストする

アプリの開発とテストでは必ずテスト広告を使用し、配信中の実際の広告は使用しないでください。実際の広告を使用すると、アカウントが停止される可能性があります。

テスト広告を読み込むには、専用のテスト広告ユニット ID を使用すると、 Android と iOS のリワード広告:

Android

ca-app-pub-3940256099942544/9257395921

iOS

ca-app-pub-3940256099942544/5575463023

すべてのリクエストに対してテスト広告を返すように特別に構成されており、 独自のアプリでコーディング、テスト、デバッグを行う際に、自由に使用できます。 必ずご自身の広告ユニット ID に置き換えてください。 。

実装

アプリ起動時広告を組み込む主な手順は、以下のとおりです。

  1. 表示が必要になる前に広告を読み込むユーティリティ クラスを作成します。
  2. 広告を読み込みます。
  3. コールバックに登録して広告を表示する。
  4. フォアグラウンド イベント中に広告を表示するよう、AppStateEventNotifier.appStateStream に登録します。

ユーティリティ クラスを作成する

AppOpenAdManager という新しいクラスを作成して、広告を読み込みます。このクラスは 読み込まれた広告とそれぞれの広告ユニット ID をトラッキングするためのインスタンス変数 説明します。

import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'dart:io' show Platform;

class AppOpenAdManager {
  
  String adUnitId = Platform.isAndroid
    ? 'ca-app-pub-3940256099942544/9257395921'
    : 'ca-app-pub-3940256099942544/5575463023';
  
  AppOpenAd? _appOpenAd;
  bool _isShowingAd = false;

  /// Load an AppOpenAd.
  void loadAd() {
    // We will implement this below.
  }

  /// Whether an ad is available to be shown.
  bool get isAdAvailable {
    return _appOpenAd != null;
  }
}

広告を読み込む

アプリ起動時広告は、ユーザーがアプリを起動する前に、アプリ起動時広告の準備が整っている必要があります。実装 ユーティリティ クラスを使用して、広告を表示する必要が生じる前に広告リクエストを行うことができます。

広告を読み込むには、load メソッドを使用します。 これは AppOpenAd クラスにあります。読み込みメソッドでは、広告ユニット ID、画面の向き、 AdRequest オブジェクト、コンプリーション このハンドラは、広告の読み込みが成功または失敗したときに呼び出されます。読み込まれた AppOpenAd オブジェクトは、完了ハンドラのパラメータとして提供されます。「 次の例は、AppOpenAd を読み込む方法を示しています。

public class AppOpenAdManager {
  ...

  /// Load an AppOpenAd.
  void loadAd() {
    AppOpenAd.load(
      adUnitId: adUnitId,
      adRequest: AdRequest(),
      adLoadCallback: AppOpenAdLoadCallback(
        onAdLoaded: (ad) {
          _appOpenAd = ad;
        },
        onAdFailedToLoad: (error) {
          print('AppOpenAd failed to load: $error');
          // Handle the error.
        },
      ),
    );
  }
}

広告を表示し、全画面コールバックを処理する

広告を表示する前に、リッスンする広告イベントごとに FullScreenContentCallback を登録します。

public class AppOpenAdManager {
  ...

  public void showAdIfAvailable() {
    if (!isAdAvailable) {
      print('Tried to show ad before available.');
      loadAd();
      return;
    }
    if (_isShowingAd) {
      print('Tried to show ad while already showing an ad.');
      return;
    }
    // Set the fullScreenContentCallback and show the ad.
    _appOpenAd!.fullScreenContentCallback = FullScreenContentCallback(
      onAdShowedFullScreenContent: (ad) {
        _isShowingAd = true;
        print('$ad onAdShowedFullScreenContent');
      },
      onAdFailedToShowFullScreenContent: (ad, error) {
        print('$ad onAdFailedToShowFullScreenContent: $error');
        _isShowingAd = false;
        ad.dispose();
        _appOpenAd = null;
      },
      onAdDismissedFullScreenContent: (ad) {
        print('$ad onAdDismissedFullScreenContent');
        _isShowingAd = false;
        ad.dispose();
        _appOpenAd = null;
        loadAd();
      },
    );
  }
}

ユーザーがアプリを開いた状態でクリックしてからアプリに戻った場合 別のアプリ起動時広告が表示されないようにします

アプリのフォアグラウンド イベントをリッスンする

アプリのフォアグラウンド イベントについて通知を受け取るには、以下に登録する必要があります。 AppStateEventNotifier.appStateStreamforeground イベントをリッスンします。

import 'package:app_open_example/app_open_ad_manager.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

/// Listens for app foreground events and shows app open ads.
class AppLifecycleReactor {
  final AppOpenAdManager appOpenAdManager;

  AppLifecycleReactor({required this.appOpenAdManager});

  void listenToAppStateChanges() {
    AppStateEventNotifier.startListening();
    AppStateEventNotifier.appStateStream
        .forEach((state) => _onAppStateChanged(state));
  }

  void _onAppStateChanged(AppState appState) {
    // Try to show an app open ad if the app is being resumed and
    // we're not already showing an app open ad.
    if (appState == AppState.foreground) {
      appOpenAdManager.showAdIfAvailable();
    }
  }
}

これで、AppLifecycleReactor を追加して初期化できるようになりました。 アプリのライフサイクルの変化に迅速に対応できます。たとえば、ホームページから次のように追加できます。

import 'package:app_open_example/app_open_ad_manager.dart';
import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

import 'app_lifecycle_reactor.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App Open Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'App Open Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

/// Example home page for an app open ad.
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  late AppLifecycleReactor _appLifecycleReactor;

  @override
  void initState() {
    super.initState();
    
    AppOpenAdManager appOpenAdManager = AppOpenAdManager()..loadAd();
    _appLifecycleReactor = AppLifecycleReactor(
      appOpenAdManager: appOpenAdManager);
  }

広告の有効期限に関する考察

期限切れの広告を表示しないようにするには、タイムスタンプを AppOpenAdManager に追加して、広告を読み込んでから経過した時間と次に、そのタイムスタンプを使用して、広告がまだ有効かどうかを確認します。

/// Utility class that manages loading and showing app open ads.
class AppOpenAdManager {
  ...
  
  /// Maximum duration allowed between loading and showing the ad.
  final Duration maxCacheDuration = Duration(hours: 4);

  /// Keep track of load time so we don't show an expired ad.
  DateTime? _appOpenLoadTime;
  
  ...

  /// Load an AppOpenAd.
  void loadAd() {
    AppOpenAd.load(
      adUnitId: adUnitId,
      orientation: AppOpenAd.orientationPortrait,
      adRequest: AdRequest(),
      adLoadCallback: AppOpenAdLoadCallback(
        onAdLoaded: (ad) {
          print('$ad loaded');
          _appOpenLoadTime = DateTime.now();
          _appOpenAd = ad;
        },
        onAdFailedToLoad: (error) {
          print('AppOpenAd failed to load: $error');
        },
      ),
    );
  }

  /// Shows the ad, if one exists and is not already being shown.
  ///
  /// If the previously cached ad has expired, this just loads and caches a
  /// new ad.
  void showAdIfAvailable() {
    if (!isAdAvailable) {
      print('Tried to show ad before available.');
      loadAd();
      return;
    }
    if (_isShowingAd) {
      print('Tried to show ad while already showing an ad.');
      return;
    }
    if (DateTime.now().subtract(maxCacheDuration).isAfter(_appOpenLoadTime!)) {
      print('Maximum cache duration exceeded. Loading another ad.');
      _appOpenAd!.dispose();
      _appOpenAd = null;
      loadAd();
      return;
    }
    // Set the fullScreenContentCallback and show the ad.
    _appOpenAd!.fullScreenContentCallback = FullScreenContentCallback(...);
    _appOpenAd!.show();
  }
}

コールド スタートと読み込み画面

ドキュメントではここまでは、ユーザーが特定の操作をしているときにのみアプリ起動時広告を表示することを想定 メモリ内で一時停止されたときにアプリをフォアグラウンドで処理します。「コールド スタート」は、メモリ内で一時停止されていなかったアプリが起動された場合に発生します。

コールド スタートの例として、ユーザーが初めてアプリを起動したときが挙げられます。 コールド スタートでは、読み込み済みのアプリ起動時広告を 表示されます。広告のリクエストから広告が届くまでの所要時間 ユーザーがそれまでにアプリを使用できなくなった場合も 背景情報のない広告を表示して驚かされました。エラーの原因となるため、この方法は ユーザーエクスペリエンスが低下します

コールド スタートでアプリ起動時広告を使用する場合のおすすめの方法は、ゲームまたはアプリのアセットを読み込んでいる読み込み画面からのみ広告を表示することです。アプリの読み込みが完了し、ユーザーをメイン 広告は表示されません。

ベスト プラクティス

アプリ起動時広告は、アプリが最初に起動したとき、アプリの読み込み画面を収益化するのに役立ちます。 重要な役割を果たしますが、ベスト プラクティスを アプリを楽しんでもらうことが重要です次のことをおすすめします。

  • ユーザーがアプリを数回使用した後に、アプリ起動時広告を初めて表示する。
  • ユーザーが待たされるはずの時間帯にアプリ起動時広告を表示 読み込む必要があるかもしれません。
  • アプリ起動時広告の下に読み込み画面が存在し、広告が閉じられる前に読み込み画面の読み込みが完了した場合は、onAdDismissedFullScreenContent イベント ハンドラで読み込み画面を閉じることができます。

GitHub のサンプルコードの全文

アプリ起動