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

Выберите платформу: Android (бета-версия)Новый Android iOS Unity Flutter

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

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

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

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

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

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

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

  • /21775744923/example/app-open

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

Выполнение

Основные шаги по интеграции рекламы при открытии приложения:

  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 = '/21775744923/example/app-open';
  
  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;
  }
}

Загрузить рекламу

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

Загрузка рекламы осуществляется с помощью метода loadWithAdManagerAdRequest класса AppOpenAd . Метод load требует идентификатор рекламного блока, режим ориентации экрана, объект AdManagerAdRequest и обработчик завершения, который вызывается при успешной или неудачной загрузке рекламы. Загруженный объект AppOpenAd передается в качестве параметра в обработчик завершения. Следующий пример показывает, как загрузить AppOpenAd .

public class AppOpenAdManager {
  ...

  /// Load an AppOpenAd.
  void loadAd() {
    AppOpenAd.loadWithAdManagerAdRequest(
      adUnitId: adUnitId,
      adManagerAdRequest: AdManagerAdRequest(),
      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.loadWithAdManagerAdRequest(
      adUnitId: adUnitId,
      orientation: AppOpenAd.orientationPortrait,
      adManagerAdRequest: AdManagerAdRequest(),
      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 .