Google Consent Mode v2

Google Analytics offers Consent Mode v2 to adjust how your SDK behaves based on the consent status of your users. You can indicate whether consent has been granted for Analytics and Ads cookies. To implement Consent Mode v2 for apps, use the Google Analytics for Firebase SDK to set default consent values and use the setConsent method to update these values programmatically, based on in-app user consent. To learn more, see Consent Mode.
Google Consent Mode allows you to configure the status for the following parameters or Consent Types:
  • ANALYTICS_STORAGE
  • AD_STORAGE
  • AD_USER_DATA
  • AD_PERSONALIZATION

Initial setup

By default, no Consent Type values are set. Follow the instructions below to change the default consent state for your app.

Analytics storage

Android
iOS
To disable Analytics storage, set the value of google_analytics_default_allow_analytics_storage to false in the application tag of your app's AndroidManifest.xml file. For example:
<meta-data android:name="google_analytics_default_allow_analytics_storage" android:value="false" />
To disable Analytics storage, set the value of GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE to NO in your app's Info.plist file:
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE</key>
<false/>

Ad storage

Android
iOS
To disable Ad storage, set the value of google_analytics_default_allow_ad_storage to false in the application tag of your app's AndroidManifest.xml file. For example:
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="false" />
To disable Ad storage, set the value of GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE to NO in your app's Info.plist file:
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE</key>
<false/>

Ad user data

Android
iOS
To disable Ad user data, set the value of google_analytics_default_allow_ad_user_data to false in the application tag of your app's AndroidManifest.xml file. For example:
<meta-data android:name="google_analytics_default_allow_ad_user_data" android:value="false" />
To disable Ad user data, set the value of GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA to NO in your app's Info.plist file:
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA</key>
<false/>

Ad personalization

Android
iOS
To disable Ad personalization, set the value of google_analytics_default_allow_ad_personalization_signals to false in the application tag of your app's AndroidManifest.xml file. For example:
<meta-data android:name="google_analytics_default_allow_ad_personalization_signals" android:value="false" />
To disable Ad personalization, set the value of GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS to NO in your app's Info.plist file:
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS</key>
<false/>
To update the Consent Type values after an app has launched, call the setConsent method of the Analytics library.
The value set by the setConsent method persists across app executions and overrides the default values configured through the Info.plist and AndroidManifest.xml files . The value remains in that state until setConsent is called again, even if a user closes and reopens the app. Calling setConsent to modify Ad storage does not change the state of Analytics storage or any other consent mode value.
The following example shows the setConsent method updating values for Analytics, Ad storage, Ad user data and Ad personalization to granted or denied:
Java
Kotlin
Swift
Obj-C
// Set consent types.
Map<ConsentType, ConsentSetting> consentMap = new EnumMap<>(ConsentType.class);
consentMap.put(ConsentType.ANALYTICS_STORAGE, ConsentStatus.GRANTED|ConsentStatus.DENIED);
consentMap.put(ConsentType.AD_STORAGE, ConsentStatus.GRANTED|ConsentStatus.DENIED);
consentMap.put(ConsentType.AD_USER_DATA, ConsentStatus.GRANTED|ConsentStatus.DENIED);
consentMap.put(ConsentType.AD_PERSONALIZATION, ConsentStatus.GRANTED|ConsentStatus.DENIED);
mFirebaseAnalytics.setConsent(consentMap);
Firebase.analytics.setConsent {
analyticsStorage = ConsentStatus.GRANTED|ConsentStatus.DENIED
adStorage = ConsentStatus.GRANTED|ConsentStatus.DENIED
adUserData = ConsentStatus.GRANTED|ConsentStatus.DENIED
adPersonalization = ConsentStatus.GRANTED|ConsentStatus.DENIED
}
Analytics.setConsent([
.analyticsStorage: .granted|.denied,
.adStorage: .granted|.denied,
.adUserData: .granted|.denied,
.adPersonalization: .granted|.denied,
])
[FIRAnalytics setConsent:@{
FIRConsentTypeAnalyticsStorage : FIRConsentStatusGranted|FIRConsentStatusDenied,
FIRConsentTypeAdStorage : FIRConsentStatusGranted|FIRConsentStatusDenied,
FIRConsentTypeAdUserData : FIRConsentStatusGranted|FIRConsentStatusDenied,
FIRConsentTypeAdPersonalization : FIRConsentStatusGranted|FIRConsentStatusDenied,
}];
To update the Consent Type values after a user has provided their consent choices, use the setConsent method of the Analytics library as shown in the examples below.
The status of Google Vendor with ID google will be used to get the value for:
  • AD_STORAGE
  • AD_USER_DATA
  • AD_PERSONALIZATION
