শুরু করুন

Google ব্যবহারকারী মেসেজিং প্ল্যাটফর্ম (UMP) SDK হল একটি গোপনীয়তা এবং মেসেজিং টুল যা আপনাকে গোপনীয়তা পছন্দগুলি পরিচালনা করতে সহায়তা করে৷ আরও তথ্যের জন্য, গোপনীয়তা এবং বার্তাপ্রেরণ সম্পর্কে দেখুন।

পূর্বশর্ত

  • Android API স্তর 21 বা উচ্চতর (Android এর জন্য)

একটি বার্তা টাইপ তৈরি করুন

আপনার AdMob অ্যাকাউন্টের গোপনীয়তা এবং বার্তাপ্রেরণ ট্যাবের অধীনে উপলব্ধ ব্যবহারকারী বার্তাগুলির একটি দিয়ে ব্যবহারকারীর বার্তা তৈরি করুন৷ UMP SDK আপনার প্রজেক্টে সেট করা AdMob অ্যাপ্লিকেশন আইডি থেকে তৈরি একটি গোপনীয়তা বার্তা প্রদর্শন করার চেষ্টা করে।

আরো বিস্তারিত জানার জন্য, গোপনীয়তা এবং বার্তাপ্রেরণ সম্পর্কে দেখুন।

SDK ইনস্টল করুন

  1. Google মোবাইল বিজ্ঞাপন (GMA) C++ SDK ইনস্টল করার জন্য ধাপগুলি অনুসরণ করুন। UMP C++ SDK GMA C++ SDK-এর অন্তর্ভুক্ত।

  2. চালিয়ে যাওয়ার আগে প্রজেক্টে আপনার অ্যাপের AdMob অ্যাপ আইডি কনফিগার করেছেন তা নিশ্চিত করুন।

  3. আপনার কোডে, ConsentInfo::GetInstance() কল করে UMP SDK শুরু করুন।

    • অ্যান্ড্রয়েডে, আপনাকে NDK দ্বারা প্রদত্ত JNIEnv এবং Activity পাস করতে হবে। প্রথমবার যখন আপনি GetInstance() কল করবেন তখনই আপনাকে এটি করতে হবে।
    • বিকল্পভাবে, আপনি যদি ইতিমধ্যেই আপনার অ্যাপে Firebase C++ SDK ব্যবহার করে থাকেন, তাহলে আপনি একটি firebase::App এ প্রথমবার GetInstance() কল করলে পাস করতে পারেন।
    #include "firebase/gma/ump.h"
    
    namespace ump = ::firebase::gma::ump;
    
    // Initialize using a firebase::App
    void InitializeUserMessagingPlatform(const firebase::App& app) {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance(app);
    }
    
    // Initialize without a firebase::App
    #ifdef ANDROID
    void InitializeUserMessagingPlatform(JNIEnv* jni_env, jobject activity) {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance(jni_env, activity);
    }
    #else  // non-Android
    void InitializeUserMessagingPlatform() {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();
    }
    #endif
    

ConsentInfo::GetInstance() এর পরবর্তী কলগুলি একই উদাহরণ প্রদান করে।

আপনি যদি UMP SDK ব্যবহার করা শেষ করে থাকেন, তাহলে আপনি ConsentInfo উদাহরণ মুছে SDK বন্ধ করতে পারেন:

void ShutdownUserMessagingPlatform() {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();
  delete consent_info;
}

অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপ নিরীক্ষণ করতে একটি Future ব্যবহার করুন

একটি firebase::Future আপনাকে অ্যাসিঙ্ক্রোনাস মেথড কলের সমাপ্তির স্থিতি নির্ধারণ করার একটি উপায় প্রদান করে।

সমস্ত UMP C++ ফাংশন এবং মেথড কল যেগুলি অ্যাসিঙ্ক্রোনাসভাবে কাজ করে একটি Future ফেরত দেয়, এবং সাম্প্রতিক অপারেশন থেকে Future পুনরুদ্ধার করার জন্য একটি "শেষ ফলাফল" ফাংশন প্রদান করে।

একটি Future থেকে ফলাফল প্রাপ্ত করার দুটি উপায় আছে:

  1. কল OnCompletion() , আপনার নিজস্ব কলব্যাক ফাংশন পাস করে, যা অপারেশন সম্পূর্ণ হলে বলা হয়।
  2. পর্যায়ক্রমে Future status() পরীক্ষা করুন। যখন অবস্থা kFutureStatusPending থেকে kFutureStatusCompleted এ পরিবর্তিত হয়, তখন অপারেশনটি সম্পন্ন হয়।

অ্যাসিঙ্ক্রোনাস অপারেশন শেষ হওয়ার পরে, অপারেশনের ত্রুটি কোড পেতে আপনার Future error() পরীক্ষা করা উচিত। যদি ত্রুটি কোডটি 0 হয় ( kConsentRequestSuccess বা kConsentFormSuccess ), অপারেশনটি সফলভাবে সম্পন্ন হয়েছে; অন্যথায়, কি ভুল হয়েছে তা নির্ধারণ করতে ত্রুটি কোড এবং error_message() পরীক্ষা করুন।

