[app_open ad] Critical : Disruptive Ads - PlayStore rejection

524 views
Skip to first unread message

E A

unread,
Dec 19, 2023, 3:41:13 PM12/19/23
to Google Mobile Ads SDK Developers
Hello,

https://github.com/googleads/googleads-mobile-flutter/issues/979#issuecomment-1863432701

The playstore seems to reject my app because of Disruptive ad. I'm using the flutter googleads-mobile-flutter and well follow the guidelines. 

I've found that the app_open ad itself didn't respect the play store guideline because of Android Back button.

Please, checkout the issue above which contain all the data that you need including video, sample project and steps.

Mobile Ads SDK Forum Advisor

unread,
Dec 20, 2023, 12:51:48 AM12/20/23
to enguerran...@gmail.com, google-adm...@googlegroups.com

Hi,

Thank you for contacting the Mobile Ads SDK support team.

By reviewing your concern, I understand that you are facing an issue with the back button in the App Open Ad.

Please note that the attachment video, sample project and steps are missing. The issue is from the Android platform but not from Google Mobile Ads SDK as stated in the Github forum

For us to investigate your issue, kindly provide us with the below information for further investigation privately:

  • app ID 
  • ad unit ID
  • SDK Version being used
  • Steps to reproduce the issue
  • Video recording of the issue
  • Sample project reproducing the issue.

You can provide the following details via reply privately to the author option or directly provide it to the link below. 

If the file(s) you are looking to share are less than 25mb in total you can attach them to this case on your next reply. If you are having trouble attaching your file to this case or if your file(s) are larger than 25mb, you can share your files with me by performing the following steps:

1. Navigate to

https://docs.google.com/forms/d/e/1FAIpQLSfkAiXMeYP-fw1W3Z-tT9uwmATEKO5X6S-th0gR2ezdKaaqfg/viewform?usp=pp_url&entry.400550049=Mobile+Ads+SDK&entry.460850823=5004Q00002r2jcMQAQ&entry.80707362=00216073

2. Fill out all fields, and attach your file(s).

3. Please reply back on this thread when you have uploaded your file(s). Please do not share this link.

This message is in relation to case "ref:!00D1U01174p.!5004Q02r2jcM:ref"

Thanks,
 
Google Logo Mobile Ads SDK Team


E A

unread,
Dec 20, 2023, 1:24:35 AM12/20/23
to Google Mobile Ads SDK Developers
Hello 

"Please note that the attachment video, sample project and steps are missing."

As I mention in the post, all data like video, reproducible project and steps are present here :

Mobile Ads SDK Forum Advisor

unread,
Dec 20, 2023, 3:12:14 AM12/20/23
to enguerran...@gmail.com, google-adm...@googlegroups.com

Hi,

Thank you for providing the requested information

I will check with our team regarding your query and one of my team members will reach out to you once we have an update on this. Meanwhile, your patience is highly appreciated. 

Mobile Ads SDK Forum Advisor

unread,
Dec 26, 2023, 12:46:48 AM12/26/23
to enguerran...@gmail.com, google-adm...@googlegroups.com
@EA

Thank you for creating a thread in the Developers Forum. I have created an internal ticket and escalated it to the Android engineering team for further debugging. I will respond here as soon as I have an update from them. 

Thanks,
Justin

ref:!00D1U01174p.!5004Q02r2jcM:ref

Mobile Ads SDK Forum Advisor

unread,
Jan 5, 2024, 12:46:51 PM1/5/24
to enguerran...@gmail.com, google-adm...@googlegroups.com

Hello,

Thank you for your patience. The engineering team has followed up and they have reported that what you are experiencing is the intended behavior. There was recently a launch to disable the system back button on Android App Open ads. It appears the Google Play Store rejection was not because of this functionality.

Thanks,
Justin



ref:!00D1U01174p.!5004Q02r2jcM:ref

E A

unread,
Jan 5, 2024, 3:28:18 PM1/5/24
to Google Mobile Ads SDK Developers
Hi,

I didn't understand so why playstore reject my app....

The flow of my open app ad : 
I launch the app -> native splash screen is displayed by the OS -> (while splash screen is displayed, I maintain it and wait until open ad is ready) -> once open ad is ready, I display it -> once user close it, i close the splash screen and show the app.

E A

unread,
Jan 7, 2024, 12:47:04 PM1/7/24
to Google Mobile Ads SDK Developers
Hello,

PlayStore still reject our app. We insist that it well seems to be because of the back button. We only display Ad during app launch, see image linked.
Capture d’écran 2024-01-07 184522.jpg

Mobile Ads SDK Forum Advisor

unread,
Jan 8, 2024, 10:52:17 AM1/8/24
to enguerran...@gmail.com, google-adm...@googlegroups.com
Hello,

