跳至主要内容

广告设置或移除

Flutter 新闻工具包已预先配置为与 Google Ad Manager 或 AdMob 一起使用。如果您想使用这些服务中的任何一个来为您的应用盈利,请按照以下配置步骤操作。

注意

如果您不想使用 Google Ad Manager 或 AdMob 来为您的应用盈利,请按照移除广告部分中的说明进行操作。

配置广告

Google Ad Manager 为发布商提供了完整的广告收入引擎,帮助客户简化运营并为每次展示获取最大价值。要在您的应用中利用此广告交易平台,请访问 Google Ad Manager,然后输入您的 Google 帐户用户名和密码以登录。如果您没有帐户,请注册 Ad Manager 帐户以开始使用。

创建应用

成功创建帐户或登录现有帐户后,为每个平台和版本创建应用。默认情况下,您需要为 Android developmentproduction 版本以及 iOS developmentproduction 版本创建应用(总共 4 个应用)。如果您在使用 mason 生成项目时创建了其他版本,请确保在您的 Google Ad Manager 中创建相应的应用。

Firebase 配置

生成应用后,返回到您的 Firebase 控制台,将 Google Ad Manager 应用链接到 Firebase 项目的 Engage --> AdMob 部分中它们各自的 Firebase 应用。

Google AdMob

Google AdMob 通过应用内广告、可操作的见解以及强大的、易于使用的工具来增长您的应用业务,从而轻松赚取收入。要在您的应用中使用此服务,请访问 Google AdMob 以登录或创建帐户

创建应用

成功创建帐户或登录现有帐户后,为每个平台和版本创建应用。默认情况下,您需要为 Android developmentproduction 版本以及 iOS developmentproduction 版本创建应用(总共 4 个应用)。如果您在使用 mason 生成项目时创建了其他版本,请确保在您的 Google AdMob 帐户中创建相应的应用。

Firebase 配置

生成应用后,返回到您的 Firebase 控制台,将 Google AdMob 应用链接到 Firebase 项目的 Engage --> AdMob 部分中它们各自的 Firebase 应用。

交换广告 ID

最后,无论您使用的是 Google AdMob 还是 Google Ad Manager,都必须指定您的应用 ID。

首先,找到您的Google Ad Manager 应用 IDAdMob 应用 ID。对于代码库中每个应用版本的 strings.xml 文件,将与 admob_app_id 键关联的占位符值替换为您的特定于版本的应用 ID。重复此过程,并替换 project.pbxproj 文件中每个 ADMOB_APP_ID 键的占位符值。

移除广告

您可能想要从您的应用中移除广告。本节讨论如何移除各种广告类型及其依赖项。

移除横幅广告

默认情况下,static_news_data.dart 文件中的横幅广告会显示。为确保您的应用不会显示 BannerAds,请不要将 AdBlocks 插入到从您的数据源返回的数据中。

移除插页式广告

默认情况下,进入文章会显示插页式广告。要完全移除插页式广告,请从 _ArticleViewStateinitState 方法中删除以下行 (lib/article/view/article_page.dart)

context.read<FullScreenAdsBloc>().add(const ShowInterstitialAdRequested());

移除粘性广告

该模板在 ArticleContent 中包含一个粘性广告 (lib/article/widgets/article_content.dart)。要移除它,请从 ArticleContent widget 的 Stack.children 中删除 StickyAd() 构造函数调用。

移除激励广告

激励广告内置在 SubscribeWithArticleLimitModal widget 中 (lib/subscriptions/widgets/subscribe_with_article_limit_modal.dart)。

要移除高级文章的激励广告选项,请删除 SubscribeWithArticleLimitModal widget 中的“显示激励广告”按钮块

Padding(
padding: const EdgeInsets.symmetric(
horizontal: AppSpacing.lg + AppSpacing.xxs,
),
child: AppButton.transparentWhite(
key: const Key(
'subscribeWithArticleLimitModal_watchVideoButton',
),
onPressed: () => context
.read<FullScreenAdsBloc>()
.add(const ShowRewardedAdRequested()),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Assets.icons.video.svg(),
const SizedBox(width: AppSpacing.sm),
Text(watchVideoButtonTitle),
],
),
),
),