সমাপ্তি কলব্যাক

একটি সমাপ্তি কলব্যাক সেট করতে কীভাবে OnCompletion ব্যবহার করবেন তার একটি উদাহরণ এখানে দেওয়া হল, যা অ্যাসিঙ্ক্রোনাস অপারেশন সম্পূর্ণ হলে বলা হয়।

void MyApplicationStart() {
  // [... other app initialization code ...]

  ump::ConsentInfo *consent_info = ump::ConsentInfo::GetInstance();

  // See the section below for more information about RequestConsentInfoUpdate.
  firebase::Future<void> result = consent_info->RequestConsentInfoUpdate(...);

  result.OnCompletion([](const firebase::Future<void>& req_result) {
    if (req_result.error() == ump::kConsentRequestSuccess) {
      // Operation succeeded. You can now call LoadAndShowConsentFormIfRequired().
    } else {
      // Operation failed. Check req_result.error_message() for more information.
    }
  });
}

লুপ পোলিং আপডেট করুন

এই উদাহরণে, অ্যাপ লঞ্চের সময় একটি অ্যাসিঙ্ক্রোনাস অপারেশন শুরু হওয়ার পরে, গেমের আপডেট লুপ ফাংশনে (যা প্রতি ফ্রেমে একবার চলে) ফলাফলগুলি অন্য কোথাও পরীক্ষা করা হয়।

ump::ConsentInfo *g_consent_info = nullptr;
bool g_waiting_for_request = false;

void MyApplicationStart() {
  // [... other app initialization code ...]

  g_consent_info = ump::ConsentInfo::GetInstance();
  // See the section below for more information about RequestConsentInfoUpdate.
  g_consent_info->RequestConsentInfoUpdate(...);
  g_waiting_for_request = true;
}

// Elsewhere, in the game's update loop, which runs once per frame:
void MyGameUpdateLoop() {
  // [... other game logic here ...]

  if (g_waiting_for_request) {
    // Check whether RequestConsentInfoUpdate() has finished.
    // Calling "LastResult" returns the Future for the most recent operation.
    firebase::Future<void> result =
      g_consent_info->RequestConsentInfoUpdateLastResult();

    if (result.status() == firebase::kFutureStatusComplete) {
      g_waiting_for_request = false;
      if (result.error() == ump::kConsentRequestSuccess) {
        // Operation succeeded. You can call LoadAndShowConsentFormIfRequired().
      } else {
        // Operation failed. Check result.error_message() for more information.
      }
    }
  }
}

firebase::Future সম্পর্কে আরও তথ্যের জন্য, Firebase C++ SDK ডকুমেন্টেশন এবং GMA C++ SDK ডকুমেন্টেশন দেখুন।

RequestConsentInfoUpdate() ব্যবহার করে প্রতিটি অ্যাপ লঞ্চের সময় আপনার ব্যবহারকারীর সম্মতির তথ্য আপডেট করার অনুরোধ করা উচিত। এই অনুরোধ নিম্নলিখিত পরীক্ষা করে:

  • সম্মতি প্রয়োজন কিনা । উদাহরণস্বরূপ, প্রথমবারের জন্য সম্মতি প্রয়োজন, বা পূর্ববর্তী সম্মতির সিদ্ধান্তের মেয়াদ শেষ হয়ে গেছে।
  • একটি গোপনীয়তা বিকল্প এন্ট্রি পয়েন্ট প্রয়োজন কিনা . কিছু গোপনীয়তা বার্তার জন্য অ্যাপের প্রয়োজন হয় যাতে ব্যবহারকারীরা যে কোনো সময় তাদের গোপনীয়তা বিকল্পগুলি পরিবর্তন করতে পারেন।
#include "firebase/gma/ump.h"

namespace ump = ::firebase::gma::ump;

void MyApplicationStart(ump::FormParent parent) {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();

  // Create a ConsentRequestParameters struct..
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age of consent.
  params.tag_for_under_age_of_consent = false;

  consent_info->RequestConsentInfoUpdate(params).OnCompletion(
    [*](const Future<void>& req_result) {
      if (req_result.error() != ump::kConsentRequestSuccess) {
        // req_result.error() is a kConsentRequestError enum.
        LogMessage("Error requesting consent update: %s", req_result.error_message());
      }
      // Consent information is successfully updated.
    });
}

গোপনীয়তা বার্তা ফর্মটি লোড করুন এবং উপস্থাপন করুন

আপনি সর্বাধিক আপ-টু-ডেট সম্মতির স্থিতি পাওয়ার পরে, ব্যবহারকারীর সম্মতি সংগ্রহের জন্য প্রয়োজনীয় যে কোনও ফর্ম লোড করতে LoadAndShowConsentFormIfRequired() এ কল করুন। লোড করার পরে, ফর্মগুলি অবিলম্বে উপস্থিত হয়।

