Kullanıcı Mesajlaşma Platformu ile Onay Alma

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Ön koşullar

IAB şartları AB kullanıcı rızası alma mesajlarını nasıl etkiler? başlıklı makaleyi okuyun.

Giriş

Google AB Kullanıcı Rızası Politikası uyarınca, Avrupa Ekonomik Alanı (AEA) dahilindeki kullanıcılarınıza Birleşik Krallık ile birlikte belirli açıklamalar yapmanız, yasal olarak gerekli olduğu durumlarda çerezleri veya diğer yerel depolama alanlarını kullanma ile reklam sunmak için kişisel verileri (AdID gibi) kullanma izinlerini almanız gerekir. Bu politika AB eGizlilik Yönergesi ve Genel Veri Koruma Yönetmeliği (GDPR) kapsamındaki gereksinimleri yansıtmaktadır.

Google, yayıncıları bu politika kapsamındaki gereksinimleri yerine getirmeleri konusunda desteklemek için önceki açık kaynak İzin SDK'sının yerini alan Kullanıcı Mesajlaşma Platformu (UMP) SDK'sını sunar. UMP SDK'sı, en son IAB standartlarını destekleyecek şekilde güncellendi. Ayrıca, izin formları oluşturma ve reklam iş ortaklarını listeleme sürecini de basitleştirdik. Bu yapılandırmaların tümü artık kolayca AdMob Gizlilik ve mesajlaşma bölümünde yönetebilirsiniz.

Kullanıcılardan izin ayarlarını değiştirmek isteme ihtimaline karşı formun görüntülenmeye hazır olması için izin verilmediğini belirtseniz bile form, kullanıcının uygulamanızı her başlattığında yüklemek en iyi uygulamadır.

Bu kılavuzda SDK'nın nasıl yükleneceği, IAB çözümlerinin nasıl uygulanacağı ve test özelliklerinin nasıl etkinleştirileceği açıklanmaktadır.

Gradle ile yükleme

Kitaplığı, uygulamanızın derleme.gradle dosyasına ekleyin:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.google.android.ump:user-messaging-platform:2.0.0'
}

Bitirdiğinizde Gradle'ı senkronize etmeyi unutmayın.

AndroidManifest.xmlUygulama kimliğini ekleyin

Yardım Merkezi talimatlarını uygulayarak uygulama kimliğinizi edinin.

Uygulama kimliğinizi AndroidManifest.xmluygulamanıza ekleyin:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.rewardedinterstitialexample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="YOUR-APP-ID"/>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

SDK'yı kullanma

SDK doğrusal bir şekilde kullanılacak şekilde tasarlanmıştır. SDK'yı kullanma adımları:

  1. En güncel izin bilgilerini isteyin.
  2. İzin alınıp alınmadığını kontrol edin.
  3. Bir form olup olmadığını kontrol edin ve kullanılabilir bir form yükleyin.
  4. Formu sunun.
  5. Kullanıcıların izinlerini değiştirmeleri için bir yol sağlayın.

Her uygulama lansmanında izin bilgilerinin güncellenmesini istemeniz önerilir. Bu, kullanıcınızın izin vermesi gerekip gerekmediğini belirler.

Java

import android.os.Bundle;
import com.google.android.ump.ConsentForm;
import com.google.android.ump.ConsentInformation;
import com.google.android.ump.ConsentRequestParameters;
import com.google.android.ump.FormError;
import com.google.android.ump.UserMessagingPlatform;

public class MainActivity extends AppCompatActivity {
  private ConsentInformation consentInformation;
  private ConsentForm consentForm;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set tag for underage of consent. Here false means users are not underage.
    ConsentRequestParameters params = new ConsentRequestParameters
        .Builder()
        .setTagForUnderAgeOfConsent(false)
        .build();

    consentInformation = UserMessagingPlatform.getConsentInformation(this);
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        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.
          }
        });
  }
}

Kotlin

import android.os.Bundle
import com.google.android.ump.*

