How to change your project for Google Families Policy

This will mainly focus on Ads, see this article for other aspects of your app (i.e, content and data practices) Designing Apps for Children and Families - Play Console Help

I will try to update this as SDK and networks get updated. First, there has been some mix-up(for me a least) between Google Families Policy and the new Google Play Advertising ID permission. As of writing, this Solar2d Simulator targets Android 11 (API Level 30), and this permission is not needed (yet)

Who needs to change their apps?

If your app includes kids (people age 13 and below) as a target for Google Play

What do I need to do to show ads to people aged 13 and below?

If the user of the app is 13 and below or you don’t know the age, you have to mark that with the ad provider. Also, you need to use a supported network

Currently (Known) Supported networks of Google Families Ads (Solar2d)

Admob Solar2D Documentation — Plugins | AdMob

See Solar2D Documentation — Plugins | AdMob | load params childSafe and designedForFamilies

Applovin Max Solar2D Documentation — Plugins | applovinMax

See Solar2D Documentation — Plugins | applovinMax | setIsAgeRestrictedUser and Solar2D Documentation — Plugins | applovinMax | setHasUserConsent.

Kidoz Solar2D Documentation — Plugins | KIDOZ

Unity Ads(v4) Solar2D Documentation — Plugins | unityads-v4

See Solar2D Documentation — Plugins | unityads-v4 | setPersonalizedAds and Solar2D Documentation — Plugins | unityads-v4 | setPrivacyMode.

External: Iron Source IronSource Plugin

Read More Here:Ads and Monetization - Play Console Help

7 Likes

Does this mean that if just I change my age age rating in google play to 13+ I don’t have to worry about this? Seems easier to do.

Yes, setting your Google Play app age to above 13 prevents your app from this policy

I’d be careful about that- my experience is that Google bases their enforcement on the ESRB rating you receive by taking the “Content ratings” survey, not the “Target Age” you set in “Target audience and content.”
I spent a very frustrating week with one of my apps removed from the Play Store, and, as a result, most of my ad providers not serving ads during that period because of an ad for the “Wish” shopping app featuring a pair of running shoes. I formally contested the suspension with the argument that my app was listed in the Play Store as being for ages 18+, and Google countered with “it has an ESRB rating of E, so it can’t have ads rated Teen.”
To make the problem go away, I eventually resorted to retaking the content rating survey and saying that my app featured simulated gambling, which finally got its ESRB up to Teen. (Of course, now my app is unavailable in Korea. :rofl:)

Our kids apps don’t include any ad networks, but we just got this notice from Google:

We’ve identified that your app or an SDK in your app transmits device identifier(s) from children or users of unknown age that do not comply with our Families Policy.
We’ve identified the transmission of the following device identifier(s) Android Advertising ID

What would be using the Android Advertising ID without us knowing? How do we fix this? Below is our build settings

settings = 
{
    splashScreen = 
    {
        enable = false
    },
    orientation =
    {
		default = "landscapeRight",
		supported =
                {
                        "landscapeLeft", "landscapeRight",
                },
    },
	
	android =
    {
		largeHeap = true,	
		versionCode = "80",
		versionName = "8.0",
		minSdkVersion = "16",
                usesPermissions =
                {
                    "com.android.vending.BILLING",
        			"android.permission.INTERNET"
                },
		useGoogleServicesJson = true,
		facebookAppId = "XXXXXXXXXXXXX",
		
    },	
	
	osx = {
		plist={
			DeveloperURL="http://www.rosimosi.com/contact",
		},
	},
	

	iphone =
	{
		xcassets = { 
		    filename = "Images.xcassets",
		    ["alternate-app-icon"] = "AppIcon2",
		},
		entitlements = {
		    ["com.apple.developer.applesignin"] = {"Default"},
		},
		plist =
		{
			UIUserInterfaceStyle = "Light",
			CFBundleURLTypes = {
                {
                    CFBundleURLSchemes = {
						"fbXXXXXXXXXsuffix",					
						"XXXX",
						"com.googleusercontent.apps.XXXXXXXXXXXX"
					}
                }
            },				
			CFBundleDisplayName = "Barnyard",
			UIPrerenderedIcon = true,
            UIAppFonts = 
            {
                    "bdcartoonshout.ttf",
					"LuckiestGuy.ttf",
					"PoetsenOne-Regular.ttf",
					"Nunito-Black.ttf",
					"Nunito-ExtraBold.ttf",
            },	        
			UILaunchStoryboardName = "LaunchScreen",		
			
            MinimumOSVersion = "8.0",		
		},
	},
	
	window = 
	{
		defaultMode = "normal",
		defaultViewWidth = 960,
		defaultViewHeight = 600,
		resizable = false,
		enableMaximizeButton = true,
		enableCloseButton = true,
		titleText = {
            default = "Barnyard Games For Kids",		
		}
	},	
	
    plugins =
    {
		
        -- key is the name passed to Lua's 'require()'
        ["plugin.amazon.iap"] =
        {
            -- required
            publisherId = "com.coronalabs",
            supportedPlatforms = { ["android-kindle"]=true }
        },
		["plugin.reviewPopUp"] =
		{
			publisherId = "tech.scotth",
			marketplaceId = "XXXXXX"
		},		
        ["plugin.google.iap.billing"] =
        {
            publisherId = "com.coronalabs",
            supportedPlatforms = { android=true }
        },	
        ["plugin.texturePackerHelpers"] = { publisherId = "com.roaminggamer" },				
        ["plugin.apple.iap"] =
        {
            publisherId = "com.coronalabs",
			supportedPlatforms = { iphone=true }
        },			
        ["plugin.utf8"] =
        {
            publisherId = "com.coronalabs"
        },				
		["plugin.googleSignIn"] =
		{
			publisherId="tech.scotth",
			marketplaceId = "XXXXX"
		},		
        ["plugin.facebook.v4a"] =
        {
            publisherId = "com.coronalabs",
			supportedPlatforms = {			
				android = true
			},			
        },		
		["plugin.appleSignIn"] =
		{
			publisherId="tech.scotth",
			marketplaceId = "XXXXXX"
		},	
		["plugin.zip"] =
        {
            publisherId = "com.coronalabs"
        },		
    },	
}