#include "firebase/gma/ump.h"

namespace ump = ::firebase::gma::ump;

void MyApplicationStart(ump::FormParent parent) {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();

  // Create a ConsentRequestParameters struct..
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age of consent.
  params.tag_for_under_age_of_consent = false;

  consent_info->RequestConsentInfoUpdate(params).OnCompletion(
    [*](const Future<void>& req_result) {
      if (req_result.error() != ump::kConsentRequestSuccess) {
        // req_result.error() is a kConsentRequestError enum.
        LogMessage("Error requesting consent update: %s", req_result.error_message());
      } else {
        consent_info->LoadAndShowConsentFormIfRequired(parent).OnCompletion(
        [*](const Future<void>& form_result) {
          if (form_result.error() != ump::kConsentFormSuccess) {
            // form_result.error() is a kConsentFormError enum.
            LogMessage("Error showing privacy message form: %s", form_result.error_message());
          } else {
            // Either the form was shown and completed by the user, or consent was not required.
          }
        });
      }
    });
}

একটি সম্পূর্ণ কলব্যাকের পরিবর্তে আপডেট লুপ পোলিং ব্যবহার করে সমাপ্তির জন্য পরীক্ষা করার উদাহরণের জন্য উপরে দেখুন।

ব্যবহারকারীর পছন্দ করার পরে বা ফর্মটি খারিজ করার পরে আপনার যদি কোনও ক্রিয়া সম্পাদন করতে হয়, তাহলে সেই যুক্তিটিকে কোডে রাখুন যা LoadAndShowConsentFormIfRequired() দ্বারা ফেরত দেওয়া Future পরিচালনা করে।

গোপনীয়তা বিকল্প

কিছু গোপনীয়তা বার্তা ফর্ম প্রকাশক-রেন্ডার করা গোপনীয়তা বিকল্প এন্ট্রি পয়েন্ট থেকে উপস্থাপিত হয়, ব্যবহারকারীদের যে কোনো সময় তাদের গোপনীয়তা বিকল্পগুলি পরিচালনা করতে দেয়। গোপনীয়তা বিকল্প এন্ট্রি পয়েন্টে আপনার ব্যবহারকারীরা কোন বার্তা দেখেন সে সম্পর্কে আরও জানতে, উপলব্ধ ব্যবহারকারী বার্তা প্রকারগুলি দেখুন।

ব্যবহারকারীর সম্মতিতে বিজ্ঞাপনের জন্য অনুরোধ করুন

বিজ্ঞাপনের অনুরোধ করার আগে, আপনি ব্যবহারকারীর কাছ থেকে সম্মতি পেয়েছেন কিনা তা পরীক্ষা করতে ConsentInfo::GetInstance()‑> CanRequestAds() ব্যবহার করুন:

সম্মতি সংগ্রহ করার সময় আপনি বিজ্ঞাপনের অনুরোধ করতে পারেন কিনা তা পরীক্ষা করার জন্য নিম্নলিখিত স্থানগুলি তালিকাভুক্ত করা হয়েছে:

  • UMP SDK বর্তমান অধিবেশনে সম্মতি সংগ্রহ করার পরে।
  • আপনি RequestConsentInfoUpdate() কল করার পরপরই। UMP SDK হয়ত আগের অ্যাপ সেশনে সম্মতি পেয়েছে।

সম্মতি সংগ্রহের প্রক্রিয়া চলাকালীন কোনো ত্রুটি দেখা দিলে, আপনি বিজ্ঞাপনের অনুরোধ করতে পারেন কিনা তা পরীক্ষা করে দেখুন। UMP SDK আগের অ্যাপ সেশনের সম্মতির স্ট্যাটাস ব্যবহার করে।

নিম্নলিখিত সম্পূর্ণ উদাহরণ আপডেট লুপ পোলিং ব্যবহার করে, কিন্তু আপনি অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপ নিরীক্ষণ করতে OnCompletion কলব্যাকগুলিও ব্যবহার করতে পারেন৷ আপনার কোড স্ট্রাকচারের সাথে মানানসই যে কোন কৌশলটি ব্যবহার করুন।

#include "firebase/future.h"
#include "firebase/gma/gma.h"
#include "firebase/gma/ump.h"

namespace gma = ::firebase::gma;
namespace ump = ::firebase::gma::ump;
using firebase::Future;

ump::ConsentInfo* g_consent_info = nullptr;
// State variable for tracking the UMP consent flow.
enum { kStart, kRequest, kLoadAndShow, kInitGma, kFinished, kErrorState } g_state = kStart;
bool g_ads_allowed = false;

