Flutter google mobile ads 仅在 IOS 上显示测试广告

Posted

技术标签:

【中文标题】Flutter google mobile ads 仅在 IOS 上显示测试广告【英文标题】:Flutter google mobile ads only shows test ads on IOS 【发布时间】:2022-01-12 06:11:16 【问题描述】:

我有以下广告资源库

import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:my_app/data/api/constants.dart';

class AdMobRepository 
  late String liveBannerAdId;
  late String liveInterstitualAdId;
  late String liveRewardedAdId;

  AdMobRepository() 
    if (Platform.isandroid) 
      liveBannerAdId = Constants.androidBannedAdId;
      liveInterstitualAdId = Constants.androidInterstitualAdId;
      liveRewardedAdId = Constants.androidRewardedAdId;
     else if (Platform.isios) 
      liveBannerAdId = Constants.iosBannerAdId;
      liveInterstitualAdId = Constants.iosInterstitualAdId;
      liveRewardedAdId = Constants.iosRewardedAdId;
     else 
      liveBannerAdId = "";
      liveInterstitualAdId = "";
      liveRewardedAdId = "";
    
  

  BannerAd getBannerAd(
    required AdSize size,
    void Function(Ad, LoadAdError)? onFailedLoad,
    void Function(Ad)? onLoad,
    void Function(Ad)? onAdOpened,
    void Function(Ad)? onAdImpression,
  ) 
    return BannerAd(
      adUnitId: kReleaseMode ? liveBannerAdId : BannerAd.testAdUnitId,
      request: AdRequest(),
      size: size,
      listener: BannerAdListener(
        onAdFailedToLoad: onFailedLoad ?? onFailedLoadFallback,
        onAdLoaded: onLoad,
        onAdImpression: onAdImpression,
        onAdOpened: onAdOpened,
      ),
    );
  

  void onFailedLoadFallback(Ad ad, LoadAdError error) 
    ad.dispose();
  

  void getInterstitualAd(required void Function(LoadAdError) onFailedLoad, void Function(InterstitialAd)? onLoad) 
    InterstitialAd.load(
      adUnitId: kReleaseMode ? liveInterstitualAdId : InterstitialAd.testAdUnitId,
      request: AdRequest(),
      adLoadCallback: InterstitialAdLoadCallback(
        onAdLoaded: onLoad ?? onInterstitialAdLoadedFallback,
        onAdFailedToLoad: onFailedLoad,
      ),
    );
  

  void onInterstitialAdLoadedFallback(InterstitialAd ad) 
    ad.fullScreenContentCallback = FullScreenContentCallback(
        onAdDismissedFullScreenContent: (ad) => ad.dispose(), onAdFailedToShowFullScreenContent: (ad, error) => ad.dispose());
  

  void getRewardAd(required String userId, required void Function(LoadAdError) onFailedLoad, void Function(RewardedAd)? onLoad) 
    RewardedAd.load(
      adUnitId: kReleaseMode ? liveRewardedAdId : RewardedAd.testAdUnitId,
      request: AdRequest(),
      rewardedAdLoadCallback: RewardedAdLoadCallback(
        onAdLoaded: onLoad ?? onRewardedAdLoadedFallback,
        onAdFailedToLoad: onFailedLoad,
      ),
      serverSideVerificationOptions: ServerSideVerificationOptions(userId: userId),
    );
  

  void onRewardedAdLoadedFallback(RewardedAd ad) 
    ad.fullScreenContentCallback = FullScreenContentCallback(
        onAdDismissedFullScreenContent: (ad) => ad.dispose(), onAdFailedToShowFullScreenContent: (ad, error) => ad.dispose());
  

我有以下横幅广告小部件

class MyBannerAd extends StatefulWidget 

  const MyBannerAd();

  @override
  _MyBannerAdState createState() => _MyBannerAdState();


