Руководство по Xamarin.Google.UserMessagingPlatform?
Я нахожусь на завершающей стадии настройки своего приложения для Android с помощью Xamarin / C#. Я внедрил Google Admob, но правила GDPR гласят, что для показа рекламы у меня должно быть уведомление о конфиденциальности. В документации Google говорится, что Consent SDK устарел и что я должен использовать новую платформу обмена сообщениями пользователей https://developers.google.com/admob/ump/android/quick-start.
Я загрузил пакет Nuget Xamarin.Google.UserMessagingPlatform (https://www.nuget.org/packages/Xamarin.Google.UserMessagingPlatform/1.0.0?_src=template) и импортировал библиотеки, но я изо всех сил пытаюсь перевести Google код моего проекта и поиск в Интернете, похоже, нигде не нашел ссылки на живую документацию с примерами реализации на C# / Xamarin. Сайт проекта в URL-адресе пакета 404s и исходный репозиторий ведут к общему репозиторию Xamarin, но я не смог найти там ссылку на UMP.
В частности, я не знаю, как обрабатывать следующее:
new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
@Override
public void onConsentInfoUpdateSuccess() {
// The consent information state was updated.
// You are now ready to check if a form is available.
}
},
new ConsentInformation.OnConsentInfoUpdateFailureListener() {
@Override
public void onConsentInfoUpdateFailure(FormError formError) {
// Handle the error.
}
Есть ли примеры реализации на C#?
2 ответа
Я написал это полное руководство в своем блоге, но вот оно:
Раздел AdMob
Перейдите в свой аккаунт AdMob .
Перейдите в раздел « Конфиденциальность и сообщения » и выберите значок телефона .
- Создайте новое сообщение и заполните необходимую информацию.
- Настройте свое сообщение:
- Добавьте политику конфиденциальности для своего приложения:
- Сохраните его и опубликуйте.
С# раздел
Загрузите Xamarin.Google.UserMessagingPlatform из NuGet.
Дважды проверьте, что в вашем AndroidManifest.xml есть две строки:
<activity android:name="com.google.android.gms.ads.AdActivity" android:value="AD_UNIT_ID" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="APP_ID" />
Вы можете получить AD_UNIT_ID и APP_ID в своем аккаунте AdMob:
- Загрузите/скопируйте код GDPR после этой строки (не делайте этого раньше!):
MobileAds.Initialize(this);
- Скопируйте и вставьте этот код:
private void SetGDPR()
{
Console.WriteLine("DEBUG: MainActivity.OnCreate: Starting consent management flow, via UserMessagingPlatform.");
try
{
#if DEBUG
var debugSettings = new Xamarin.Google.UserMesssagingPlatform.ConsentDebugSettings.Builder(this)
.SetDebugGeography(Xamarin.Google.UserMesssagingPlatform.ConsentDebugSettings
.DebugGeography
.DebugGeographyEea)
.AddTestDeviceHashedId(Android.Provider.Settings.Secure.GetString(this.ContentResolver,
Android.Provider.Settings.Secure.AndroidId))
.Build();
#endif
var requestParameters = new Xamarin.Google.UserMesssagingPlatform.ConsentRequestParameters
.Builder()
.SetTagForUnderAgeOfConsent(false)
#if DEBUG
.SetConsentDebugSettings(debugSettings)
#endif
.Build();
var consentInformation = Xamarin.Google.UserMesssagingPlatform.UserMessagingPlatform.GetConsentInformation(Context);
consentInformation.RequestConsentInfoUpdate(
Activity,
requestParameters,
new GoogleUMPConsentUpdateSuccessListener(
() =>
{
// The consent information state was updated.
// You are now ready to check if a form is available.
if (consentInformation.IsConsentFormAvailable)
{
Xamarin.Google.UserMesssagingPlatform.UserMessagingPlatform.LoadConsentForm(
Context,
new GoogleUMPFormLoadSuccessListener((Xamarin.Google.UserMesssagingPlatform.IConsentForm f) => {
googleUMPConsentForm = f;
googleUMPConsentInformation = consentInformation;
Console.WriteLine("DEBUG: MainActivity.OnCreate: Consent management flow: LoadConsentForm has loaded a form, which will be shown if necessary, once the ViewModel is ready.");
DisplayAdvertisingConsentFormIfNecessary();
}),
new GoogleUMPFormLoadFailureListener((Xamarin.Google.UserMesssagingPlatform.FormError e) => {
// Handle the error.
Console.WriteLine("ERROR: MainActivity.OnCreate: Consent management flow: failed in LoadConsentForm with error " + e.Message);
}));
}
else
{
Console.WriteLine("DEBUG: MainActivity.OnCreate: Consent management flow: RequestConsentInfoUpdate succeeded but no consent form was available.");
}
}),
new GoogleUMPConsentUpdateFailureListener(
(Xamarin.Google.UserMesssagingPlatform.FormError e) =>
{
// Handle the error.
Console.WriteLine("ERROR: MainActivity.OnCreate: Consent management flow: failed in RequestConsentInfoUpdate with error " + e.Message);
})
);
}
catch (Exception ex)
{
Console.WriteLine("ERROR: MainActivity.OnCreate: Exception thrown during consent management flow: ", ex);
}
}
private Xamarin.Google.UserMesssagingPlatform.IConsentForm googleUMPConsentForm = null;
private Xamarin.Google.UserMesssagingPlatform.IConsentInformation googleUMPConsentInformation = null;
public void DisplayAdvertisingConsentFormIfNecessary()
{
try
{
if (googleUMPConsentForm != null && googleUMPConsentInformation != null)
{
/* ConsentStatus:
Unknown = 0,
NotRequired = 1,
Required = 2,
Obtained = 3
*/
if (googleUMPConsentInformation.ConsentStatus == 2)
{
Console.WriteLine("DEBUG: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Consent form is being displayed.");
DisplayAdvertisingConsentForm();
}
else
{
Console.WriteLine("DEBUG: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Consent form is not being displayed because consent status is " + googleUMPConsentInformation.ConsentStatus.ToString());
}
}
else
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentFormIfNecessary: consent form or consent information missing.");
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Exception thrown: ", ex);
}
}
public void DisplayAdvertisingConsentForm()
{
try
{
if (googleUMPConsentForm != null && googleUMPConsentInformation != null)
{
Console.WriteLine("DEBUG: MainActivity.DisplayAdvertisingConsentForm: Consent form is being displayed.");
googleUMPConsentForm.Show(Activity, new GoogleUMPConsentFormDismissedListener(
(Xamarin.Google.UserMesssagingPlatform.FormError f) =>
{
if (googleUMPConsentInformation.ConsentStatus == 2) // required
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentForm: Consent was dismissed; showing it again because consent is still required.");
DisplayAdvertisingConsentForm();
}
}));
}
else
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentForm: consent form or consent information missing.");
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentForm: Exception thrown: ", ex);
}
}
public class GoogleUMPConsentFormDismissedListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.IConsentFormOnConsentFormDismissedListener
{
public GoogleUMPConsentFormDismissedListener(Action<Xamarin.Google.UserMesssagingPlatform.FormError> failureAction)
{
a = failureAction;
}
public void OnConsentFormDismissed(Xamarin.Google.UserMesssagingPlatform.FormError f)
{
a(f);
}
private Action<Xamarin.Google.UserMesssagingPlatform.FormError> a = null;
}
public class GoogleUMPConsentUpdateFailureListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.IConsentInformationOnConsentInfoUpdateFailureListener
{
public GoogleUMPConsentUpdateFailureListener(Action<Xamarin.Google.UserMesssagingPlatform.FormError> failureAction)
{
a = failureAction;
}
public void OnConsentInfoUpdateFailure(Xamarin.Google.UserMesssagingPlatform.FormError f)
{
a(f);
}
private Action<Xamarin.Google.UserMesssagingPlatform.FormError> a = null;
}
public class GoogleUMPConsentUpdateSuccessListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.IConsentInformationOnConsentInfoUpdateSuccessListener
{
public GoogleUMPConsentUpdateSuccessListener(Action successAction)
{
a = successAction;
}
public void OnConsentInfoUpdateSuccess()
{
a();
}
private Action a = null;
}
public class GoogleUMPFormLoadFailureListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.UserMessagingPlatform.IOnConsentFormLoadFailureListener
{
public GoogleUMPFormLoadFailureListener(Action<Xamarin.Google.UserMesssagingPlatform.FormError> failureAction)
{
a = failureAction;
}
public void OnConsentFormLoadFailure(Xamarin.Google.UserMesssagingPlatform.FormError e)
{
a(e);
}
private Action<Xamarin.Google.UserMesssagingPlatform.FormError> a = null;
}
public class GoogleUMPFormLoadSuccessListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.UserMessagingPlatform.IOnConsentFormLoadSuccessListener
{
public GoogleUMPFormLoadSuccessListener(Action<Xamarin.Google.UserMesssagingPlatform.IConsentForm> successAction)
{
a = successAction;
}
public void OnConsentFormLoadSuccess(Xamarin.Google.UserMesssagingPlatform.IConsentForm f)
{
a(f);
}
private Action<Xamarin.Google.UserMesssagingPlatform.IConsentForm> a = null;
}
- Загрузите GDPR:
MobileAds.Initialize(this);
SetGDPR();
И это все!
В MainActivity.OnCreate через некоторое время после вызова base.OnCreate(bundle); вставьте этот фрагмент кода:
App.LogMessage("DEBUG: MainActivity.OnCreate: Starting consent management flow, via UserMessagingPlatform.");
try
{
ConsentRequestParameters requestParameters = new ConsentRequestParameters
.Builder()
.SetTagForUnderAgeOfConsent(false)
.Build();
IConsentInformation consentInformation = UserMessagingPlatform.GetConsentInformation(this);
consentInformation.RequestConsentInfoUpdate(
this,
requestParameters,
new GoogleUMPConsentUpdateSuccessListener(
() =>
{
// The consent information state was updated.
// You are now ready to check if a form is available.
if (consentInformation.IsConsentFormAvailable)
{
UserMessagingPlatform.LoadConsentForm(
this,
new GoogleUMPFormLoadSuccessListener((IConsentForm f)=> {
this.googleUMPConsentForm = f;
this.googleUMPConsentInformation = consentInformation;
App.LogMessage("DEBUG: MainActivity.OnCreate: Consent management flow: LoadConsentForm has loaded a form, which will be shown if necessary, once the ViewModel is ready.");
DisplayAdvertisingConsentFormIfNecessary();
}),
new GoogleUMPFormLoadFailureListener((FormError e)=> {
// Handle the error.
App.LogMessage("ERROR: MainActivity.OnCreate: Consent management flow: failed in LoadConsentForm with error " + e.Message);
}));
}
else
{
App.LogMessage("DEBUG: MainActivity.OnCreate: Consent management flow: RequestConsentInfoUpdate succeeded but no consent form was available.");
}
}),
new GoogleUMPConsentUpdateFailureListener(
(FormError e) =>
{
// Handle the error.
App.LogMessage("ERROR: MainActivity.OnCreate: Consent management flow: failed in RequestConsentInfoUpdate with error " + e.Message);
})
);
}
catch (Exception ex)
{
App.LogMessage("ERROR: MainActivity.OnCreate: Exception thrown during consent management flow: ", ex);
}
Затем в теле класса MainActivity вам также нужно будет добавить эти определения:
private IConsentForm googleUMPConsentForm = null;
private IConsentInformation googleUMPConsentInformation = null;
public void DisplayAdvertisingConsentFormIfNecessary()
{
try
{
if (googleUMPConsentForm != null && googleUMPConsentInformation != null)
{
/* ConsentStatus:
Unknown = 0,
Required = 1,
NotRequired = 2,
Obtained = 3
*/
if (googleUMPConsentInformation.ConsentStatus == 1)
{
App.LogMessage("DEBUG: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Consent form is being displayed.");
DisplayAdvertisingConsentForm();
}
else
{
App.LogMessage("DEBUG: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Consent form is not being displayed because consent status is "+ googleUMPConsentInformation.ConsentStatus.ToString());
}
}
else
{
App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentFormIfNecessary: consent form or consent information missing.");
}
}
catch(Exception ex)
{
App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Exception thrown: ", ex);
}
}
public void DisplayAdvertisingConsentForm()
{
try
{
if (googleUMPConsentForm != null && googleUMPConsentInformation != null)
{
App.LogMessage("DEBUG: MainActivity.DisplayAdvertisingConsentForm: Consent form is being displayed.");
googleUMPConsentForm.Show(this, new GoogleUMPConsentFormDismissedListener(
(FormError f) =>
{
if (googleUMPConsentInformation.ConsentStatus == 1) // required
{
App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentForm: Consent was dismissed; showing it again because consent is still required.");
DisplayAdvertisingConsentForm();
}
}));
}
else
{
App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentForm: consent form or consent information missing.");
}
}
catch (Exception ex)
{
App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentForm: Exception thrown: ", ex);
}
}
public class GoogleUMPConsentFormDismissedListener : Java.Lang.Object, IConsentFormOnConsentFormDismissedListener
{
public GoogleUMPConsentFormDismissedListener(Action<FormError> failureAction)
{
this.a = failureAction;
}
public void OnConsentFormDismissed(FormError f)
{
a(f);
}
private Action<FormError> a = null;
}
public class GoogleUMPConsentUpdateFailureListener : Java.Lang.Object, IConsentInformationOnConsentInfoUpdateFailureListener
{
public GoogleUMPConsentUpdateFailureListener(Action<FormError> failureAction)
{
this.a = failureAction;
}
public void OnConsentInfoUpdateFailure(FormError f)
{
a(f);
}
private Action<FormError> a = null;
}
public class GoogleUMPConsentUpdateSuccessListener : Java.Lang.Object, IConsentInformationOnConsentInfoUpdateSuccessListener
{
public GoogleUMPConsentUpdateSuccessListener(Action successAction)
{
this.a = successAction;
}
public void OnConsentInfoUpdateSuccess()
{
a();
}
private Action a = null;
}
public class GoogleUMPFormLoadFailureListener : Java.Lang.Object, UserMessagingPlatform.IOnConsentFormLoadFailureListener
{
public GoogleUMPFormLoadFailureListener(Action<FormError> failureAction)
{
this.a = failureAction;
}
public void OnConsentFormLoadFailure(FormError e)
{
a(e);
}
private Action<FormError> a = null;
}
public class GoogleUMPFormLoadSuccessListener : Java.Lang.Object, UserMessagingPlatform.IOnConsentFormLoadSuccessListener
{
public GoogleUMPFormLoadSuccessListener(Action<IConsentForm> successAction)
{
this.a = successAction;
}
public void OnConsentFormLoadSuccess(IConsentForm f)
{
a(f);
}
private Action<IConsentForm> a = null;
}