void MyApplicationStart() {
  g_consent_info = ump::ConsentInfo::GetInstance(...);

  // Create a ConsentRequestParameters struct..
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age of consent.
  params.tag_for_under_age_of_consent = false;

  g_consent_info->RequestConsentInfoUpdate(params);
  // CanRequestAds() can return a cached value from a previous run immediately.
  g_ads_allowed = g_consent_info->CanRequestAds();
  g_state = kRequest;
}

// This function runs once per frame.
void MyGameUpdateLoop() {
  // [... other game logic here ...]

  if (g_state == kRequest) {
    Future<void> req_result = g_consent_info->RequestConsentInfoUpdateLastResult();

    if (req_result.status() == firebase::kFutureStatusComplete) {
      g_ads_allowed = g_consent_info->CanRequestAds();
      if (req_result.error() == ump::kConsentRequestSuccess) {
        // You must provide the FormParent (Android Activity or iOS UIViewController).
        ump::FormParent parent = GetMyFormParent();
        g_consent_info->LoadAndShowConsentFormIfRequired(parent);
        g_state = kLoadAndShow;
      } else {
        LogMessage("Error requesting consent status: %s", req_result.error_message());
        g_state = kErrorState;
      }
    }
  }
  if (g_state == kLoadAndShow) {
    Future<void> form_result = g_consent_info->LoadAndShowConsentFormIfRequiredLastResult();

    if (form_result.status() == firebase::kFutureStatusComplete) {
      g_ads_allowed = g_consent_info->CanRequestAds();
      if (form_result.error() == ump::kConsentRequestSuccess) {
        if (g_ads_allowed) {
          // Initialize GMA. This is another asynchronous operation.
          firebase::gma::Initialize();
          g_state = kInitGma;
        } else {
          g_state = kFinished;
        }
        // Optional: shut down the UMP SDK to save memory.
        delete g_consent_info;
        g_consent_info = nullptr;
      } else {
        LogMessage("Error displaying privacy message form: %s", form_result.error_message());
        g_state = kErrorState;
      }
    }
  }
  if (g_state == kInitGma && g_ads_allowed) {
    Future<gma::AdapterInitializationStatus> gma_future = gma::InitializeLastResult();

    if (gma_future.status() == firebase::kFutureStatusComplete) {
      if (gma_future.error() == gma::kAdErrorCodeNone) {
        g_state = kFinished;
        // TODO: Request an ad.
      } else {
        LogMessage("Error initializing GMA: %s", gma_future.error_message());
        g_state = kErrorState;
      }
    }
  }
}

টেস্টিং

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

  1. RequestConsentInfoUpdate() কল করুন।
  2. নিম্নলিখিত উদাহরণের অনুরূপ একটি বার্তার জন্য লগ আউটপুট পরীক্ষা করুন, যা আপনার ডিভাইস আইডি দেখায় এবং এটিকে একটি পরীক্ষা ডিভাইস হিসাবে কীভাবে যুক্ত করতে হয়:

    অ্যান্ড্রয়েড

    Use new ConsentDebugSettings.Builder().addTestDeviceHashedId("33BE2250B43518CCDA7DE426D04EE231")
    to set this as a debug device.
    

    iOS

    <UMP SDK>To enable debug mode for this device,
    set: UMPDebugSettings.testDeviceIdentifiers = @[2077ef9a63d2b398840261c8221a0c9b]
    
  3. আপনার ক্লিপবোর্ডে আপনার টেস্ট ডিভাইস আইডি কপি করুন।

  4. ConsentRequestParameters.debug_settings.debug_device_ids আপনার টেস্ট ডিভাইস আইডির তালিকায় সেট করতে আপনার কোড পরিবর্তন করুন।

    void MyApplicationStart() {
      ump::ConsentInfo consent_info = ump::ConsentInfo::GetInstance(...);
    
      ump::ConsentRequestParameters params;
      params.tag_for_under_age_of_consent = false;
      params.debug_settings.debug_device_ids = {"TEST-DEVICE-HASHED-ID"};
    
      consent_info->RequestConsentInfoUpdate(params);
    }
    

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

UMP SDK debug_settings.debug_geography ব্যবহার করে আপনার অ্যাপের আচরণ পরীক্ষা করার একটি উপায় প্রদান করে যেন ডিভাইসটি EEA বা UK-এর মতো বিভিন্ন অঞ্চলে অবস্থিত। মনে রাখবেন যে ডিবাগ সেটিংস শুধুমাত্র পরীক্ষা ডিভাইসে কাজ করে।

void MyApplicationStart() {
  ump::ConsentInfo consent_info = ump::ConsentInfo::GetInstance(...);

  ump::ConsentRequestParameters params;
  params.tag_for_under_age_of_consent = false;
  params.debug_settings.debug_device_ids = {"TEST-DEVICE-HASHED-ID"};
  // Geography appears as EEA for debug devices.
  params.debug_settings.debug_geography = ump::kConsentDebugGeographyEEA

  consent_info->RequestConsentInfoUpdate(params);
}

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

  ConsentInfo::GetInstance()->Reset();