class _MyBannerAdState extends State<MyBannerAd> 
  late AdSize adSize;
  late AdMobRepository adRepository;
  late AnalyticsRepository analyticsRepository;
  bool adLoaded = false;
  BannerAd? anchoredBanner;

  @override
  void initState() 
    super.initState();
    adRepository = context.read<AdMobRepository>();
    analyticsRepository = context.read<AnalyticsRepository>();

    if (SizerUtil.deviceType != DeviceType.mobile && SizerUtil.orientation == Orientation.portrait) 
      adSize = AdSize.leaderboard;
     else 
      adSize = AdSize.largeBanner;
    

    final bannerAd = adRepository.getBannerAd(
      size: adSize,
      onFailedLoad: (ad, error) 
        print('banner ad failed to load: $error');
        ad.dispose();
      ,
      onLoad: (ad) 
        setState(() 
          adLoaded = true;
          anchoredBanner = ad as BannerAd?;
        );
      ,
      onAdImpression: (_) 
        analyticsRepository.sendBannerAdShownEvent();
      ,
      onAdOpened: (_) 
        analyticsRepository.sendBannerAdClickEvent();
      ,
    );

    bannerAd.load();
  

  @override
  void dispose() 
    super.dispose();
    anchoredBanner?.dispose();
  

  @override
  Widget build(BuildContext context) 
    return BlocBuilder<SubscriptionBloc, SubscriptionState>(
      builder: (context, state) 
        final isLoaded = !adLoaded;

        if (isLoaded || state.hasSubscribed || anchoredBanner == null) return SizedBox.shrink();

        return Container(
          color: Colors.transparent,
          width: anchoredBanner!.size.width.toDouble(),
          height: anchoredBanner!.size.height.toDouble(),
          child: Center(
            child: Container(
              color: Colors.white,
              child: AdWidget(
                ad: anchoredBanner!,
              ),
            ),
          ),
        );
      ,
    );
  

但在 IOS 上它总是显示测试广告。当应用程序使用 flutter build ios --release 使用颤振发布模式构建时,怎么会这样?该应用目前正在审核中,我认为这些广告在应用商店上线时将不再是测试广告。

但 Apple 向我们发送了以下消息

我们注意到您的应用或其屏幕截图包含测试 广告。包含以下功能的应用程序或元数据项 用于测试或演示目的不适合该应用程序 商店。

接下来的步骤

要解决此问题,请修改您的应用以完成、删除或 完全配置任何部分实现的功能。请确保您的 屏幕截图不包括任何演示、测试或其他图像 内容不完整

那么我该如何摆脱测试广告呢?我错过了一些 XCode 设置吗?

我正在使用

flutter: 2.5.3
google_mobile_ads: ^0.13.4

我还将 GADApplicationIdentifier 添加到我的 info.plist 中

<key>GADApplicationIdentifier</key>
<string>here I have the app Id</string>

我正在使用 testflight 构建的真实设备上进行测试

旁注:

在 admob 设置中我添加了以下测试 IDFA

00000000-0000-0000-0000-000000000000

这似乎适用于所有 IOS 设备上的测试广告。

【问题讨论】:

您是否在 AdMob 控制台测试设备设置中设置了 00000000-0000-0000-0000-000000000000 值? 是的,我在 adMob > 设置 > 测试设备下添加了它 【参考方案1】:

原来我需要从 admob 的测试设置中删除 00000000-0000-0000-0000-000000000000。之后我不再收到测试广告,但我现在确实收到了发布版本中的广告。

【讨论】:

【参考方案2】:

您无需更改任何代码。

后续步骤

要解决此问题,请修改您的应用以完成、删除或 完全配置任何部分实现的功能。 请确保 您的屏幕截图不包含任何演示、测试或其他图像 内容不完整

要解决上述拒绝,您只需从屏幕截图中删除横幅广告,然后再次提交以供批准。

【讨论】:

以上是关于Flutter google mobile ads 仅在 IOS 上显示测试广告的主要内容,如果未能解决你的问题,请参考以下文章

Flutter google_mobile_ads 未显示广告 ID

使用 google_mobile_ads 加载横幅时 Flutter App 崩溃

无法在 Flutter 中集成 Google 移动广告

如何解决颤振包 google_mobile_ads 中的此错误

iOS - pod 'Google-Mobile-Ads-SDK' 和 pod 'Firebase/AdMob' 有啥区别

使用 Admob 处理多个原生广告