开屏广告

开屏广告是一种特殊的广告格式,用于通过应用加载屏幕变现。

注意

该广告格式仅支持竖屏显示。若使用横屏模式,广告将无法正常展示。

备注

演示项目中提供了展示所有格式类型运作原理的示例。

实体

描述

adUnitId

使用:

  • 开发模式,用于配合演示广告单元使用。

  • 生产模式,用于配合 R-M-XXXXXX-Y 使用(实际 ID 请在 Yandex Advertising Network 界面查询)。R-M-XXXXXX-Y 是您实际广告单元 ID 的模板,将用于接收各种广告创意。

开屏广告创建示例

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:yandex_mobileads/mobile_ads.dart';

class AppOpenPage extends StatefulWidget {
  const AppOpenPage({super.key});

  @override
  State<AppOpenPage> createState() => _AppOpenPageState();
}

class _AppOpenPageState extends State<AppOpenPage> with WidgetsBindingObserver {
  static const _tag = 'AppOpen';
  static const _adUnitId = 'demo-appopenad-yandex';

  AppOpenAdLoader? _loader;
  AppOpenAd? _ad;
  String _status = 'Initializing...';
  bool _wasInBackground = false;
  static bool _isShowing = false;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _init();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _ad?.destroy();
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    debugPrint('[$_tag] Lifecycle: $state');
    if (state == AppLifecycleState.paused) {
      _wasInBackground = true;
    } else if (state == AppLifecycleState.resumed && _wasInBackground && _ad != null && !_isShowing) {
      _wasInBackground = false;
      _show();
    }
  }

  Future<void> _init() async {
    setState(() => _status = 'Creating loader...');

    _loader = await AppOpenAdLoader.create(
      onAdLoaded: (ad) {
        debugPrint('[$_tag] onAdLoaded');
        if (!mounted) { ad.destroy(); return; }
        _ad = ad;
        setState(() => _status = 'Ready!\n\nMinimize app and return to show ad');
      },
      onAdFailedToLoad: (error) {
        debugPrint('[$_tag] onAdFailedToLoad: ${error.description}');
        if (mounted) setState(() => _status = 'Error: ${error.description}');
      },
    );

    setState(() => _status = 'Loading ad...');

    await _loader!.loadAd(
      adRequestConfiguration: AdRequestConfiguration(adUnitId: _adUnitId),
    );
  }

  Future<void> _show() async {
    final ad = _ad;
    if (ad == null || _isShowing) return;
    _isShowing = true;

    ad.setAdEventListener(
      eventListener: AppOpenAdEventListener(
        onAdShown: () {
          debugPrint('[$_tag] onAdShown');
          if (mounted) setState(() => _status = 'Showing...');
        },
        onAdDismissed: () {
          debugPrint('[$_tag] onAdDismissed');
          _isShowing = false;
          _ad?.destroy();
          _ad = null;
          if (mounted) setState(() => _status = 'Closed');
        },
        onAdClicked: () => debugPrint('[$_tag] onAdClicked'),
        onAdFailedToShow: (error) {
          debugPrint('[$_tag] onAdFailedToShow: ${error.description}');
          _isShowing = false;
          if (mounted) setState(() => _status = 'Show error: ${error.description}');
        },
        onAdImpression: (ImpressionData impressionData) => debugPrint('[$_tag] onAdImpression: $impressionData'),
      ),
    );

    await ad.show();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('AppOpen')),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(24),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              if (_status.contains('Loading') || _status.contains('Creating'))
                const CircularProgressIndicator(),
              const SizedBox(height: 16),
              Text(_status, textAlign: TextAlign.center),
            ],
          ),
        ),
      ),
    );
  }
}

检查集成

创建并运行您的项目。您可以通过在 Android StudioLogcat 中搜索 YandexAds 关键字来检查集成是否成功:

[Integration] Ad type App Open was integrated successfully
上一篇
下一篇