,

Google ব্যবহারকারী মেসেজিং প্ল্যাটফর্ম (UMP) SDK হল একটি গোপনীয়তা এবং মেসেজিং টুল যা আপনাকে গোপনীয়তা পছন্দগুলি পরিচালনা করতে সহায়তা করে৷ আরও তথ্যের জন্য, গোপনীয়তা এবং বার্তাপ্রেরণ সম্পর্কে দেখুন।

পূর্বশর্ত

  • Android API স্তর 21 বা উচ্চতর (Android এর জন্য)

একটি বার্তা টাইপ তৈরি করুন

আপনার AdMob অ্যাকাউন্টের গোপনীয়তা এবং বার্তাপ্রেরণ ট্যাবের অধীনে উপলব্ধ ব্যবহারকারী বার্তাগুলির একটি দিয়ে ব্যবহারকারীর বার্তা তৈরি করুন৷ UMP SDK আপনার প্রজেক্টে সেট করা AdMob অ্যাপ্লিকেশন আইডি থেকে তৈরি একটি গোপনীয়তা বার্তা প্রদর্শন করার চেষ্টা করে।

আরো বিস্তারিত জানার জন্য, গোপনীয়তা এবং বার্তাপ্রেরণ সম্পর্কে দেখুন।

SDK ইনস্টল করুন

  1. Google মোবাইল বিজ্ঞাপন (GMA) C++ SDK ইনস্টল করার জন্য ধাপগুলি অনুসরণ করুন। UMP C++ SDK GMA C++ SDK-এর অন্তর্ভুক্ত।

  2. চালিয়ে যাওয়ার আগে প্রজেক্টে আপনার অ্যাপের AdMob অ্যাপ আইডি কনফিগার করেছেন তা নিশ্চিত করুন।

  3. আপনার কোডে, ConsentInfo::GetInstance() কল করে UMP SDK শুরু করুন।

    • অ্যান্ড্রয়েডে, আপনাকে NDK দ্বারা প্রদত্ত JNIEnv এবং Activity পাস করতে হবে। প্রথমবার যখন আপনি GetInstance() কল করবেন তখনই আপনাকে এটি করতে হবে।
    • বিকল্পভাবে, আপনি যদি ইতিমধ্যেই আপনার অ্যাপে Firebase C++ SDK ব্যবহার করে থাকেন, তাহলে আপনি একটি firebase::App এ প্রথমবার GetInstance() কল করলে পাস করতে পারেন।
    #include "firebase/gma/ump.h"
    
    namespace ump = ::firebase::gma::ump;
    
    // Initialize using a firebase::App
    void InitializeUserMessagingPlatform(const firebase::App& app) {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance(app);
    }
    
    // Initialize without a firebase::App
    #ifdef ANDROID
    void InitializeUserMessagingPlatform(JNIEnv* jni_env, jobject activity) {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance(jni_env, activity);
    }
    #else  // non-Android
    void InitializeUserMessagingPlatform() {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();
    }
    #endif
    

ConsentInfo::GetInstance() এর পরবর্তী কলগুলি একই উদাহরণ প্রদান করে।

আপনি যদি UMP SDK ব্যবহার করা শেষ করে থাকেন, তাহলে আপনি ConsentInfo উদাহরণ মুছে SDK বন্ধ করতে পারেন:

void ShutdownUserMessagingPlatform() {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();
  delete consent_info;
}

অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপ নিরীক্ষণ করতে একটি Future ব্যবহার করুন

একটি firebase::Future আপনাকে অ্যাসিঙ্ক্রোনাস মেথড কলের সমাপ্তির স্থিতি নির্ধারণ করার একটি উপায় প্রদান করে।

সমস্ত UMP C++ ফাংশন এবং মেথড কল যেগুলি অ্যাসিঙ্ক্রোনাসভাবে কাজ করে একটি Future ফেরত দেয়, এবং সাম্প্রতিক অপারেশন থেকে Future পুনরুদ্ধার করার জন্য একটি "শেষ ফলাফল" ফাংশন প্রদান করে।

একটি Future থেকে ফলাফল প্রাপ্ত করার দুটি উপায় আছে:

  1. কল OnCompletion() , আপনার নিজস্ব কলব্যাক ফাংশন পাস করে, যা অপারেশন সম্পূর্ণ হলে বলা হয়।
  2. পর্যায়ক্রমে Future status() পরীক্ষা করুন। যখন অবস্থা kFutureStatusPending থেকে kFutureStatusCompleted এ পরিবর্তিত হয়, তখন অপারেশনটি সম্পন্ন হয়।

অ্যাসিঙ্ক্রোনাস অপারেশন শেষ হওয়ার পরে, অপারেশনের ত্রুটি কোড পেতে আপনার Future error() পরীক্ষা করা উচিত। যদি ত্রুটি কোডটি 0 হয় ( kConsentRequestSuccess বা kConsentFormSuccess ), অপারেশনটি সফলভাবে সম্পন্ন হয়েছে; অন্যথায়, কি ভুল হয়েছে তা নির্ধারণ করতে ত্রুটি কোড এবং error_message() পরীক্ষা করুন।

