ব্যবহারকারীর মেসেজিং প্ল্যাটফর্মের সাথে সম্মতি প্রাপ্ত করা

পূর্বশর্ত

পড়ুনকিভাবে IAB প্রয়োজনীয়তা EU সম্মতি বার্তাগুলিকে প্রভাবিত করে

ভূমিকা

Google EU ব্যবহারকারীর সম্মতি নীতির অধীনে, আপনাকে অবশ্যই ইউকে সহ ইউরোপীয় অর্থনৈতিক অঞ্চলে (EEA) আপনার ব্যবহারকারীদের কাছে নির্দিষ্ট কিছু প্রকাশ করতে হবে এবং কুকিজ বা অন্যান্য স্থানীয় স্টোরেজ ব্যবহার করার জন্য তাদের সম্মতি নিতে হবে, যেখানে আইনত প্রয়োজন, এবং ব্যক্তিগত ডেটা ব্যবহার করতে ( যেমন AdID) বিজ্ঞাপন পরিবেশন করতে। এই নীতি EU ই-প্রাইভেসি নির্দেশিকা এবং সাধারণ ডেটা সুরক্ষা নিয়ন্ত্রণের (GDPR)-এর প্রয়োজনীয়তাগুলিকে প্রতিফলিত করে৷

এই নীতির অধীনে প্রকাশকদের তাদের দায়িত্ব পালনে সহায়তা করার জন্য, Google ব্যবহারকারী মেসেজিং প্ল্যাটফর্ম (UMP) SDK অফার করে, যা আগের ওপেন সোর্স কনসেন্ট SDK-কে প্রতিস্থাপন করে। UMP SDK সর্বশেষ IAB মানগুলিকে সমর্থন করার জন্য আপডেট করা হয়েছে৷ আমরা সম্মতি ফর্ম সেট আপ করার এবং বিজ্ঞাপন অংশীদারদের তালিকা করার প্রক্রিয়াটিকেও সহজ করেছি৷ এই সমস্ত কনফিগারেশনগুলি এখনAdMob গোপনীয়তা এবং বার্তাপ্রেরণে সুবিধাজনকভাবে পরিচালনা করা যেতে পারে৷

প্রতিবার ব্যবহারকারী আপনার অ্যাপ চালু করার সময় একটি ফর্ম লোড করা একটি সর্বোত্তম অভ্যাস, এমনকি যদি আপনি নির্ধারণ করেন যে সম্মতির প্রয়োজন নেই, যাতে ব্যবহারকারী তাদের সম্মতি সেটিং পরিবর্তন করতে চাইলে ফর্মটি প্রদর্শনের জন্য প্রস্তুত থাকে।

এই নির্দেশিকাটি আপনাকে কীভাবে SDK ইনস্টল করতে হয়, IAB সমাধানগুলি বাস্তবায়ন করতে হয় এবং পরীক্ষার বৈশিষ্ট্যগুলি সক্ষম করতে হয় তা নিয়ে চলে।

Gradle দিয়ে ইনস্টল করুন

আপনার অ্যাপের build.gradle-এ লাইব্রেরি অন্তর্ভুক্ত করুন:

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'
}

আপনার কাজ শেষ হলে Gradle সিঙ্ক করতে ভুলবেন না।

AndroidManifest.xmlএ অ্যাপ আইডি যোগ করুন

সহায়তা কেন্দ্রের নির্দেশাবলী অনুসরণ করে আপনার অ্যাপ আইডি পান।

আপনার AndroidManifest.xmlএ আপনার অ্যাপ আইডি যোগ করুন:

<?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 ব্যবহার করে

