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

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

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

Требования

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

  • Установите плагин 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.