移除广告依赖项

从您的应用中移除广告时,最好从您的代码库中移除所有与广告相关的依赖项。

广告源代码

完全移除以下目录和文件

  • flutter_news_example/lib/ads
  • flutter_news_example/test/ads
  • flutter_news_example/packages/ads_consent_client
  • flutter_news_example/packages/news_blocks_ui/lib/src/widgets/banner_ad_content.dart
  • flutter_news_example/packages/news_blocks_ui/test/src/widgets/banner_ad_content_test.dart
  • flutter_news_example/packages/news_blocks_ui/lib/src/banner_ad.dart
  • flutter_news_example/packages/news_blocks_ui/test/src/banner_ad_test.dart

从以下文件中删除注释的代码段

  • flutter_news_example/lib/app/view/app.dart

    required AdsConsentClient adsConsentClient,
    _adsConsentClient = adsConsentClient,
    final AdsConsentClient _adsConsentClient;
    RepositoryProvider.value(value: _adsConsentClient),
    BlocProvider(
    create: (context) => FullScreenAdsBloc(
    interstitialAdLoader: ads.InterstitialAd.load,
    rewardedAdLoader: ads.RewardedAd.load,
    adsRetryPolicy: const AdsRetryPolicy(),
    localPlatform: const LocalPlatform(),
    )
    ..add(const LoadInterstitialAdRequested())
    ..add(const LoadRewardedAdRequested()),
    lazy: false,
    ),
  • flutter_news_example/lib/article/view/article_page.dart

    • HasWatchedRewardedAdListener
    • HasWatchedRewardedAdListener widget(保留子 Scaffold widget)
  • flutter_news_example/lib/main/main_development.dart

    final adsConsentClient = AdsConsentClient();
    adsConsentClient: adsConsentClient,
  • flutter_news_example/lib/main/main_production.dart

    final adsConsentClient = AdsConsentClient();
    adsConsentClient: adsConsentClient,
  • flutter_news_example/lib/onboarding/bloc/onboarding_bloc.dart

    required AdsConsentClient adsConsentClient,
    _adsConsentClient = adsConsentClient,
    on<EnableAdTrackingRequested>(
    _onEnableAdTrackingRequested,
    transformer: droppable(),
    );
    final AdsConsentClient _adsConsentClient;
    • _onEnableAdTrackingRequested() 函数
  • flutter_news_example/lib/onboarding/view/onboarding_page.dart

    adsConsentClient: context.read<AdsConsentClient>(),
  • flutter_news_example/lib/article/widgets/article_content_item.dart

    else if (newsBlock is BannerAdBlock) {
    return BannerAd(
    block: newsBlock,
    adFailedToLoadTitle: context.l10n.adLoadFailure,
    );
    }
  • flutter_news_example/lib/article/widgets/article_content_item.dart

    else if (newsBlock is BannerAdBlock) {
    return BannerAd(
    block: newsBlock,
    adFailedToLoadTitle: context.l10n.adLoadFailure,
    );
    }
  • flutter_news_example/packages/news_blocks_ui/lib/news_blocks_ui.dart

    export 'src/banner_ad.dart' show BannerAd;
  • flutter_news_example/packages/news_blocks_ui/lib/src/widgets/widges.dart

    export 'banner_ad_content.dart';

Pubspec 广告依赖项

flutter_news_example/packages/news_blocks_ui/pubspec.yaml 文件中移除 google_mobile_ads 依赖项,以及所有相应的导入语句

import  'package:google_mobile_ads/google_mobile_ads.dart'

flutter_news_example/pubspec.yaml 中移除 ads_consent_client 依赖项,以及所有 ads_consent_client 和所有 ads 导入语句

import 'package:ads_consent_client/ads_consent_client.dart';
import 'package:flutter_news_template/ads/ads.dart';