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

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

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

Предварительные условия

  • Плагин Flutter 0.13.6 или выше.
  • Полное начало работы . В ваше приложение Flutter уже должен быть импортирован плагин Google Mobile Ads Flutter.

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

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

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

Андроид

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 . Для метода загрузки требуется идентификатор рекламного блока, режим ориентации, объект 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

Приложение открыто