সমাপ্তি কলব্যাক

একটি সমাপ্তি কলব্যাক সেট করতে কীভাবে OnCompletion ব্যবহার করবেন তার একটি উদাহরণ এখানে দেওয়া হল, যা অ্যাসিঙ্ক্রোনাস অপারেশন সম্পূর্ণ হলে বলা হয়।

void MyApplicationStart() {
  // [... other app initialization code ...]

  ump::ConsentInfo *consent_info = ump::ConsentInfo::GetInstance();

  // See the section below for more information about RequestConsentInfoUpdate.
  firebase::Future<void> result = consent_info->RequestConsentInfoUpdate(...);

  result.OnCompletion([](const firebase::Future<void>& req_result) {
    if (req_result.error() == ump::kConsentRequestSuccess) {
      // Operation succeeded. You can now call LoadAndShowConsentFormIfRequired().
    } else {
      // Operation failed. Check req_result.error_message() for more information.
    }
  });
}

লুপ পোলিং আপডেট করুন

এই উদাহরণে, অ্যাপ লঞ্চের সময় একটি অ্যাসিঙ্ক্রোনাস অপারেশন শুরু হওয়ার পরে, গেমের আপডেট লুপ ফাংশনে (যা প্রতি ফ্রেমে একবার চলে) ফলাফলগুলি অন্য কোথাও পরীক্ষা করা হয়।

ump::ConsentInfo *g_consent_info = nullptr;
bool g_waiting_for_request = false;

void MyApplicationStart() {
  // [... other app initialization code ...]

  g_consent_info = ump::ConsentInfo::GetInstance();
  // See the section below for more information about RequestConsentInfoUpdate.
  g_consent_info->RequestConsentInfoUpdate(...);
  g_waiting_for_request = true;
}

// Elsewhere, in the game's update loop, which runs once per frame:
void MyGameUpdateLoop() {
  // [... other game logic here ...]

  if (g_waiting_for_request) {
    // Check whether RequestConsentInfoUpdate() has finished.
    // Calling "LastResult" returns the Future for the most recent operation.
    firebase::Future<void> result =
      g_consent_info->RequestConsentInfoUpdateLastResult();

    if (result.status() == firebase::kFutureStatusComplete) {
      g_waiting_for_request = false;
      if (result.error() == ump::kConsentRequestSuccess) {
        // Operation succeeded. You can call LoadAndShowConsentFormIfRequired().
      } else {
        // Operation failed. Check result.error_message() for more information.
      }
    }
  }
}

firebase::Future সম্পর্কে আরও তথ্যের জন্য, Firebase C++ SDK ডকুমেন্টেশন এবং GMA C++ SDK ডকুমেন্টেশন দেখুন।

RequestConsentInfoUpdate() ব্যবহার করে প্রতিটি অ্যাপ লঞ্চের সময় আপনার ব্যবহারকারীর সম্মতির তথ্য আপডেট করার অনুরোধ করা উচিত। এই অনুরোধ নিম্নলিখিত পরীক্ষা করে:

  • সম্মতি প্রয়োজন কিনা । উদাহরণস্বরূপ, প্রথমবারের জন্য সম্মতি প্রয়োজন, বা পূর্ববর্তী সম্মতির সিদ্ধান্তের মেয়াদ শেষ হয়ে গেছে।
  • একটি গোপনীয়তা বিকল্প এন্ট্রি পয়েন্ট প্রয়োজন কিনা . কিছু গোপনীয়তা বার্তার জন্য অ্যাপের প্রয়োজন হয় যাতে ব্যবহারকারীরা যে কোনো সময় তাদের গোপনীয়তা বিকল্পগুলি পরিবর্তন করতে পারেন।
#include "firebase/gma/ump.h"

namespace ump = ::firebase::gma::ump;

void MyApplicationStart(ump::FormParent parent) {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();

  // Create a ConsentRequestParameters struct..
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age of consent.
  params.tag_for_under_age_of_consent = false;

  consent_info->RequestConsentInfoUpdate(params).OnCompletion(
    [*](const Future<void>& req_result) {
      if (req_result.error() != ump::kConsentRequestSuccess) {
        // req_result.error() is a kConsentRequestError enum.
        LogMessage("Error requesting consent update: %s", req_result.error_message());
      }
      // Consent information is successfully updated.
    });
}

গোপনীয়তা বার্তা ফর্মটি লোড করুন এবং উপস্থাপন করুন

আপনি সর্বাধিক আপ-টু-ডেট সম্মতির স্থিতি পাওয়ার পরে, ব্যবহারকারীর সম্মতি সংগ্রহের জন্য প্রয়োজনীয় যে কোনও ফর্ম লোড করতে LoadAndShowConsentFormIfRequired() এ কল করুন। লোড করার পরে, ফর্মগুলি অবিলম্বে উপস্থিত হয়।