class MainActivity : AppCompactActivity() {
  private lateinit var consentInformation: ConsentInformation
  private var consentForm: ConsentForm? = null

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Set tag for underage of consent. Here false means users are not underage.
    val params = ConsentRequestParameters.Builder()
        .setTagForUnderAgeOfConsent(false)
        .build()

    consentInformation = UserMessagingPlatform.getConsentInformation(this)
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        {
          // The consent information state was updated.
          // You are now ready to check if a form is available.
        },
        { formError ->
          // Handle the error.
        }
    )
  }
}

Varsa form yükleme

Bir kullanıcıdan izin isteyeceğinizi belirledikten sonraki adım bir formun kullanılabilir olup olmadığını belirlemektir.

Bir formun kullanılamamasının çeşitli nedenleri olabilir. Örneğin:

  • Kullanıcı için sınırlı reklam izleme etkin.
  • Kullanıcıyı reşit olma yaşının altında olarak etiketlediniz.

Formun kullanılabilir olup olmadığını kontrol etmek için ConsentInformation örneğinde isConsentFormAvailable() yöntemini kullanın. Form yüklemek için sarmalayıcı yöntemi ekleyin:

Java

...
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
          @Override
          public void onConsentInfoUpdateSuccess() {
            // The consent information state was updated.
            // You are now ready to check if a form is available.
            if (consentInformation.isConsentFormAvailable()) {
              loadForm();
            }
          }
        },
        new ConsentInformation.OnConsentInfoUpdateFailureListener() {
          @Override
          public void onConsentInfoUpdateFailure(FormError formError) {
            // Handle the error.
          }
        });
}

public void loadForm() {

}

Kotlin

...
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        {
          // The consent information state was updated.
          // You are now ready to check if a form is available.
          if (consentInformation.isConsentFormAvailable) {
            loadForm()
          }
        },
        { formError ->
          // Handle the error.
        }
    )
}

private fun loadForm() {

}

Formu yüklemek için UserMessagingPlatform sınıfında statik loadConsentForm() yöntemini kullanırsınız. Bu yöntem yalnızca ana iş parçacığından çağrılmalıdır. loadForm() yönteminizi şu şekilde değiştirin:

Java

public void loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this, new UserMessagingPlatform.OnConsentFormLoadSuccessListener() {
        @Override
        public void onConsentFormLoadSuccess(ConsentForm consentForm) {
          MainActivity.this.consentForm = consentForm;
        }
      },
      new UserMessagingPlatform.OnConsentFormLoadFailureListener() {
        @Override
        public void onConsentFormLoadFailure(FormError formError) {
          // Handle the error.
        }
      });
}

Kotlin

private fun loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this,
      { consentForm ->
        this.consentForm = consentForm
      },
      { formError ->
        // Handle the error.
      }
  )
}

Gerekirse formu gönderin

Formu sunmak için ConsentForm örneğinde show() yöntemini kullanın. Formu göndermeden önce kullanıcının izin verip vermediğini belirlemeniz gerekir. İzin gerekip gerekmediğini kontrol etmek için ConsentInformation nesnesindeki getConsentStatus() yöntemini kontrol edin. Bu yöntem, ConsentInformation.ConsentStatus türünde bir enum döndürür. Dört olası değer vardır:

  • ConsentStatus.UNKNOWN: İzin durumu bilinmiyor.
  • ConsentStatus.REQUIRED: Kullanıcı izni gerekiyor ancak henüz alınmadı.
  • ConsentStatus.NOT_REQUIRED: Kullanıcı izni gerekli değildir. Örneğin, kullanıcı AEA veya Birleşik Krallık'ta değil.
  • ConsentStatus.OBTAINED: Kullanıcı izni alındı. Kişiselleştirme tanımlanmamış.

loadForm() yönteminizi şu şekilde değiştirin:

Java