The status of Google Analytics Vendor with ID c:googleana-4TXnJigR will be used to get the value for:
  • ANALYTICS_STORAGE
The following examples show how to get the user status from the Didomi SDK and apply that status to Google Consent Mode.
Java
Kotlin
Swift
Obj-C
Didomi.getInstance().addEventListener(new EventListener() {
@Override
public void consentChanged(ConsentChangedEvent event) {
// The status of the user has changed
UserStatus userStatus = Didomi.getInstance().getUserStatus();
// Ids of enabled vendors
Set<String> enabledVendorIds = userStatus.getVendors().getGlobal().getEnabled();
// Search for Google vendors
ConsentStatus googleAnalyticsStatus = enabledVendorIds.contains("c:googleana-4TXnJigR") ? ConsentStatus.GRANTED : ConsentStatus.DENIED
ConsentStatus googleStatus = enabledVendorIds.contains("google") ? ConsentStatus.GRANTED : ConsentStatus.DENIED
// Set consent types
Map<ConsentType, ConsentSetting> consentMap = new EnumMap<>(ConsentType.class);
consentMap.put(ConsentType.ANALYTICS_STORAGE, googleAnalyticsStatus);
consentMap.put(ConsentType.AD_STORAGE, googleStatus);
consentMap.put(ConsentType.AD_USER_DATA, googleStatus);
consentMap.put(ConsentType.AD_PERSONALIZATION, googleStatus);
mFirebaseAnalytics.setConsent(consentMap);
}
})
Didomi.getInstance().addEventListener(object : EventListener() {
override fun consentChanged(event: ConsentChangedEvent) {
// The status of the user has changed
val userStatus = Didomi.getInstance().userStatus
// Ids of enabled vendors
val enabledVendorIds = userStatus.vendors.global.enabled
// Search for Google vendors
val googleAnalyticsStatus = if (enabledVendorIds.contains("c:googleana-4TXnJigR")) ConsentStatus.GRANTED else ConsentStatus.DENIED
val googleStatus = if (enabledVendorIds.contains("google")) ConsentStatus.GRANTED else ConsentStatus.DENIED
// Set consent types
Firebase.analytics.setConsent {
analyticsStorage = googleAnalyticsStatus
adStorage = googleStatus
adUserData = googleStatus
adPersonalization = googleStatus
}
}
})
let didomiEventListener = EventListener()
didomiEventListener.onConsentChanged = { event in
// The status of the user has changed
let userStatus = Didomi.shared.getUserStatus()
// Ids of enabled vendors
let enabledVendorIDs = userStatus.vendors.global.enabled
// Search for Google vendors
let googleAnalyticsStatus = enabledVendorIDs.contains("c:googleana-4TXnJigR") ? .granted : .denied
let googleStatus = enabledVendorIDs.contains("google") ? .granted : .denied
// Set consent types
Analytics.setConsent([
.analyticsStorage: googleAnalyticsStatus,
.adStorage: googleStatus,
.adUserData: googleStatus,
.adPersonalization: googleStatus
])
}
DDMEventListener *didomiEventListener = [[DDMEventListener alloc] init];
[didomiEventListener setOnConsentChanged:^(enum DDMEventType event) {
// The status of the user has changed
Didomi *didomi = [Didomi shared];
DDMUserStatus *userStatus = [didomi getUserStatus];
// Ids of enabled vendors
NSSet *enabledVendorIDs = [[[userStatus vendors] global] enabled];
// Search for Google vendors
FIRConsentType googleAnalyticsStatus = [enabledVendorIDs containsObject:@"c:googleana-4TXnJigR"] ? FIRConsentStatusGranted : FIRConsentStatusDenied;
FIRConsentType googleStatus = [enabledVendorIDs containsObject:@"google"] ? FIRConsentStatusGranted : FIRConsentStatusDenied;
// Set consent types
[FIRAnalytics setConsent:@{
FIRConsentTypeAnalyticsStorage : googleAnalyticsStatus,
FIRConsentTypeAdStorage : googleStatus,
FIRConsentTypeAdUserData : googleStatus,
FIRConsentTypeAdPersonalization : googleStatus
}];
}];