SDK একটি লিনিয়ার ফ্যাশনে ব্যবহার করার জন্য ডিজাইন করা হয়েছে। SDK ব্যবহার করার ধাপগুলি হল:

  1. সর্বশেষ সম্মতি তথ্য অনুরোধ.
  2. সম্মতি প্রয়োজন কিনা তা পরীক্ষা করুন।
  3. একটি ফর্ম উপলব্ধ কিনা পরীক্ষা করুন এবং যদি তাই একটি ফর্ম লোড.
  4. ফর্মটি উপস্থাপন করুন।
  5. ব্যবহারকারীদের তাদের সম্মতি পরিবর্তন করার জন্য একটি উপায় প্রদান করুন।

এটি সুপারিশ করা হয় যে আপনি প্রতিটি অ্যাপ লঞ্চের সময় সম্মতির তথ্য আপডেট করার অনুরোধ করুন। এটি আপনার ব্যবহারকারীর সম্মতি প্রদান করতে হবে কিনা তা নির্ধারণ করবে।

জাভা

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.
          }
        });
  }
}

কোটলিন

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.
        }
    )
  }
}

পাওয়া গেলে একটি ফর্ম লোড করুন

একবার আপনি নির্ধারণ করেছেন যে আপনি একজন ব্যবহারকারীকে সম্মতির জন্য জিজ্ঞাসা করবেন, পরবর্তী ধাপ হল একটি ফর্ম উপলব্ধ কিনা তা নির্ধারণ করা।

একটি ফর্ম উপলব্ধ নাও হতে পারে এমন বিভিন্ন কারণ রয়েছে, যেমন:

  • ব্যবহারকারী সীমিত বিজ্ঞাপন ট্র্যাকিং সক্ষম আছে.
  • আপনি ব্যবহারকারীকে সম্মতির বয়সের নিচে ট্যাগ করেছেন।

একটি ফর্ম উপলব্ধ কিনা তা পরীক্ষা করতে, ConsentInformation উদাহরণে isConsentFormAvailable() পদ্ধতিটি ব্যবহার করুন৷ একটি ফর্ম লোড করার জন্য একটি মোড়ানো পদ্ধতি যোগ করুন:

জাভা

...
    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() {

}

কোটলিন

...
    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() {

}

ফর্মটি লোড করতে আপনি UserMessagingPlatform ক্লাসে স্ট্যাটিক loadConsentForm() পদ্ধতি ব্যবহার করবেন। এই পদ্ধতি শুধুমাত্র প্রধান থ্রেড থেকে কল করা আবশ্যক. আপনার loadForm() পদ্ধতিটি এভাবে পরিবর্তন করুন:

জাভা

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.
        }
      });
}

কোটলিন

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

প্রয়োজনে ফর্মটি উপস্থাপন করুন

ফর্মটি উপস্থাপন করতে, ConsentForm উদাহরণে show() পদ্ধতি ব্যবহার করুন৷ ফর্মটি উপস্থাপন করার আগে ব্যবহারকারীর সম্মতি প্রয়োজন কিনা তা আপনার নির্ধারণ করা উচিত। সম্মতি প্রয়োজন কিনা তা পরীক্ষা করতে, ConsentInformation অবজেক্টে getConsentStatus() পদ্ধতিটি পরীক্ষা করুন, যা ConsentInformation.ConsentStatus টাইপের একটি ConsentInformation.ConsentStatus প্রদান করে। চারটি সম্ভাব্য মান আছে:

  • ConsentStatus.UNKNOWN : অজানা সম্মতি স্ট্যাটাস।
  • ConsentStatus.REQUIRED : ব্যবহারকারীর সম্মতি প্রয়োজন কিন্তু এখনও পাওয়া যায়নি।
  • ConsentStatus.NOT_REQUIRED : ব্যবহারকারীর সম্মতির প্রয়োজন নেই। উদাহরণস্বরূপ, ব্যবহারকারী EEA বা UK-তে নেই৷
  • ConsentStatus.OBTAINED : ব্যবহারকারীর সম্মতি পাওয়া গেছে। ব্যক্তিগতকরণ সংজ্ঞায়িত করা হয়নি.

আপনার loadForm() পদ্ধতিটি এভাবে পরিবর্তন করুন:

জাভা

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.
        }
      });
}

কোটলিন

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.
      }
  )
}

যদি সম্মতির প্রয়োজন না হয়, আপনি ফর্মের একটি রেফারেন্স বজায় রাখতে পারেন যাতে আপনার ব্যবহারকারী তাদের সম্মতির স্থিতি পরিবর্তন করতে পারে।

পরীক্ষামূলক

একটি ভূগোল জোর করে

UMP SDK আপনার অ্যাপের আচরণ পরীক্ষা করার একটি উপায় প্রদান করে যেন ডিভাইসটি ConsentDebugSettings.Builder-এ setDebugGeography() পদ্ধতি ব্যবহার করে EEA-তে ConsentDebugSettings.Builder

ডিবাগ কার্যকারিতা ব্যবহার করার জন্য আপনাকে আপনার অ্যাপের ডিবাগ সেটিংসে আপনার পরীক্ষার ডিভাইসের হ্যাশড আইডি প্রদান করতে হবে। আপনি যদি এই মানটি সেট না করেই requestConsentInfoUpdate() কল করেন, আপনার অ্যাপটি চালানোর সময় প্রয়োজনীয় আইডি হ্যাশ লগ করবে।

জাভা

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.
      }
    });

কোটলিন

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.
    }
  )

ডিভাইসটিকে EEA বা UK-তে নয় এমনভাবে ব্যবহার করতে SDK-কে বাধ্য করতে, DebugGeography.DEBUG_GEOGRAPHY_NOT_EEA ব্যবহার করুন। মনে রাখবেন যে ডিবাগ সেটিংস শুধুমাত্র পরীক্ষা ডিভাইসে কাজ করে। এমুলেটরদের ডিভাইস আইডি তালিকায় যোগ করার প্রয়োজন নেই কারণ তারা ডিফল্টরূপে পরীক্ষা সক্ষম করেছে।

UMP SDK-এর সাথে আপনার অ্যাপ পরীক্ষা করার সময়, আপনি SDK-এর অবস্থা রিসেট করা সহায়ক বলে মনে করতে পারেন যাতে আপনি একজন ব্যবহারকারীর প্রথম ইনস্টল অভিজ্ঞতা অনুকরণ করতে পারেন। এটি করার জন্য SDK reset পদ্ধতি প্রদান করে।

জাভা

consentInformation.reset();

কোটলিন

consentInformation.reset()

বিলম্ব অ্যাপ্লিকেশন পরিমাপ (ঐচ্ছিক)

ডিফল্টরূপে, Google মোবাইল বিজ্ঞাপন SDK অ্যাপ পরিমাপ শুরু করে এবং অ্যাপটি শুরু হওয়ার সাথে সাথেই ব্যবহারকারী-স্তরের ইভেন্ট ডেটা Google-এ পাঠাতে শুরু করে।এই প্রারম্ভিক আচরণ নিশ্চিত করে যে আপনি অতিরিক্ত কোড পরিবর্তন না করেই AdMob ব্যবহারকারীর মেট্রিক্স সক্ষম করতে পারেন।

যাইহোক, যদি এই ইভেন্টগুলি পাঠানোর আগে আপনার অ্যাপের ব্যবহারকারীর সম্মতির প্রয়োজন হয়, তাহলে আপনি স্পষ্টভাবে মোবাইল বিজ্ঞাপন SDK শুরু না করা পর্যন্ত বা বিজ্ঞাপন লোড না করা পর্যন্ত অ্যাপের পরিমাপ বিলম্বিত করতে পারেন।

অ্যাপ পরিমাপ বিলম্বিত করতে, আপনার AndroidManifest.xml এ নিম্নলিখিত <meta-data> ট্যাগ যোগ করুন।

<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>

মধ্যস্থতা