public void loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this, new UserMessagingPlatform.OnConsentFormLoadSuccessListener() {
        @Override
        public void onConsentFormLoadSuccess(ConsentForm consentForm) {
          MainActivity.this.consentForm = consentForm;
          if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.REQUIRED) {
            consentForm.show(
                MainActivity.this,
                    new ConsentForm.OnConsentFormDismissedListener() {
                      @Override
                      public void onConsentFormDismissed(@Nullable FormError formError) {
                        // Handle dismissal by reloading form.
                        loadForm();
                      }
                    });
          }
        }
      },
      new UserMessagingPlatform.OnConsentFormLoadFailureListener() {
        @Override
        public void onConsentFormLoadFailure(FormError formError) {
          // Handle the error.
        }
      });
}

Kotlin

private fun loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this,
      { consentForm ->
        this.consentForm = consentForm
        if (consentInformation.consentStatus == ConsentInformation.ConsentStatus.REQUIRED) {
          consentForm.show(this) { formError ->
            // Handle dismissal by reloading form.
            loadForm()
          }
        }
      },
      { formError ->
        // Handle the error.
      }
  )
}

Kullanıcı rızası gerekmiyorsa kullanıcınızın izin durumunu değiştirebilmesi için forma referans verebilirsiniz.

Test

Coğrafi konumu zorla

UMP SDK'sı, cihaz ConsentDebugSettings.Builder üzerinde setDebugGeography() yöntemini kullanarak AEA'daymış gibi uygulamanızın davranışını test etmenin bir yolunu sunar.

Hata ayıklama işlevini kullanmak için test cihazınızda karma oluşturma işlemi uygulanmış kimlikte test cihazınızın karma kimliğini sağlamanız gerekir. Bu değeri ayarlamadan requestConsentInfoUpdate() yöntemini çağırırsanız uygulamanız çalıştırıldığında gerekli kimlik karmasını günlüğe kaydeder.

Java

ConsentDebugSettings debugSettings = new ConsentDebugSettings.Builder(this)
    .setDebugGeography(ConsentDebugSettings
        .DebugGeography
        .DEBUG_GEOGRAPHY_EEA)
    .addTestDeviceHashedId("TEST-DEVICE-HASHED-ID")
    .build();

ConsentRequestParameters params = new ConsentRequestParameters
    .Builder()
    .setConsentDebugSettings(debugSettings)
    .build();

consentInformation = UserMessagingPlatform.getConsentInformation(this);
consentInformation.requestConsentInfoUpdate(
    this,
    params,
    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.
      }
    });

Kotlin

val debugSettings = ConsentDebugSettings.Builder(this)
    .setDebugGeography(ConsentDebugSettings
        .DebugGeography
        .DEBUG_GEOGRAPHY_EEA)
    .addTestDeviceHashedId("TEST-DEVICE-HASHED-ID")
    .build()

val params = ConsentRequestParameters
    .Builder()
    .setConsentDebugSettings(debugSettings)
    .build()

consentInformation = UserMessagingPlatform.getConsentInformation(this)
consentInformation.requestConsentInfoUpdate(
    this,
    params,
    {
      // The consent information state was updated.
      // You are now ready to check if a form is available.
    },
    { formError ->
      // Handle the error.
    }
  )

SDK'yı, cihazı AEA veya Birleşik Krallık'ta değilmiş gibi davranmaya zorlamak için DebugGeography.DEBUG_GEOGRAPHY_NOT_EEA kullanın. Hata ayıklama ayarlarının yalnızca test cihazlarında çalıştığını unutmayın. Testler varsayılan olarak etkinleştirildiği için emülatörlerin cihaz kimliği listesine eklenmesi gerekmez.

UMP SDK'sı ile uygulamanızı test ederken, bir kullanıcının ilk yükleme deneyimini simüle etmek için SDK'nın durumunu sıfırlamanız yararlı olabilir. SDK, bunu yapmak için reset yöntemini sağlar.

Java

consentInformation.reset();

Kotlin

consentInformation.reset()

Uygulama ölçümünü geciktir (isteğe bağlı)