#include "firebase/gma/ump.h"

namespace ump = ::firebase::gma::ump;

void MyApplicationStart(ump::FormParent parent) {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();

  // Create a ConsentRequestParameters struct..
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age of consent.
  params.tag_for_under_age_of_consent = false;

  consent_info->RequestConsentInfoUpdate(params).OnCompletion(
    [*](const Future<void>& req_result) {
      if (req_result.error() != ump::kConsentRequestSuccess) {
        // req_result.error() is a kConsentRequestError enum.
        LogMessage("Error requesting consent update: %s", req_result.error_message());
      } else {
        consent_info->LoadAndShowConsentFormIfRequired(parent).OnCompletion(
        [*](const Future<void>& form_result) {
          if (form_result.error() != ump::kConsentFormSuccess) {
            // form_result.error() is a kConsentFormError enum.
            LogMessage("Error showing privacy message form: %s", form_result.error_message());
          } else {
            // Either the form was shown and completed by the user, or consent was not required.
          }
        });
      }
    });
}

একটি সম্পূর্ণ কলব্যাকের পরিবর্তে আপডেট লুপ পোলিং ব্যবহার করে সমাপ্তির জন্য পরীক্ষা করার উদাহরণের জন্য উপরে দেখুন।

ব্যবহারকারীর পছন্দ করার পরে বা ফর্মটি খারিজ করার পরে আপনার যদি কোনও ক্রিয়া সম্পাদন করতে হয়, তাহলে সেই যুক্তিটিকে কোডে রাখুন যা LoadAndShowConsentFormIfRequired() দ্বারা ফেরত দেওয়া Future পরিচালনা করে।

গোপনীয়তা বিকল্প

কিছু গোপনীয়তা বার্তা ফর্ম প্রকাশক-রেন্ডার করা গোপনীয়তা বিকল্প এন্ট্রি পয়েন্ট থেকে উপস্থাপিত হয়, ব্যবহারকারীদের যে কোনো সময় তাদের গোপনীয়তা বিকল্পগুলি পরিচালনা করতে দেয়। গোপনীয়তা বিকল্প এন্ট্রি পয়েন্টে আপনার ব্যবহারকারীরা কোন বার্তা দেখেন সে সম্পর্কে আরও জানতে, উপলব্ধ ব্যবহারকারী বার্তা প্রকারগুলি দেখুন।

ব্যবহারকারীর সম্মতিতে বিজ্ঞাপনের জন্য অনুরোধ করুন

বিজ্ঞাপনের অনুরোধ করার আগে, আপনি ব্যবহারকারীর কাছ থেকে সম্মতি পেয়েছেন কিনা তা পরীক্ষা করতে ConsentInfo::GetInstance()‑> CanRequestAds() ব্যবহার করুন:

সম্মতি সংগ্রহ করার সময় আপনি বিজ্ঞাপনের অনুরোধ করতে পারেন কিনা তা পরীক্ষা করার জন্য নিম্নলিখিত স্থানগুলি তালিকাভুক্ত করা হয়েছে:

  • UMP SDK বর্তমান অধিবেশনে সম্মতি সংগ্রহ করার পরে।
  • আপনি RequestConsentInfoUpdate() কল করার পরপরই। UMP SDK হয়ত আগের অ্যাপ সেশনে সম্মতি পেয়েছে।

সম্মতি সংগ্রহের প্রক্রিয়া চলাকালীন কোনো ত্রুটি দেখা দিলে, আপনি বিজ্ঞাপনের অনুরোধ করতে পারেন কিনা তা পরীক্ষা করে দেখুন। UMP SDK আগের অ্যাপ সেশনের সম্মতির স্ট্যাটাস ব্যবহার করে।

নিম্নলিখিত সম্পূর্ণ উদাহরণ আপডেট লুপ পোলিং ব্যবহার করে, কিন্তু আপনি অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপ নিরীক্ষণ করতে OnCompletion কলব্যাকগুলিও ব্যবহার করতে পারেন৷ আপনার কোড স্ট্রাকচারের সাথে মানানসই যে কোন কৌশলটি ব্যবহার করুন।

#include "firebase/future.h"
#include "firebase/gma/gma.h"
#include "firebase/gma/ump.h"

namespace gma = ::firebase::gma;
namespace ump = ::firebase::gma::ump;
using firebase::Future;

ump::ConsentInfo* g_consent_info = nullptr;
// State variable for tracking the UMP consent flow.
enum { kStart, kRequest, kLoadAndShow, kInitGma, kFinished, kErrorState } g_state = kStart;
bool g_ads_allowed = false;

