广告设置或移除
Flutter 新闻工具包已预先配置为与 Google Ad Manager 或 AdMob 一起使用。如果您想使用这些服务中的任何一个来为您的应用盈利,请按照以下配置步骤操作。
如果您不想使用 Google Ad Manager 或 AdMob 来为您的应用盈利,请按照移除广告部分中的说明进行操作。
配置广告
Google Ad Manager
Google Ad Manager 为发布商提供了完整的广告收入引擎,帮助客户简化运营并为每次展示获取最大价值。要在您的应用中利用此广告交易平台,请访问 Google Ad Manager,然后输入您的 Google 帐户用户名和密码以登录。如果您没有帐户,请注册 Ad Manager 帐户以开始使用。
创建应用
成功创建帐户或登录现有帐户后,为每个平台和版本创建应用。默认情况下,您需要为 Android development
和 production
版本以及 iOS development
和 production
版本创建应用(总共 4 个应用)。如果您在使用 mason 生成项目时创建了其他版本,请确保在您的 Google Ad Manager 中创建相应的应用。
Firebase 配置
生成应用后,返回到您的 Firebase 控制台,将 Google Ad Manager 应用链接到 Firebase 项目的 Engage --> AdMob 部分中它们各自的 Firebase 应用。
Google AdMob
Google AdMob 通过应用内广告、可操作的见解以及强大的、易于使用的工具来增长您的应用业务,从而轻松赚取收入。要在您的应用中使用此服务,请访问 Google AdMob 以登录或创建帐户。
创建应用
成功创建帐户或登录现有帐户后,为每个平台和版本创建应用。默认情况下,您需要为 Android development 和 production 版本以及 iOS development 和 production 版本创建应用(总共 4 个应用)。如果您在使用 mason 生成项目时创建了其他版本,请确保在您的 Google AdMob 帐户中创建相应的应用。
Firebase 配置
生成应用后,返回到您的 Firebase 控制台,将 Google AdMob 应用链接到 Firebase 项目的 Engage --> AdMob 部分中它们各自的 Firebase 应用。
交换广告 ID
最后,无论您使用的是 Google AdMob 还是 Google Ad Manager,都必须指定您的应用 ID。
首先,找到您的Google Ad Manager 应用 ID或AdMob 应用 ID。对于代码库中每个应用版本的 strings.xml
文件,将与 admob_app_id
键关联的占位符值替换为您的特定于版本的应用 ID。重复此过程,并替换 project.pbxproj
文件中每个 ADMOB_APP_ID
键的占位符值。
移除广告
您可能想要从您的应用中移除广告。本节讨论如何移除各种广告类型及其依赖项。
移除横幅广告
默认情况下,static_news_data.dart
文件中的横幅广告会显示。为确保您的应用不会显示 BannerAds
,请不要将 AdBlocks
插入到从您的数据源返回的数据中。
移除插页式广告
默认情况下,进入文章会显示插页式广告。要完全移除插页式广告,请从 _ArticleViewState
的 initState
方法中删除以下行 (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';