For experimentation's sake it might be worth removing the app open ad and try submitting the project. If the ad is removed and your app is accepted then it can be deduced the source of the rejection came from the ad. That being said, this feature is live and we haven't heard of this issue happening so it's also possible the implementation/trigger of the ad may be set up incorrectly. It also worth noting we also do not control Google Play Store's acceptance criteria.

For their message, "Ads that are triggered by the back button or other features explicitly designed for exiting the app". We recommend that no ad should be triggered by the back button. Also please check your app lifecycle and see if you are executing any code when the app is either being backgrounded or exited. 

E A

unread,
Jan 8, 2024, 1:51:03 PM1/8/24
to Google Mobile Ads SDK Developers
Our latest deployment is just the implementation of the google open ad. So yes, it's 100% linked to it.

Bellow source code of how we display the open ad. Do you see any potential issue :'( ?

Inside my main.dart (before the runApp) : 

```dart
    final WidgetsBinding binding = WidgetsFlutterBinding.ensureInitialized();
    FlutterNativeSplash.preserve(widgetsBinding: binding);
    ...
    await MobileAds.instance.initialize();
    await MobileAds.instance.setAppMuted(true);
    final AppOpenInterstitial openAd = AppOpenInterstitial();
    openAd.loadAd(
      onFailed: () => FlutterNativeSplash.remove(),
      onLoaded: () {
        openAd.showOpenAppInterstitialAd(
          onClose: () => FlutterNativeSplash.remove(),
        );
      },
    );
    ...
    runApp(App());
```

AppOpenInterstitial code : 

```dart
import 'package:factory/commons/ads/ad_manager.dart';
import 'package:factory/commons/crashlytics/crashlytics.dart';
import 'package:flutter/foundation.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

const int kMaxFailedLoadAttempts = 3;

/// AdManager just contain the ad id for Android and iOS.
/// DOC https://github.com/googleads/googleads-mobile-flutter/blob/main/samples/admob/app_open_example/lib/app_open_ad_manager.dart
class AppOpenInterstitial {
  /// Maximum duration allowed between loading and showing the ad.
  final Duration maxCacheDuration = const Duration(hours: 4);

  /// Keep track of load time so we don't show an expired ad.
  DateTime? _appOpenLoadTime;

  AppOpenAd? _appOpenAd;
  bool _isShowingAd = false;

  Future<void> loadAd({
    final void Function()? onLoaded,
    final void Function()? onFailed,
  }) async {
    if (!AdManager.enabled || AdManager.openAppInterstitialAdUnitId == null) {
      onFailed?.call();
      return;
    }
    try {
      await AppOpenAd.load(
        adUnitId: AdManager.openAppInterstitialAdUnitId!,
        orientation: AppOpenAd.orientationPortrait,
        request: const AdRequest(),
        adLoadCallback: AppOpenAdLoadCallback(
          onAdLoaded: (final AppOpenAd ad) {
            debugPrint('$ad loaded');
            _appOpenLoadTime = DateTime.now();
            _appOpenAd = ad;
            onLoaded?.call();
          },
          onAdFailedToLoad: (final LoadAdError error) {
            debugPrint('AppOpenAd failed to load: $error');
            onFailed?.call();
          },
        ),
      );
    } catch (err, stack) {
      onFailed?.call();
      debugPrintStack(label: err.toString(), stackTrace: stack);
      AppCrashlytics.reportCrash(error: err, stack: stack);
    }
  }

  /// Whether an ad is available to be shown.
  bool get isAdAvailable {
    return _appOpenAd != null;
  }

  /// 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.
  Future<void> showOpenAppInterstitialAd({
    final void Function()? onClose,
  }) async {
    if (!isAdAvailable) {
      debugPrint('Tried to show ad before available.');
      loadAd();
      onClose?.call();
      return;
    }
    if (_isShowingAd) {
      debugPrint('Tried to show ad while already showing an ad.');
      onClose?.call();
      return;
    }
    if (DateTime.now().subtract(maxCacheDuration).isAfter(_appOpenLoadTime!)) {
      debugPrint('Maximum cache duration exceeded. Loading another ad.');
      _appOpenAd!.dispose();
      _appOpenAd = null;
      loadAd();
      onClose?.call();
      return;
    }
    // Set the fullScreenContentCallback and show the ad.
    _appOpenAd!.fullScreenContentCallback =
        FullScreenContentCallback<AppOpenAd>(
      onAdShowedFullScreenContent: (final AppOpenAd ad) {
        _isShowingAd = true;
        debugPrint('$ad onAdShowedFullScreenContent');
      },
      onAdFailedToShowFullScreenContent:
          (final AppOpenAd ad, final AdError error) {
        debugPrint('$ad onAdFailedToShowFullScreenContent: $error');
        _isShowingAd = false;
        ad.dispose();
        _appOpenAd = null;
        onClose?.call();
      },
      onAdDismissedFullScreenContent: (final AppOpenAd ad) {
        debugPrint('$ad onAdDismissedFullScreenContent');
        _isShowingAd = false;
        ad.dispose();
        _appOpenAd = null;
        loadAd();
        onClose?.call();
      },
    );
    debugPrint("Show OpenApp Ad !");
    try {
      await _appOpenAd!.show();
    } catch (err, stack) {
      onClose?.call();
      debugPrintStack(label: err.toString(), stackTrace: stack);
      AppCrashlytics.reportCrash(error: err, stack: stack);
    }
  }
}
```

