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

Выберите платформу: Android iOS Unity Flutter

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

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

Предпосылки

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

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

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

Самый простой способ загрузить тестовые объявления — использовать наши специальные идентификаторы тестовых рекламных блоков для объявлений с вознаграждением для 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

Открыть приложение