Google Mobile Ads SDK'sı varsayılan olarak uygulama ölçümünü başlatır ve uygulama başladığında kullanıcı düzeyindeki etkinlik verilerini Google'a hemen gönderir. Bu başlatma davranışı, herhangi bir ek kod değişikliği yapmadan AdMob kullanıcı metriklerini etkinleştirebilmenizi sağlar.

Ancak, uygulamanız bu etkinliklerin gönderilmeden önce kullanıcı rızasını gerektiriyorsa açıkça Mobile Ads SDK'sını başlatana veya bir reklam yükleyene kadar uygulama ölçümünü erteleyebilirsiniz.

Uygulama ölçümünü geciktirmek için AndroidManifest.xml bölümüne aşağıdaki <meta-data> etiketini ekleyin.

<manifest>
     <application>
        <!-- Delay app measurement until MobileAds.initialize() is called. -->
        <meta-data
            android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
            android:value="true"/>
    </application>
</manifest>

Uyumlulaştırma

Uyumlulaştırma kullanıyorsanız uygulamanızda kullanmayı seçtiğiniz rıza çerçevesine bağlı olarak, uyumlulaştırma iş ortaklarınız için verdiğiniz izni farklı bir şekilde ele almanız gerekir. Google, IAB İzin Çerçevesi'ni destekler ancak kendi özel rıza çözümünüzü kullanmanıza da olanak tanır. Bu seçeneklerin her biri kapsamında uyumlulaştırmanın nasıl ele alınacağı aşağıda açıklanmıştır. İzin çözümlerimiz hakkında daha fazla bilgi edinin.

UMP SDK'sı veya Mobile Ads SDK'sı, izin bilgilerini uyumlulaştırma iş ortaklarına yönlendirmez. IAB çözümü kullanılırken UMP SDK'sı, izin durumunu yerel depolama alanına yazar ve ilgili anahtarları okumak her uyumlulaştırma iş ortağının SDK'sının sorumluluğundadır. IAB çözümünü destekleyip desteklemediklerini öğrenmek için üçüncü taraf ağlarla iletişim kurduğunuzdan emin olun.

Özel bir rıza çözümü kullanıyorsanız uygulamanızın izin durumunu üçüncü taraf SDK'larına bildirmek sizin sorumluluğunuzdadır. İzin bilgilerini ilgili üçüncü taraflara nasıl ileteceğinizle ilgili ayrıntılar için lütfen uygulama ayrıntıları için her bir uyumlulaştırma iş ortağının entegrasyon kılavuzuna bakın.

Bu bölümdeki kod, Google Mobile Ads SDK'sının herhangi bir sürümüyle kullanılabilir. İzin SDK'sını izin almak için kullanıp kullanmamanızdan bağımsız olarak da kullanılabilir.

Google Mobile Ads SDK'sının varsayılan davranışı, kişiselleştirilmiş reklamlar sunmaktır. Kullanıcı yalnızca kişiselleştirilmemiş reklamlar almayı kabul ettiyse yalnızca kişiselleştirilmemiş reklamların istenmesi gerektiğini belirtmek için AdRequest nesnesini yapılandırabilirsiniz. Aşağıdaki kod, kullanıcının AEA'da olup olmadığından bağımsız olarak kişiselleştirilmemiş reklamların istenmesine neden olur:

Java

Bundle extras = new Bundle();
extras.putString("npa", "1");

AdRequest request = new AdRequest.Builder()
    .addNetworkExtrasBundle(AdMobAdapter.class, extras)
    .build();

Kotlin

val extras = Bundle()
extras.putString("npa", "1")

val request = AdRequest.Builder()
    .addNetworkExtrasBundle(AdMobAdapter::class.java, extras)
    .build()

Kişiselleştirilmemiş reklamlar istenirse reklam isteği URL'si şu anda &npa=1 değerini içerir. Ancak, bunun Google Mobile Ads SDK'sının dahili bir uygulama ayrıntısı olduğunu ve değişebileceğini unutmayın.