আপনি যদি মধ্যস্থতা ব্যবহার করেন, তাহলে আপনি আপনার অ্যাপে ব্যবহার করতে বেছে নেওয়া সম্মতি কাঠামোর উপর ভিত্তি করে আপনার মধ্যস্থতাকারী অংশীদারদের সম্মতি ভিন্নভাবে পরিচালনা করতে হবে। Google IAB কনসেন্ট ফ্রেমওয়ার্ক সমর্থন করে কিন্তু আপনাকে আপনার নিজস্ব কাস্টম সম্মতি সমাধানের অনুমতি দেয়। এই বিকল্পগুলির প্রতিটির অধীনে মধ্যস্থতা কীভাবে পরিচালনা করবেন সে সম্পর্কে নীচে বিশদ বিবরণ রয়েছে৷আমাদের সম্মতি সমাধান সম্পর্কে আরও জানুন

UMP SDK বা মোবাইল বিজ্ঞাপন SDK কেউই মধ্যস্থতা অংশীদারদের কাছে সম্মতির তথ্য ফরোয়ার্ড করে না। বরং, IAB সমাধান ব্যবহার করার সময়, UMP SDK স্থানীয় সঞ্চয়স্থানে সম্মতির স্থিতির তথ্য লেখে এবং উপযুক্ত কীগুলি পড়ার দায়িত্ব প্রতিটি মধ্যস্থতা অংশীদারের SDK-এর। তারা IAB সমাধান সমর্থন করে কিনা তা নির্ধারণ করতে প্রতিটি তৃতীয় পক্ষের নেটওয়ার্কের সাথে চেক করতে ভুলবেন না।

একটি কাস্টম সম্মতি সমাধান ব্যবহার করলে, আপনার অ্যাপের সম্মতির স্থিতি সম্পর্কে তৃতীয়-পক্ষ SDK-কে অবহিত করা আপনার দায়িত্ব। প্রাসঙ্গিক তৃতীয় পক্ষের কাছে কীভাবে সম্মতির তথ্য পাঠাতে হয় তার সুনির্দিষ্ট তথ্যের জন্য, বাস্তবায়নের বিশদ বিবরণের জন্য অনুগ্রহ করে প্রতিটি মধ্যস্থতা অংশীদারের ইন্টিগ্রেশন গাইড পড়ুন।

এই বিভাগের কোডটি Google Mobile Ads SDK-এর যেকোনো সংস্করণের সাথে ব্যবহার করা যেতে পারে। আপনি সম্মতি সংগ্রহ করতে সম্মতি SDK ব্যবহার করেছেন কিনা তা বিবেচনা না করেও এটি ব্যবহার করা যেতে পারে।

Google মোবাইল বিজ্ঞাপন SDK-এর ডিফল্ট আচরণ হল ব্যক্তিগতকৃত বিজ্ঞাপন পরিবেশন করা। যদি একজন ব্যবহারকারী শুধুমাত্র অ-ব্যক্তিগত বিজ্ঞাপন পেতে সম্মতি দেন, তাহলে আপনি একটি AdRequest অবজেক্ট কনফিগার করতে পারেন যাতে উল্লেখ করা যায় যে শুধুমাত্র অ-ব্যক্তিগত বিজ্ঞাপনের জন্য অনুরোধ করা উচিত। ব্যবহারকারী EEA-তে থাকুক বা না থাকুক নিচের কোডের কারণে অ-ব্যক্তিগত বিজ্ঞাপনের অনুরোধ করা হবে:

জাভা

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

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

কোটলিন

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

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

যদি অ-ব্যক্তিগত বিজ্ঞাপনের অনুরোধ করা হয়, বিজ্ঞাপন অনুরোধের URL-এ বর্তমানে &npa=1 অন্তর্ভুক্ত থাকে। যাইহোক, মনে রাখবেন যে এটি Google মোবাইল বিজ্ঞাপন SDK-এর একটি অভ্যন্তরীণ বাস্তবায়নের বিবরণ এবং পরিবর্তন সাপেক্ষে।