এই ডেভেলপার গাইডটিতে একটি মোবাইল অ্যাপ্লিকেশনে গুগল ট্যাগ ম্যানেজার কীভাবে প্রয়োগ করতে হয়, তা বর্ণনা করা হয়েছে।
ভূমিকা
গুগল ট্যাগ ম্যানেজার ডেভেলপারদেরকে অ্যাপ মার্কেটপ্লেসগুলিতে অ্যাপ্লিকেশন বাইনারিগুলি পুনর্নির্মাণ ও পুনরায় জমা না দিয়েই, গুগল ট্যাগ ম্যানেজার ইন্টারফেস ব্যবহার করে তাদের মোবাইল অ্যাপ্লিকেশনের কনফিগারেশন মান পরিবর্তন করার সুযোগ দেয়।
এটি আপনার অ্যাপ্লিকেশনের যেকোনো কনফিগারেশন মান বা ফ্ল্যাগ পরিচালনা করার জন্য উপযোগী, যা ভবিষ্যতে আপনার পরিবর্তন করার প্রয়োজন হতে পারে, যার মধ্যে অন্তর্ভুক্ত রয়েছে:
- বিভিন্ন UI সেটিংস এবং ডিসপ্লে স্ট্রিং
- আপনার অ্যাপ্লিকেশনে পরিবেশিত বিজ্ঞাপনের আকার, অবস্থান বা প্রকার
- গেমের সেটিংস
নিয়ম ব্যবহার করে রানটাইমেও কনফিগারেশন মানগুলো মূল্যায়ন করা যেতে পারে, যা নিম্নলিখিত ধরনের ডাইনামিক কনফিগারেশন সক্ষম করে:
- স্ক্রিনের আকার ব্যবহার করে বিজ্ঞাপনের ব্যানারের আকার নির্ধারণ করা
- ভাষা এবং অবস্থান ব্যবহার করে UI উপাদান কনফিগার করা
গুগল ট্যাগম্যানেজার অ্যাপ্লিকেশনগুলিতে ট্র্যাকিং ট্যাগ এবং পিক্সেলের ডায়নামিক বাস্তবায়নও সক্ষম করে। ডেভেলপাররা গুরুত্বপূর্ণ ইভেন্টগুলিকে একটি ডেটা লেয়ারে পুশ করতে পারেন এবং পরে সিদ্ধান্ত নিতে পারেন কোন ট্র্যাকিং ট্যাগ বা পিক্সেলগুলি ফায়ার করা হবে। ট্যাগম্যানেজার নিম্নলিখিত ট্যাগগুলি সমর্থন করে:
- গুগল মোবাইল অ্যাপ অ্যানালিটিক্স
- কাস্টম ফাংশন কল ট্যাগ
শুরু করার আগে
এই সূচনা নির্দেশিকাটি ব্যবহার করার আগে, আপনার নিম্নলিখিত জিনিসগুলির প্রয়োজন হবে:
- একটি গুগল ট্যাগ ম্যানেজার অ্যাকাউন্ট
- একটি নতুন ট্যাগ ম্যানেজার কন্টেইনার এবং মান সংগ্রহ ম্যাক্রো
- অ্যান্ড্রয়েডের জন্য একটি মোবাইল অ্যাপ্লিকেশন, যাতে গুগল ট্যাগ ম্যানেজার প্রয়োগ করা যাবে।
- গুগল অ্যানালিটিক্স সার্ভিসেস এসডিকে , যার মধ্যে ট্যাগ ম্যানেজার লাইব্রেরিটি রয়েছে।
আপনি যদি গুগল ট্যাগ ম্যানেজারে নতুন হন, তাহলে এই নির্দেশিকাটি চালিয়ে যাওয়ার আগে আমরা আপনাকে কন্টেইনার, ম্যাক্রো এবং রুলস (হেল্প সেন্টার) সম্পর্কে আরও জেনে নেওয়ার পরামর্শ দিচ্ছি।
শুরু করা
এই বিভাগটি ডেভেলপারদের একটি সাধারণ ট্যাগ ম্যানেজার ওয়ার্কফ্লো সম্পর্কে নির্দেশনা দেবে:
- আপনার প্রজেক্টে গুগল ট্যাগ ম্যানেজার এসডিকে যোগ করুন
- ডিফল্ট কন্টেইনার মান সেট করুন
- পাত্রটি খুলুন
- কন্টেইনার থেকে কনফিগারেশন মানগুলি নিন
- ডেটালেয়ারে ইভেন্টগুলি পুশ করুন
- কন্টেইনারটির প্রিভিউ দেখুন ও প্রকাশ করুন
১. আপনার প্রজেক্টে গুগল ট্যাগ ম্যানেজার এসডিকে যোগ করা
Google Tag Manager SDK ব্যবহার করার আগে, আপনাকে SDK প্যাকেজটি এক্সট্র্যাক্ট করতে হবে, লাইব্রেরিটি আপনার প্রোজেক্টের বিল্ড পাথে যুক্ত করতে হবে এবং আপনার AndroidManifest.xml ফাইলে পারমিশন যোগ করতে হবে।
প্রথমে, আপনার প্রজেক্টের /libs ফোল্ডারে Google Tag Manager লাইব্রেরিটি যুক্ত করুন।
এরপরে, নিম্নলিখিত অনুমতিগুলি ব্যবহার করার জন্য আপনার AndroidManifest.xml ফাইলটি আপডেট করুন:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
২. আপনার প্রজেক্টে একটি ডিফল্ট কন্টেইনার ফাইল যোগ করা
গুগল ট্যাগ ম্যানেজার আপনার অ্যাপ্লিকেশনটি প্রথমবার চালানোর সময় একটি ডিফল্ট কন্টেইনার ব্যবহার করে। অ্যাপটি নেটওয়ার্কের মাধ্যমে একটি নতুন কন্টেইনার খুঁজে না পাওয়া পর্যন্ত এই ডিফল্ট কন্টেইনারটিই ব্যবহৃত হতে থাকবে।
আপনার অ্যাপ্লিকেশনে একটি ডিফল্ট কন্টেইনার বাইনারি ডাউনলোড ও যোগ করতে, এই ধাপগুলো অনুসরণ করুন:
- গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে সাইন ইন করুন।
- আপনি কন্টেইনারটির যে সংস্করণটি ডাউনলোড করতে চান, তা নির্বাচন করুন।
- কন্টেইনার বাইনারিটি পেতে ডাউনলোড বোতামে ক্লিক করুন।
- বাইনারি ফাইলটি নিম্নলিখিত পাথে যোগ করুন:
< project-root >/assets/tagmanager/
ডিফল্ট ফাইলের নাম কন্টেইনার আইডি হওয়া উচিত (উদাহরণস্বরূপ GTM-1234 )। বাইনারি ফাইলটি ডাউনলোড করার পর, সঠিক নামকরণের নিয়ম অনুসরণ নিশ্চিত করতে ফাইলের নাম থেকে ভার্সন সাফিক্সটি সরিয়ে ফেলুন।
যদিও বাইনারি ফাইল ব্যবহার করার পরামর্শ দেওয়া হয়, যদি আপনার কন্টেইনারে কোনো নিয়ম বা ট্যাগ না থাকে, তবে আপনি এর পরিবর্তে একটি JSON ফাইল ব্যবহার করতে পারেন। ফাইলটি আপনার অ্যান্ড্রয়েড প্রজেক্টের একটি নতুন /assets/tagmanager ফোল্ডারে থাকতে হবে এবং এর নামকরণের নিয়মটি হবে: <Container_ID>.json । উদাহরণস্বরূপ, যদি আপনার কন্টেইনার আইডি GTM-1234 হয়, তাহলে আপনার ডিফল্ট কন্টেইনার ভ্যালুগুলো /assets/tagmanager/GTM-1234.json ফাইলে যোগ করতে হবে।
৩. একটি পাত্র খোলা
একটি কন্টেইনার থেকে মান পুনরুদ্ধার করার আগে, আপনার অ্যাপ্লিকেশনটিকে কন্টেইনারটি খুলতে হবে। একটি কন্টেইনার খুললে তা ডিস্ক থেকে লোড হবে (যদি উপলব্ধ থাকে), অথবা নেটওয়ার্ক থেকে অনুরোধ করা হবে (যদি প্রয়োজন হয়)।
অ্যান্ড্রয়েডে একটি কন্টেইনার খোলার সবচেয়ে সহজ উপায় হলো ContainerOpener.openContainer(..., Notifier notifier) ব্যবহার করা, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:
import com.google.tagmanager.Container; import com.google.tagmanager.ContainerOpener; import com.google.tagmanager.ContainerOpener.OpenType; import com.google.tagmanager.TagManager; import android.app.Activity; import android.os.Bundle; public class RacingGame { // Add your public container ID. private static final String CONTAINER_ID = "GTM-YYYY"; volatile private Container mContainer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TagManager mTagManager = TagManager.getInstance(this); // The container is returned to containerFuture when available. ContainerOpener.openContainer( mTagManager, // TagManager instance. CONTAINER_ID, // Tag Manager Container ID. OpenType.PREFER_NON_DEFAULT, // Prefer not to get the default container, but stale is OK. null, // Time to wait for saved container to load (ms). Default is 2000ms. new ContainerOpener.Notifier() { // Called when container loads. @Override public void containerAvailable(Container container) { // Handle assignment in callback to avoid blocking main thread. mContainer = container; } } ); // Rest of your onCreate code. } }
এই উদাহরণে, লোকাল স্টোরেজ থেকে একটি সংরক্ষিত কন্টেইনার অনুরোধ করার জন্য ContainerOpener.openContainer(..., Notifier notifier) ব্যবহার করা হয়েছে। containerAvailable কলব্যাকে mContainer এর অ্যাসাইনমেন্ট পরিচালনা করার মাধ্যমে আমরা নিশ্চিত করি যে মেইন থ্রেড ব্লক না হয়। যদি সংরক্ষিত কন্টেইনারটি ১২ ঘণ্টার বেশি পুরোনো হয়, তবে এই কলটি নেটওয়ার্কের মাধ্যমে অ্যাসিঙ্ক্রোনাসভাবে একটি নতুন কন্টেইনার আনার জন্য একটি অনুরোধও শিডিউল করবে।
এই নমুনা বাস্তবায়নটি ContainerOpener কনভেনিয়েন্স ক্লাস ব্যবহার করে একটি কন্টেইনার খোলা এবং তার থেকে মান পুনরুদ্ধার করার সবচেয়ে সহজ উপায় উপস্থাপন করে। আরও উন্নত বাস্তবায়ন বিকল্পের জন্য, উন্নত কনফিগারেশন (Advanced Configuration) দেখুন।
৪. কন্টেইনার থেকে কনফিগারেশন মানগুলি সংগ্রহ করা
কন্টেইনারটি খোলা হয়ে গেলে, get<type>Value() মেথডগুলো ব্যবহার করে কনফিগারেশন ভ্যালুগুলো পুনরুদ্ধার করা যেতে পারে:
// Retrieving a configuration value from a Tag Manager Container. // Get the configuration value by key. String title = mContainer.getStringValue("title_string");
অস্তিত্বহীন কী দিয়ে করা অনুরোধগুলি অনুরোধকৃত প্রকারের জন্য উপযুক্ত একটি ডিফল্ট মান ফেরত দেবে:
// Empty keys will return a default value depending on the type requested. // Key does not exist. An empty string is returned. string subtitle = container.getStringValue("Non-existent-key"); subtitle.equals(""); // Evaluates to true.
৫. ডেটালেয়ারে মানসমূহ প্রেরণ করা
ডেটালেয়ার হলো একটি ম্যাপ, যা আপনার অ্যাপের রানটাইম তথ্য, যেমন টাচ ইভেন্ট বা স্ক্রিন ভিউ, একটি কন্টেইনারের মধ্যে থাকা ট্যাগ ম্যানেজার ম্যাক্রো এবং ট্যাগগুলোর কাছে উপলব্ধ করে তোলে।
উদাহরণস্বরূপ, DataLayer ম্যাপে স্ক্রিন ভিউ সম্পর্কিত তথ্য পুশ করার মাধ্যমে, আপনি আপনার অ্যাপে হার্ড কোড করার প্রয়োজন ছাড়াই ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে ট্যাগ সেট আপ করতে পারেন, যা ঐ স্ক্রিনভিউগুলোর প্রতিক্রিয়ায় কনভার্সন পিক্সেল এবং ট্র্যাকিং কল চালু করবে।
push() এবং ` DataLayer.mapOf() হেল্পার মেথড ব্যবহার করে ইভেন্টগুলো `DataLayer`-এ পুশ করা হয়:
// // MainActivity.java // Pushing an openScreen event with a screen name into the data layer. // import com.google.tagmanager.TagManager; import com.google.tagmanager.DataLayer; import android.app.Activity; import android.os.Bundle; public MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // This screen becomes visible when Activity.onStart() is called. public void onStart() { super.onStart(); // The container should have already been opened, otherwise events pushed to // the DataLayer will not fire tags in that container. DataLayer dataLayer = TagManager.getInstance(this).getDataLayer(); dataLayer.push(DataLayer.mapOf("event", "openScreen", // The event type. This value should be used consistently for similar event types. "screenName", // Writes a key "screenName" to the dataLayer map. "Home Screen") // Writes a value "Home Screen" for the "screenName" key. ); } // Rest of the Activity implementation }
ওয়েব ইন্টারফেসে, আপনি এখন প্রতিটি স্ক্রিন ভিউয়ের জন্য ট্যাগ (যেমন গুগল অ্যানালিটিক্স ট্যাগ) ফায়ার করার জন্য এই নিয়মটি তৈরি করতে পারেন: equals "openScreen"। এই ট্যাগগুলির কোনো একটিতে স্ক্রিনের নাম পাস করার জন্য, একটি ডেটা লেয়ার ম্যাক্রো তৈরি করুন যা ডেটা লেয়ারের "screenName" কী-টিকে রেফারেন্স করে। এছাড়াও, আপনি শুধুমাত্র নির্দিষ্ট স্ক্রিন ভিউয়ের জন্য একটি ট্যাগ (যেমন গুগল অ্যাডস কনভার্সন পিক্সেল) ফায়ার করার জন্য একটি নিয়ম তৈরি করতে পারেন যেখানে equals "openScreen" && equals "ConfirmationScreen"।
৬. একটি কন্টেইনারের প্রিভিউ দেখা ও প্রকাশ করা
ম্যাক্রো মানগুলি সর্বদা বর্তমান প্রকাশিত সংস্করণের সাথে সামঞ্জস্যপূর্ণ থাকবে। একটি কন্টেইনারের সর্বশেষ সংস্করণ প্রকাশ করার আগে, আপনি আপনার খসড়া কন্টেইনারটি প্রিভিউ করতে পারেন।
একটি কন্টেইনার প্রিভিউ করার জন্য, গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে একটি প্রিভিউ ইউআরএল তৈরি করুন। এর জন্য, আপনি যে কন্টেইনারটির ভার্সন প্রিভিউ করতে চান সেটি নির্বাচন করুন এবং তারপর Preview ' সিলেক্ট করুন। এই প্রিভিউ ইউআরএলটি সেভ করে রাখুন, কারণ পরবর্তী ধাপগুলোতে আপনার এটি প্রয়োজন হবে।

এরপরে, আপনার অ্যাপ্লিকেশনের AndroidManifest.xml ফাইলে নিম্নলিখিত Activity-টি যোগ করুন:
<!-- Google Tag Manager Preview Activity --> <activity android:name="com.google.tagmanager.PreviewActivity" android:label="@string/app_name" android:noHistory="true" > <!-- Optional, removes the PreviewActivity from activity stack. --> <intent-filter> <data android:scheme="tagmanager.c.application_package_name" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter> </activity>
আপনার অ্যাপে ড্রাফট কন্টেইনারটির প্রিভিউ দেখতে এমুলেটর বা ফিজিক্যাল ডিভাইসে লিঙ্কটি খুলুন।
যখন আপনি আপনার অ্যাপ্লিকেশনের জন্য খসড়া কনফিগারেশন মানগুলো উপলব্ধ করতে প্রস্তুত হবেন, তখন কন্টেইনারটি পাবলিশ করুন ।
উন্নত কনফিগারেশন
গুগল ট্যাগ ম্যানেজার ফর মোবাইল-এ বেশ কিছু উন্নত কনফিগারেশন অপশন রয়েছে, যা আপনাকে রুল ব্যবহার করে রানটাইম কন্ডিশনের উপর ভিত্তি করে ভ্যালু নির্বাচন করতে, ম্যানুয়ালি কন্টেইনার রিফ্রেশ করতে এবং কন্টেইনার খোলার জন্য অতিরিক্ত অপশন পেতে সাহায্য করে। নিম্নলিখিত বিভাগগুলিতে সবচেয়ে প্রচলিত কয়েকটি উন্নত কনফিগারেশনের রূপরেখা দেওয়া হয়েছে।
কন্টেইনার খোলার উন্নত বিকল্প
গুগল ট্যাগ ম্যানেজার এসডিকে কন্টেইনার খোলার জন্য বেশ কিছু পদ্ধতি প্রদান করে, যা আপনাকে লোডিং প্রক্রিয়ার উপর আরও বেশি নিয়ন্ত্রণ দিতে পারে:
ট্যাগম্যানেজার.ওপেনকন্টেইনার()
TagManager.openContainer() হলো একটি কন্টেইনার খোলার জন্য সর্বনিম্ন স্তরের এবং সবচেয়ে নমনীয় API। এটি তাৎক্ষণিকভাবে একটি ডিফল্ট কন্টেইনার সহ রিটার্ন করে এবং যদি কোনো সংরক্ষিত কন্টেইনার না থাকে, অথবা সংরক্ষিত কন্টেইনারটি সতেজ না হয় (> ১২ ঘন্টা পুরোনো), তবে এটি ডিস্ক বা নেটওয়ার্ক থেকে অ্যাসিঙ্ক্রোনাসভাবে একটি কন্টেইনার লোড করে।
mContainer = tagManager.openContainer(CONTAINER_ID, new Container.Callback() { // Called when a refresh is about to begin for the given refresh type. @Override public void containerRefreshBegin(Container container, RefreshType refreshType) { // Notify UI that the Container refresh is beginning. } // Called when a successful refresh occurred for the given refresh type. @Override public void containerRefreshSuccess(Container container, RefreshType refreshType]) { // Notify UI that Container is ready. } // Called when a refresh failed for the given refresh type. @Override public void containerRefreshFailure(Container container, RefreshType refreshType, RefreshFailure refreshFailure) { // Notify UI that the Container refresh has failed. }
লোডিং প্রক্রিয়া চলাকালীন, TagManager.openContainer() বেশ কয়েকটি লাইফসাইকেল কলব্যাক জারি করে, যাতে আপনার কোড জানতে পারে লোডিং অনুরোধটি কখন শুরু হয়, এটি ব্যর্থ বা সফল হয় কি না এবং কেন, এবং কন্টেইনারটি শেষ পর্যন্ত ডিস্ক থেকে নাকি নেটওয়ার্ক থেকে লোড হয়েছে।
যদি আপনার অ্যাপ্লিকেশনের জন্য ডিফল্ট মান ব্যবহার করা গ্রহণযোগ্য না হয়, তাহলে একটি সংরক্ষিত বা নেটওয়ার্ক কন্টেইনার কখন লোড হয়েছে তা জানার জন্য আপনাকে এই কলব্যাকগুলি ব্যবহার করতে হবে। মনে রাখবেন, যদি অ্যাপটি প্রথমবার চালানো হয় এবং কোনো নেটওয়ার্ক সংযোগ না থাকে, তাহলে আপনি কোনো সংরক্ষিত বা নেটওয়ার্ক কন্টেইনার লোড করতে পারবেন না।
TagManager.openContainer() এই কলব্যাকগুলিতে আর্গুমেন্ট হিসেবে নিম্নলিখিত enum মানগুলি প্রেরণ করে:
রিফ্রেশটাইপ
| মূল্য | বর্ণনা |
|---|---|
Container.Callback.SAVED | রিফ্রেশ অনুরোধটি স্থানীয়ভাবে সংরক্ষিত একটি কন্টেইনার লোড করছে। |
Container.Callback.NETWORK | রিফ্রেশ অনুরোধটি নেটওয়ার্কের মাধ্যমে একটি কন্টেইনার লোড করছে। |
রিফ্রেশ ব্যর্থতা
| মূল্য | বর্ণনা |
|---|---|
Container.Callback.NO_SAVED_CONTAINER | সংরক্ষিত কোনো কন্টেইনার উপলব্ধ নেই। |
Container.Callback.IO_ERROR | একটি I/O ত্রুটির কারণে কন্টেইনারটি রিফ্রেশ করা সম্ভব হয়নি। |
Container.Callback.NO_NETWORK | কোনো নেটওয়ার্ক সংযোগ উপলব্ধ নেই। |
Container.Callback.NETWORK_ERROR | একটি নেটওয়ার্ক ত্রুটি ঘটেছে। |
Container.Callback.SERVER_ERROR | সার্ভারে একটি ত্রুটি ঘটেছে। |
Container.Callback.UNKNOWN_ERROR | এমন একটি ত্রুটি ঘটেছে যাকে কোনো শ্রেণিতে ফেলা যায় না। |
নন-ডিফল্ট এবং নতুন কন্টেইনার খোলার পদ্ধতি
ContainerOpener TagManager.openContainer() র্যাপ করে এবং কন্টেইনার খোলার জন্য দুটি সুবিধাজনক মেথড প্রদান করে: ContainerOpener.openContainer(..., Notifier notifier) এবং ContainerOpener.openContainer(..., Long timeoutInMillis) ।
এই পদ্ধতিগুলোর প্রত্যেকটি একটি এনুমারেশন গ্রহণ করে, যা একটি নন-ডিফল্ট অথবা নতুন কন্টেইনারের জন্য অনুরোধ করে।
বেশিরভাগ অ্যাপ্লিকেশনের জন্য OpenType.PREFER_NON_DEFAULT ব্যবহার করার পরামর্শ দেওয়া হয় এবং এটি একটি নির্দিষ্ট টাইমআউট সময়ের মধ্যে ডিস্ক বা নেটওয়ার্ক থেকে প্রথম উপলব্ধ নন-ডিফল্ট কন্টেইনারটি ফেরত দেওয়ার চেষ্টা করে, এমনকি যদি সেই কন্টেইনারটি ১২ ঘণ্টার বেশি পুরানোও হয়। যদি এটি একটি পুরোনো সংরক্ষিত কন্টেইনার ফেরত দেয়, তবে এটি একটি নতুন কন্টেইনারের জন্য একটি অ্যাসিঙ্ক্রোনাস নেটওয়ার্ক অনুরোধও করবে। OpenType.PREFER_NON_DEFAULT ব্যবহার করার সময়, যদি অন্য কোনো কন্টেইনার উপলব্ধ না থাকে, অথবা যদি টাইমআউট সময়সীমা অতিক্রম করা হয়, তাহলে একটি ডিফল্ট কন্টেইনার ফেরত দেওয়া হবে।
OpenType.PREFER_FRESH নির্দিষ্ট টাইমআউট সময়ের মধ্যে ডিস্ক বা নেটওয়ার্ক থেকে একটি নতুন কন্টেইনার ফেরত দেওয়ার চেষ্টা করে। যদি নেটওয়ার্ক সংযোগ অনুপলব্ধ থাকে এবং/অথবা টাইমআউট সময় অতিক্রম করে, তবে এটি একটি সংরক্ষিত কন্টেইনার ফেরত দেয়।
যেসব ক্ষেত্রে দীর্ঘ অনুরোধ সময় ব্যবহারকারীর অভিজ্ঞতাকে লক্ষণীয়ভাবে প্রভাবিত করতে পারে, যেমন UI ফ্ল্যাগ বা ডিসপ্লে স্ট্রিং, সেখানে OpenType.PREFER_FRESH ব্যবহার করার পরামর্শ দেওয়া হয় না। এছাড়াও, একটি নেটওয়ার্ক কন্টেইনার অনুরোধ জোরপূর্বক করার জন্য আপনি যেকোনো সময় Container.refresh() ব্যবহার করতে পারেন।
এই দুটি সুবিধাজনক মেথডই নন-ব্লকিং। ContainerOpener.openContainer(..., Long timeoutInMillis) একটি ContainerOpener.ContainerFuture অবজেক্ট রিটার্ন করে, যার get মেথডটি লোড হওয়ার সাথে সাথেই একটি Container রিটার্ন করে (কিন্তু ততক্ষণ পর্যন্ত এটি ব্লক হয়ে থাকবে)। ContainerOpener.openContainer(..., Notifier notifier) মেথডটি একটিমাত্র কলব্যাক গ্রহণ করে, যা কন্টেইনারটি উপলব্ধ হলে কল করা হয় এবং এটি মেইন থ্রেডকে ব্লক হওয়া থেকে বাঁচাতে ব্যবহার করা যেতে পারে। উভয় মেথডেরই ডিফল্ট টাইমআউট পিরিয়ড হলো 2000 মিলিসেকেন্ড।
নিয়ম ব্যবহার করে রানটাইমে ম্যাক্রো মূল্যায়ন করা
কন্টেইনারগুলো রানটাইমে রুল ব্যবহার করে ভ্যালু মূল্যায়ন করতে পারে। রুলগুলো ডিভাইসের ভাষা, প্ল্যাটফর্ম বা অন্য কোনো ম্যাক্রো ভ্যালুর মতো মানদণ্ডের উপর ভিত্তি করে তৈরি হতে পারে। উদাহরণস্বরূপ, রানটাইমে ডিভাইসের ভাষার উপর ভিত্তি করে একটি স্থানীয় ডিসপ্লে স্ট্রিং নির্বাচন করতে রুল ব্যবহার করা যেতে পারে। নিম্নলিখিত রুলটি ব্যবহার করে এটি কনফিগার করা যায়:

এরপর আপনি প্রতিটি ভাষার জন্য ভ্যালু কালেকশন ম্যাক্রো তৈরি করতে পারেন এবং প্রতিটি ম্যাক্রোতে উপযুক্ত ভাষা কোড যুক্ত করে এই নিয়মটি যোগ করতে পারেন। যখন এই কন্টেইনারটি পাবলিশ করা হবে, তখন আপনার অ্যাপ্লিকেশনটি রানটাইমে ব্যবহারকারীর ডিভাইসের ভাষার উপর নির্ভর করে স্থানীয় ভাষার ডিসপ্লে স্ট্রিং প্রদর্শন করতে সক্ষম হবে।
মনে রাখবেন, যদি আপনার ডিফল্ট কন্টেইনারে নিয়মের প্রয়োজন হয়, তবে আপনাকে অবশ্যই একটি বাইনারি কন্টেইনার ফাইলকে আপনার ডিফল্ট কন্টেইনার হিসেবে ব্যবহার করতে হবে।
নিয়মাবলী কনফিগার করার বিষয়ে আরও জানুন (হেল্প সেন্টার)।
বাইনারি ডিফল্ট কন্টেইনার ফাইল
যেসব ডিফল্ট কন্টেইনারের জন্য নিয়মের প্রয়োজন, সেগুলোর ক্ষেত্রে ডিফল্ট কন্টেইনার হিসেবে JSON ফাইলের পরিবর্তে একটি বাইনারি কন্টেইনার ফাইল ব্যবহার করা উচিত। বাইনারি কন্টেইনারগুলো গুগল ট্যাগ ম্যানেজার নিয়মের মাধ্যমে রানটাইমে ম্যাক্রো ভ্যালু নির্ধারণ করার সুবিধা দেয়, কিন্তু JSON ফাইলগুলো তা দেয় না।
বাইনারি কন্টেইনার ফাইলগুলো গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেস থেকে ডাউনলোড করা যাবে এবং সেগুলো আপনার প্রোজেক্টের /assets/tagmanager/ ফোল্ডারে এই প্যাটার্ন অনুযায়ী যোগ করতে হবে: /assets/tagmanager/GTM-XXXX , যেখানে ফাইলের নামটি আপনার কন্টেইনার আইডি নির্দেশ করে।
যেসব ক্ষেত্রে একটি JSON ফাইল এবং একটি বাইনারি কন্টেইনার ফাইল উভয়ই উপস্থিত থাকে, সেখানে SDK ডিফল্ট কন্টেইনার হিসেবে বাইনারি কন্টেইনার ফাইলটি ব্যবহার করবে।
ফাংশন কল ম্যাক্রো ব্যবহার করে
ফাংশন কল ম্যাক্রো হলো এমন ম্যাক্রো যা আপনার অ্যাপ্লিকেশনের কোনো নির্দিষ্ট ফাংশনের রিটার্ন ভ্যালুতে সেট করা থাকে। ফাংশন কল ম্যাক্রো ব্যবহার করে আপনার গুগল ট্যাগ ম্যানেজার রুলসের সাথে রানটাইম ভ্যালু যুক্ত করা যায়; যেমন, ডিভাইসের কনফিগার করা ভাষা এবং মুদ্রার উপর ভিত্তি করে রানটাইমে নির্ধারণ করা যে একজন ব্যবহারকারীকে কোন মূল্যটি দেখানো হবে।
একটি ফাংশন কল ম্যাক্রো কনফিগার করতে:
- গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে ফাংশন কল ম্যাক্রোটি সংজ্ঞায়িত করুন। আর্গুমেন্টগুলো ঐচ্ছিকভাবে কী-ভ্যালু পেয়ার হিসেবে কনফিগার করা যেতে পারে।
- আপনার অ্যাপ্লিকেশনে একটি
FunctionCallMacroHandlerরেজিস্টার করতে,Container.registerFunctionCallMacroHandler()এবং Google Tag Manager ওয়েব ইন্টারফেসে কনফিগার করা ফাংশনের নামটি ব্যবহার করুন এবং এরgetValue()মেথডটি ওভাররাইড করুন:/** * Registers a function call macro handler. * * @param functionName The function name field, as defined in the Google Tag * Manager web interface. */ mContainer.registerFunctionCallMacroHandler(functionName, new FunctionCallMacroHandler() { /** * This code will execute when any custom macro's rule(s) evaluate to true. * The code should check the functionName and process accordingly. * * @param functionName Corresponds to the function name field defined * in the Google Tag Manager web interface. * @param parameters An optional map of parameters * as defined in the Google Tag Manager web interface. */ @Override public Object getValue(String functionName, Map<String, Object> parameters)) { if (functionName.equals("myConfiguredFunctionName")) { // Process and return the calculated value of this macro accordingly. return macro_value } return null; } });
ফাংশন কল ট্যাগ ব্যবহার করে
যখনই ডেটা লেয়ারে কোনো ইভেন্ট পুশ করা হয় এবং ট্যাগ নিয়মগুলো true হিসেবে প্রমাণিত হয়, তখন ফাংশন কল ট্যাগগুলো পূর্ব-নিবন্ধিত ফাংশনগুলোকে কার্যকর করতে সক্ষম করে।
একটি ফাংশন কল ট্যাগ কনফিগার করতে:
- গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে ফাংশন কল ট্যাগটি সংজ্ঞায়িত করুন। আর্গুমেন্টগুলো ঐচ্ছিকভাবে কী-ভ্যালু পেয়ার হিসেবে কনফিগার করা যেতে পারে।
- আপনার অ্যাপ্লিকেশনে একটি ফাংশন কল ট্যাগ হ্যান্ডলার নিবন্ধন করতে
Container.registerFunctionCallTagHandler()ব্যবহার করুন:/** * Register a function call tag handler. * * @param functionName The function name, which corresponds to the function name field * Google Tag Manager web interface. */ mContainer.registerFunctionCallTagHandler(functionName, new FunctionCallTagHandler() { /** * This method will be called when any custom tag's rule(s) evaluates to true. * The code should check the functionName and process accordingly. * * @param functionName The functionName passed to the functionCallTagHandler. * @param parameters An optional map of parameters as defined in the Google * Tag Manager web interface. */ @Override public void execute(String functionName, Map<String, Object> parameters) { if (functionName.equals("myConfiguredFunctionName")) { // Process accordingly. } } });
কাস্টম রিফ্রেশ সময়কাল নির্ধারণ করা
বর্তমান কন্টেইনারের বয়স ১২ ঘণ্টার বেশি হয়ে গেলে Google Tag Manager SDK একটি নতুন কন্টেইনার পুনরুদ্ধার করার চেষ্টা করবে। একটি কাস্টম কন্টেইনার রিফ্রেশ সময়কাল সেট করতে, নিম্নলিখিত উদাহরণের মতো Timer ব্যবহার করুন:
timer.scheduleTask(new TimerTask() { @Override public void run() { mContainer.refresh(); } }, delay, <new_period_in milliseconds>);
লগার দিয়ে ডিবাগিং
গুগল ট্যাগ ম্যানেজার এসডিকে ডিফল্টরূপে ত্রুটি এবং সতর্কবার্তাগুলো লগে প্রিন্ট করে। আরও বিশদ লগিং চালু করা ডিবাগিংয়ের জন্য সহায়ক হতে পারে এবং এটি TagManager.setLogger ব্যবহার করে আপনার নিজস্ব Logger ইমপ্লিমেন্ট করার মাধ্যমে করা সম্ভব, যেমনটি এই উদাহরণে দেখানো হয়েছে:
TagManager tagManager = TagManager.getInstance(this); tagManager.setLogger(new Logger() { final String TAG = "myGtmLogger"; // Log output with verbosity level of DEBUG. @Override public void d(String arg0) { Log.d(TAG, arg0); } // Log exceptions when provided. @Override public void d(String arg0, Throwable arg1) { Log.d(TAG, arg0); arg1.printStackTrace(); } // Rest of the unimplemented Logger methods. });
অথবা, আপনি TagManager.getLogger().setLogLevel(LogLevel) ব্যবহার করে বিদ্যমান Logger-এর LogLevel সেট করতে পারেন, যেমনটি এই উদাহরণে দেখানো হয়েছে:
// Change the LogLevel to INFO to enable logging at INFO and higher levels. TagManager tagManager = TagManager.getInstance(this); tagManager.getLogger().setLogLevel(LogLevel.INFO);