I think Facebook tries to collects ad ID, will double check though

Thanks Scott. And if it does, is there a way to disable that? We use Facebook Sign-in, so really don’t want to remove it from our apps.

Looks like Facebook tries to collect Ad Id, adding this to you build.settings should disable that

android =
	{
			applicationChildElements =
        {
            [[
						<meta-data android:name="com.facebook.sdk.AdvertiserIDCollectionEnabled"
					        android:value="false"/>
            ]],
        },
	
	},

Thanks Scott! I’ll submit a new build and report back if it fixes the issue. UPDATE: Yep, that did it. Google just approved. Thanks for the help!

Hi folks,

I’ve also been flagged (given 90 days to stop transmitting the Advertising ID) and done some research. In short it seems the AdMob SDK needs updating to 20.6 (from 20.2) and the parameter max_ad_content_rating exposed in admob.load()

Solar2d currently supports “child-directed treatment” in the AdMob plugin by setting the “childSafe” and “designedForFamilies” parameters when loading ads, but as I understand it the app will still a) transmit the advertising ID given the current SDK and b) does not prevent mediation via AdMob to serve non-compliant ads from other networks since we cannot control max_ad_content_rating. So just setting childSafe" and “designedForFamilies” is not enough.

This is where AdMob says that you need to update the SDK to 20.6 “to ensure that the advertising ID is not transmitted when an ad request is tagged for child-directed treatment” (regardless of the childSafe and designedForFamilies flags).

And reading further down on the, regarding mediation via AdMob: “For your app to receive Designed for Families policy-compliant ads from third-party ad networks, you will need to call setTagForChildDirectedTreatment(true) and set max_ad_content_rating to G for every ad request”

Thanks,

Per

Will get this updated, thanks for letting me know

Thanks Scott. A bit more info on the topic, via Vlad:

The maxAdContentRating is already supported, and the docs updated.

AdMob 20.6 requires targeting Android API level at least 31, which Solar2D doesn’t at the moment.

The GitHub issue for increasing the targetSDKVersion is [Android] Target SDK Version · Issue #376 · coronalabs/corona · GitHub

Well Google is back saying the same apps are still transmitting AAID even after my Facebook fix above. Their support is absolutely terrible, with a person saying that the app is now good but then their automated system still picking it up. Any more ideas short of removing Facebook Sign-In from our apps?

I’ve had this happen in the past for a different issue, but it turned out to be that they continue checking all test tracks. So if you pushed an update to production, but still have the older version in the other test tracks, it will flag you because of the test track version. I had to replace all the test track versions as well before it stopped flagging me.

1 Like

Thanks for the recommendations, but we have inactivated all other app bundles and tracks.

Scott, do you have any more ideas on how to disable the AAID without just removing the Facebook plug-in?

And also, does anyone know a way to see if the AAID is still being transmitted from the app? It’s slightly annoying that something is transmitting it, we dont know what it is, and that Google won’t tell us if the issue gets fixed with a new update. We’re just randomly trying things in the dark.

Update from my side: Build 3672 changes Android target SDK version to 32 and updates AdMob SDK to 20.6.0 (see GitHub issue).

I’ve published an update and will see if it gets rejected.