Mobile Ads SDK Forum Advisor

unread,
Jan 8, 2024, 2:29:52 PM1/8/24
to enguerran...@gmail.com, google-adm...@googlegroups.com
Hello,

It looks like you are attempting to show an app open ad as soon as it is loaded. I would take a look at our working app open ad example, specifically the app_lifecycle_reactor and how it attempts to load/show an ad when the app is foregrounded.  That is the only time an app open ad is attempted to show. 

E A

unread,
Jan 8, 2024, 3:37:10 PM1/8/24
to Google Mobile Ads SDK Developers
Hi,

Not really. We attempt to show an app open ad after the first app launch only. Our app keep the splash screen visible until the app is ready. During this period, we display an open app ad.
It works well.

Mobile Ads SDK Forum Advisor

unread,
Jan 9, 2024, 10:23:28 AM1/9/24
to enguerran...@gmail.com, google-adm...@googlegroups.com
Hello,

Glad to hear it works well. Feel free to experiment with the timing of the app open ad to see if that may resolve any Google Play Store issues. We do not control the criteria for app rejections as we can only recommend the best practices. 

E A

unread,
Jan 20, 2024, 8:32:06 AM1/20/24
to Google Mobile Ads SDK Developers
Hello,

I really affirm that Google Mobile Ads SDK have an issue. "There was recently a launch to disable the system back button on Android App Open ads. It appears the Google Play Store rejection was not because of this functionality.". The play store team affirm that this is the issue.

User should be able to use device back button while ad are displayed.

Mobile Ads SDK Forum Advisor

unread,
Jan 22, 2024, 11:21:19 AM1/22/24
to enguerran...@gmail.com, google-adm...@googlegroups.com
Hello,

Can you share the message that you received from the Google Play Store that addresses the Google Mobile Ads SDK update to the back button for app open ads?

E A

unread,
Jan 23, 2024, 4:15:02 PM1/23/24
to Google Mobile Ads SDK Developers
Hi,

Here is the message. I didn't launch ad on back button. Ad are launch during android native splash screen is displayed.

In my Flutter main, before the runApp I initialise the MobileAds.instance and directly after, I load an ad and display it as soon as possible. I didn't launch ads base on user back button action. 
So I think, PlayStore test team launch the app and then press the back button. As the Mobile Ads SDK prevent back button during Ads, it produce this issue.
Capture d’écran 2024-01-23 215706.jpg

Mobile Ads SDK Forum Advisor

unread,
Jan 23, 2024, 5:54:19 PM1/23/24
to enguerran...@gmail.com, google-adm...@googlegroups.com
Hello,

The back button disabled for app open ads is done by design. That is the expected behavior. Once again, please see our App open flutter example (previously linked in this thread) for a sample implementation that we recommend you follow. If you can appeal to the PlayStore and get them to provide a more specific message that would be helpful for us. In your appeal, let them know you've been notified that the back button being disabled for app open ads is a feature of the Google Mobile Ads SDK for Android.

E A

unread,
Feb 6, 2024, 3:58:54 PM2/6/24
to Google Mobile Ads SDK Developers
Hello,

Despite multiple emails to the PlayStore team, they refuse to answer our questions and persist to only respond to us with the following email (see screenshot).
We didn't know what to do... We are in the middle of two Google Teams and the communication didn't work...

Do you have any hint to help us contacting a higher support level ?
Capture d’écran 2024-02-06 215606.jpg

Mobile Ads SDK Forum Advisor

unread,
Feb 7, 2024, 11:27:39 AM2/7/24
to enguerran...@gmail.com, google-adm...@googlegroups.com
Hello,

We do provide other outlets for support, please see Support options Admob offers as a next step. Keep in mind the Play Store, not AdMob is responsible for any decisions are made on app rejections/approvals. Based on their response, it seems like the Developer Program Policies will be helpful as well. Please remember full-screen ads have specific rules about how/when to present them. 
Reply all
Reply to author
Forward
0 new messages