Объявления при запуске приложения

Объявления при запуске приложения – это специальный формат, предназначенный для издателей, которые хотят монетизировать экраны загрузки своих приложений. Объявления при запуске приложения можно закрыть в любой момент. Они показываются, когда пользователь переводит приложение в активный режим.

В рекламе при запуске приложения автоматически показывается небольшая область с брендом, чтобы пользователи понимали, что они находятся в вашем приложении. Вот пример такой рекламы:

Требования

Прежде чем продолжить, выполните следующие действия:

  • Установите плагин Flutter 0.13.6 или более поздней версии.
  • Настройте Google Mobile Ads Flutter Plugin. В приложении Flutter должен быть импортирован пакет Google Mobile Ads Flutter Plugin.

Всегда тестируйте с помощью тестовых объявлений

При создании и тестировании приложений используйте тестовые объявления, а не реальные. В противном случае ваш аккаунт может быть заблокирован.

Самый простой способ загрузить тестовые объявления – использовать специальные идентификаторы тестовых рекламных блоков для объявлений с вознаграждением на платформах Android и iOS:

Android

ca-app-pub-3940256099942544/9257395921

iOS

ca-app-pub-3940256099942544/5575463023

Они специально настроены на то, чтобы возвращать тестовые объявления для каждого запроса, и вы можете свободно использовать их в своих приложениях при написании кода, тестировании и отладке. Только не забудьте заменить их на собственные идентификаторы рекламных блоков перед публикацией приложения.

Реализация

Чтобы добавить объявления при запуске приложения, выполните следующие основные действия:

  1. Создайте вспомогательный класс, который будет загружать объявление до того, как его нужно будет показать.
  2. Загрузите объявление.
  3. Зарегистрируйте обратные вызовы и покажите объявление.
  4. Подпишитесь на AppStateEventNotifier.appStateStream, чтобы показывать рекламу при переходе приложения в активный режим.

Как создать класс утилит

Создайте новый класс AppOpenAdManager, чтобы загрузить объявление. Этот класс управляет переменной экземпляра, которая отслеживает загруженное объявление и идентификатор рекламного блока для каждой платформы.

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. Для метода load требуется идентификатор рекламного блока, режим ориентации, объект 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.appStateStream и прослушивайте события foreground.

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

Полный пример можно посмотреть в демоверсии API.