void MyApplicationStart() {
  g_consent_info = ump::ConsentInfo::GetInstance(...);

  // Create a ConsentRequestParameters struct..
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age of consent.
  params.tag_for_under_age_of_consent = false;

  g_consent_info->RequestConsentInfoUpdate(params);
  // CanRequestAds() can return a cached value from a previous run immediately.
  g_ads_allowed = g_consent_info->CanRequestAds();
  g_state = kRequest;
}

// This function runs once per frame.
void MyGameUpdateLoop() {
  // [... other game logic here ...]

  if (g_state == kRequest) {
    Future<void> req_result = g_consent_info->RequestConsentInfoUpdateLastResult();

    if (req_result.status() == firebase::kFutureStatusComplete) {
      g_ads_allowed = g_consent_info->CanRequestAds();
      if (req_result.error() == ump::kConsentRequestSuccess) {
        // You must provide the FormParent (Android Activity or iOS UIViewController).
        ump::FormParent parent = GetMyFormParent();
        g_consent_info->LoadAndShowConsentFormIfRequired(parent);
        g_state = kLoadAndShow;
      } else {
        LogMessage("Error requesting consent status: %s", req_result.error_message());
        g_state = kErrorState;
      }
    }
  }
  if (g_state == kLoadAndShow) {
    Future<void> form_result = g_consent_info->LoadAndShowConsentFormIfRequiredLastResult();

    if (form_result.status() == firebase::kFutureStatusComplete) {
      g_ads_allowed = g_consent_info->CanRequestAds();
      if (form_result.error() == ump::kConsentRequestSuccess) {
        if (g_ads_allowed) {
          // Initialize GMA. This is another asynchronous operation.
          firebase::gma::Initialize();
          g_state = kInitGma;
        } else {
          g_state = kFinished;
        }
        // Optional: shut down the UMP SDK to save memory.
        delete g_consent_info;
        g_consent_info = nullptr;
      } else {
        LogMessage("Error displaying privacy message form: %s", form_result.error_message());
        g_state = kErrorState;
      }
    }
  }
  if (g_state == kInitGma && g_ads_allowed) {
    Future<gma::AdapterInitializationStatus> gma_future = gma::InitializeLastResult();

    if (gma_future.status() == firebase::kFutureStatusComplete) {
      if (gma_future.error() == gma::kAdErrorCodeNone) {
        g_state = kFinished;
        // TODO: Request an ad.
      } else {
        LogMessage("Error initializing GMA: %s", gma_future.error_message());
        g_state = kErrorState;
      }
    }
  }
}

টেস্টিং

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

  1. RequestConsentInfoUpdate() কল করুন।
  2. নিম্নলিখিত উদাহরণের অনুরূপ একটি বার্তার জন্য লগ আউটপুট পরীক্ষা করুন, যা আপনার ডিভাইস আইডি দেখায় এবং এটিকে একটি পরীক্ষা ডিভাইস হিসাবে কীভাবে যুক্ত করতে হয়:

    অ্যান্ড্রয়েড

    Use new ConsentDebugSettings.Builder().addTestDeviceHashedId("33BE2250B43518CCDA7DE426D04EE231")
    to set this as a debug device.
    

    iOS

    <UMP SDK>To enable debug mode for this device,
    set: UMPDebugSettings.testDeviceIdentifiers = @[2077ef9a63d2b398840261c8221a0c9b]
    
  3. আপনার ক্লিপবোর্ডে আপনার টেস্ট ডিভাইস আইডি কপি করুন।

  4. ConsentRequestParameters.debug_settings.debug_device_ids আপনার টেস্ট ডিভাইস আইডির তালিকায় সেট করতে আপনার কোড পরিবর্তন করুন।

    void MyApplicationStart() {
      ump::ConsentInfo consent_info = ump::ConsentInfo::GetInstance(...);
    
      ump::ConsentRequestParameters params;
      params.tag_for_under_age_of_consent = false;
      params.debug_settings.debug_device_ids = {"TEST-DEVICE-HASHED-ID"};
    
      consent_info->RequestConsentInfoUpdate(params);
    }
    

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

UMP SDK debug_settings.debug_geography ব্যবহার করে আপনার অ্যাপের আচরণ পরীক্ষা করার একটি উপায় প্রদান করে যেন ডিভাইসটি EEA বা UK-এর মতো বিভিন্ন অঞ্চলে অবস্থিত। মনে রাখবেন যে ডিবাগ সেটিংস শুধুমাত্র পরীক্ষা ডিভাইসে কাজ করে।

void MyApplicationStart() {
  ump::ConsentInfo consent_info = ump::ConsentInfo::GetInstance(...);

  ump::ConsentRequestParameters params;
  params.tag_for_under_age_of_consent = false;
  params.debug_settings.debug_device_ids = {"TEST-DEVICE-HASHED-ID"};
  // Geography appears as EEA for debug devices.
  params.debug_settings.debug_geography = ump::kConsentDebugGeographyEEA

  consent_info->RequestConsentInfoUpdate(params);
}

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

  ConsentInfo::GetInstance()->Reset();