এই ডেভেলপার গাইডটিতে একটি মোবাইল অ্যাপ্লিকেশনে গুগল ট্যাগ ম্যানেজার কীভাবে প্রয়োগ করতে হয়, তা বর্ণনা করা হয়েছে।
ভূমিকা
গুগল ট্যাগ ম্যানেজার ডেভেলপারদেরকে অ্যাপ মার্কেটপ্লেসগুলিতে অ্যাপ্লিকেশন বাইনারিগুলি পুনর্নির্মাণ ও পুনরায় জমা না দিয়েই, গুগল ট্যাগ ম্যানেজার ইন্টারফেস ব্যবহার করে তাদের মোবাইল অ্যাপ্লিকেশনের কনফিগারেশন মান পরিবর্তন করার সুযোগ দেয়।
এটি আপনার অ্যাপ্লিকেশনের যেকোনো কনফিগারেশন মান বা ফ্ল্যাগ পরিচালনা করার জন্য উপযোগী, যা ভবিষ্যতে আপনার পরিবর্তন করার প্রয়োজন হতে পারে, যার মধ্যে অন্তর্ভুক্ত রয়েছে:
- বিভিন্ন UI সেটিংস এবং ডিসপ্লে স্ট্রিং
- আপনার অ্যাপ্লিকেশনে পরিবেশিত বিজ্ঞাপনের আকার, অবস্থান বা প্রকার
- গেমের সেটিংস
নিয়ম ব্যবহার করে রানটাইমেও কনফিগারেশন মানগুলো মূল্যায়ন করা যেতে পারে, যা নিম্নলিখিত ধরনের ডাইনামিক কনফিগারেশন সক্ষম করে:
- স্ক্রিনের আকার ব্যবহার করে বিজ্ঞাপনের ব্যানারের আকার নির্ধারণ করা
- ভাষা এবং অবস্থান ব্যবহার করে UI উপাদান কনফিগার করা
গুগল ট্যাগম্যানেজার অ্যাপ্লিকেশনগুলিতে ট্র্যাকিং ট্যাগ এবং পিক্সেলের ডায়নামিক বাস্তবায়নও সক্ষম করে। ডেভেলপাররা গুরুত্বপূর্ণ ইভেন্টগুলিকে একটি ডেটা লেয়ারে পুশ করতে পারেন এবং পরে সিদ্ধান্ত নিতে পারেন কোন ট্র্যাকিং ট্যাগ বা পিক্সেলগুলি ফায়ার করা হবে। ট্যাগম্যানেজার নিম্নলিখিত ট্যাগগুলি সমর্থন করে:
- গুগল মোবাইল অ্যাপ অ্যানালিটিক্স
- কাস্টম ফাংশন কল ট্যাগ
শুরু করার আগে
এই সূচনা নির্দেশিকাটি ব্যবহার করার আগে, আপনার নিম্নলিখিত জিনিসগুলির প্রয়োজন হবে:
- একটি গুগল ট্যাগ ম্যানেজার অ্যাকাউন্ট
- একটি নতুন ট্যাগ ম্যানেজার কন্টেইনার এবং মান সংগ্রহ ম্যাক্রো
- iOS-এর জন্য একটি মোবাইল অ্যাপ্লিকেশন, যেখানে গুগল ট্যাগ ম্যানেজার প্রয়োগ করা যাবে।
- গুগল অ্যানালিটিক্স সার্ভিসেস এসডিকে , যার মধ্যে ট্যাগ ম্যানেজার লাইব্রেরিটি রয়েছে।
আপনি যদি গুগল ট্যাগ ম্যানেজারে নতুন হন, তাহলে এই নির্দেশিকাটি চালিয়ে যাওয়ার আগে আমরা আপনাকে কন্টেইনার, ম্যাক্রো এবং রুলস (হেল্প সেন্টার) সম্পর্কে আরও জেনে নেওয়ার পরামর্শ দিচ্ছি।
শুরু করা
এই বিভাগটি ডেভেলপারদের একটি সাধারণ ট্যাগ ম্যানেজার ওয়ার্কফ্লো সম্পর্কে নির্দেশনা দেবে:
- আপনার প্রজেক্টে গুগল ট্যাগ ম্যানেজার এসডিকে যোগ করুন
- ডিফল্ট কন্টেইনার মান সেট করুন
- পাত্রটি খুলুন
- কন্টেইনার থেকে কনফিগারেশন মানগুলি নিন
- ডেটালেয়ারে ইভেন্টগুলি পুশ করুন
- কন্টেইনারটির প্রিভিউ দেখুন ও প্রকাশ করুন
১. আপনার প্রজেক্টে গুগল ট্যাগ ম্যানেজার এসডিকে যোগ করা
Google Tag Manager SDK ব্যবহার করার আগে, আপনাকে SDK প্যাকেজের Library ডিরেক্টরি থেকে libGoogleAnalyticsServices.a এবং Google Tag Manager (GTM) হেডার ফাইলগুলো আপনার প্রজেক্টে যোগ করতে হবে।
এরপরে, আপনার অ্যাপ্লিকেশন টার্গেটের লিঙ্ক করা লাইব্রেরিগুলিতে নিম্নলিখিতগুলি যোগ করুন, যদি সেগুলি আগে থেকে উপস্থিত না থাকে:
-
CoreData.framework -
SystemConfiguration.framework -
libz.dylib -
libsqlite3.dylib -
libGoogleAnalyticsServices.a
যদি আপনি চান যে আপনার অ্যাপ্লিকেশনটি গুগল ট্যাগ ম্যানেজার এসডিকে ম্যাক্রোর মাধ্যমে সেই ফ্রেমওয়ার্ক দ্বারা প্রদত্ত বিজ্ঞাপনদাতাদের শনাক্তকারী (IDFA) এবং ট্র্যাকিং ফ্ল্যাগ অ্যাক্সেস করুক, তাহলে আপনাকে এই অতিরিক্ত লাইব্রেরিগুলোও লিঙ্ক করতে হবে:
-
libAdIdAccess.a -
AdSupport.framework
২. আপনার প্রজেক্টে একটি ডিফল্ট কন্টেইনার ফাইল যোগ করা
গুগল ট্যাগ ম্যানেজার আপনার অ্যাপ্লিকেশনটি প্রথমবার চালানোর সময় একটি ডিফল্ট কন্টেইনার ব্যবহার করে। অ্যাপটি নেটওয়ার্কের মাধ্যমে একটি নতুন কন্টেইনার খুঁজে না পাওয়া পর্যন্ত এই ডিফল্ট কন্টেইনারটিই ব্যবহৃত হতে থাকবে।
আপনার অ্যাপ্লিকেশনে একটি ডিফল্ট কন্টেইনার বাইনারি ডাউনলোড ও যোগ করতে, এই ধাপগুলো অনুসরণ করুন:
- গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে সাইন ইন করুন।
- আপনি কন্টেইনারটির যে সংস্করণটি ডাউনলোড করতে চান, তা নির্বাচন করুন।
- কন্টেইনার বাইনারিটি পেতে ডাউনলোড বোতামে ক্লিক করুন।
- বাইনারি ফাইলটি আপনার প্রোজেক্টের রুট ডিরেক্টরিতে এবং 'Supporting Files' ফোল্ডারে যুক্ত করুন।
ডিফল্ট ফাইলের নাম কন্টেইনার আইডি হওয়া উচিত (উদাহরণস্বরূপ GTM-1234 )। বাইনারি ফাইলটি ডাউনলোড করার পর, সঠিক নামকরণের নিয়ম অনুসরণ নিশ্চিত করতে ফাইলের নাম থেকে ভার্সন সাফিক্সটি সরিয়ে ফেলুন।
যদিও বাইনারি ফাইল ব্যবহার করার পরামর্শ দেওয়া হয়, যদি আপনার কন্টেইনারে কোনো রুল বা ট্যাগ না থাকে, তবে আপনি এর পরিবর্তে একটি প্রপার্টি লিস্ট বা JSON ফাইল ব্যবহার করতে পারেন। ফাইলটি মূল বান্ডেলের মধ্যে থাকতে হবে এবং এর নামকরণের রীতিটি হবে: <Container_ID>.<plist|json> । উদাহরণস্বরূপ, যদি আপনার কন্টেইনার আইডি GTM-1234 হয়, তাহলে আপনি GTM-1234.plist নামের একটি প্রপার্টি লিস্ট ফাইলে আপনার ডিফল্ট কন্টেইনার ভ্যালুগুলো উল্লেখ করতে পারেন।
৩. একটি পাত্র খোলা
একটি কন্টেইনার থেকে মান পুনরুদ্ধার করার আগে, আপনার অ্যাপ্লিকেশনটিকে কন্টেইনারটি খুলতে হবে। একটি কন্টেইনার খুললে তা ডিস্ক থেকে লোড হবে (যদি উপলব্ধ থাকে), অথবা নেটওয়ার্ক থেকে অনুরোধ করা হবে (যদি প্রয়োজন হয়)।
iOS-এ একটি কন্টেইনার খোলার সবচেয়ে সহজ উপায় হলো openContainerWithId:tagManager:openType:timeout:notifier: ব্যবহার করা, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:
// MyAppDelegate.h // This example assumes this file is using ARC. #import <UIKit/UIKit.h> @class TAGManager; @class TAGContainer; @interface MyAppDelegate : UIResponder <UIApplicationDelegate> @property (nonatomic, strong) TAGManager *tagManager; @property (nonatomic, strong) TAGContainer *container; @end // MyAppDelegate.m // This example assumes this file is using ARC. #import "MyAppDelegate.h" #import "TAGContainer.h" #import "TAGContainerOpener.h" #import "TAGManager.h" @interface MyAppDelegate ()<TAGContainerOpenerNotifier> @end @implementation MyAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.tagManager = [TAGManager instance]; // Optional: Change the LogLevel to Verbose to enable logging at VERBOSE and higher levels. [self.tagManager.logger setLogLevel:kTAGLoggerLogLevelVerbose]; /* * Opens a container. * * @param containerId The ID of the container to load. * @param tagManager The TAGManager instance for getting the container. * @param openType The choice of how to open the container. * @param timeout The timeout period (default is 2.0 seconds). * @param notifier The notifier to inform on container load events. */ [TAGContainerOpener openContainerWithId:@"GTM-XXXX" // Update with your Container ID. tagManager:self.tagManager openType:kTAGOpenTypePreferFresh timeout:nil notifier:self]; // Method calls that don't need the container. return YES; } // TAGContainerOpenerNotifier callback. - (void)containerAvailable:(TAGContainer *)container { // Note that containerAvailable may be called on any thread, so you may need to dispatch back to // your main thread. dispatch_async(dispatch_get_main_queue(), ^{ self.container = container; }); } // The rest of your app delegate implementation.
৪. কন্টেইনার থেকে কনফিগারেশন মানগুলি সংগ্রহ করা
কন্টেইনারটি খোলা হয়ে গেলে, <type>ForKey: মেথডগুলো ব্যবহার করে কনফিগারেশন ভ্যালুগুলো পুনরুদ্ধার করা যেতে পারে:
// Retrieving a configuration value from a Tag Manager Container. MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; TAGContainer *container = appDelegate.container; // Get the configuration value by key. NSString *title = [container stringForKey:@"title_string"];
অস্তিত্বহীন কী দিয়ে করা অনুরোধগুলি অনুরোধকৃত প্রকারের জন্য উপযুক্ত একটি ডিফল্ট মান ফেরত দেবে:
// Empty keys will return a default value depending on the type requested. // Key does not exist. An empty string is returned. NSString subtitle = [container stringForKey:@"Non-existent-key"]; [subtitle isEqualToString:@""]; // Evaluates to true.
৫. ডেটালেয়ারে মানসমূহ প্রেরণ করা
ডেটালেয়ার হলো একটি ম্যাপ, যা আপনার অ্যাপের রানটাইম তথ্য, যেমন টাচ ইভেন্ট বা স্ক্রিন ভিউ, একটি কন্টেইনারের মধ্যে থাকা ট্যাগ ম্যানেজার ম্যাক্রো এবং ট্যাগগুলোর কাছে উপলব্ধ করে তোলে।
উদাহরণস্বরূপ, DataLayer ম্যাপে স্ক্রিন ভিউ সম্পর্কিত তথ্য পুশ করার মাধ্যমে, আপনি আপনার অ্যাপে হার্ড কোড করার প্রয়োজন ছাড়াই ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে ট্যাগ সেট আপ করতে পারেন, যা ঐ স্ক্রিনভিউগুলোর প্রতিক্রিয়ায় কনভার্সন পিক্সেল এবং ট্র্যাকিং কল চালু করবে।
push:
// // ViewController.m // Pushing an openScreen event with a screen name into the data layer. // #import "MyAppDelegate.h" #import "TAGDataLayer.h" #import "ViewController.h" @implementation ViewController - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // The container should have already been opened, otherwise events pushed to // the data layer will not fire tags in that container. TAGDataLayer *dataLayer = [TAGManager instance].dataLayer; [dataLayer push:@{@"event": @"openScreen", @"screenName": @"Home Screen"}]; } // Rest of the ViewController implementation @end
ওয়েব ইন্টারফেসে, আপনি এখন প্রতিটি স্ক্রিন ভিউয়ের জন্য ট্যাগ (যেমন গুগল অ্যানালিটিক্স ট্যাগ) ফায়ার করার জন্য এই নিয়মটি তৈরি করতে পারেন: equals "openScreen"। এই ট্যাগগুলির কোনো একটিতে স্ক্রিনের নাম পাস করার জন্য, একটি ডেটা লেয়ার ম্যাক্রো তৈরি করুন যা ডেটা লেয়ারের "screenName" কী-টিকে রেফারেন্স করে। এছাড়াও, আপনি শুধুমাত্র নির্দিষ্ট স্ক্রিন ভিউয়ের জন্য একটি ট্যাগ (যেমন গুগল অ্যাডস কনভার্সন পিক্সেল) ফায়ার করার জন্য একটি নিয়ম তৈরি করতে পারেন যেখানে equals "openScreen" && equals "ConfirmationScreen"।
৬. একটি কন্টেইনারের প্রিভিউ দেখা ও প্রকাশ করা
ম্যাক্রো মানগুলি সর্বদা বর্তমান প্রকাশিত সংস্করণের সাথে সামঞ্জস্যপূর্ণ থাকবে। একটি কন্টেইনারের সর্বশেষ সংস্করণ প্রকাশ করার আগে, আপনি আপনার খসড়া কন্টেইনারটি প্রিভিউ করতে পারেন।
একটি কন্টেইনার প্রিভিউ করার জন্য, গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে একটি প্রিভিউ ইউআরএল তৈরি করুন। এর জন্য, আপনি যে কন্টেইনারটির ভার্সন প্রিভিউ করতে চান সেটি নির্বাচন করুন এবং তারপর Preview ' সিলেক্ট করুন। এই প্রিভিউ ইউআরএলটি সেভ করে রাখুন, কারণ পরবর্তী ধাপগুলোতে আপনার এটি প্রয়োজন হবে।

কন্টেইনার প্রিভিউ চালু করতে, আপনাকে আপনার অ্যাপ ডেলিগেট ইমপ্লিমেন্টেশন ফাইলে কোড যোগ করতে হবে এবং আপনার প্রোজেক্টের প্রপার্টি লিস্টে গুগল ট্যাগ ম্যানেজার প্রিভিউ ইউআরএল স্কিমটি সংজ্ঞায়িত করতে হবে।
প্রথমে, আপনার অ্যাপ ডেলিগেট ফাইলে নিম্নলিখিত বোল্ড করা কোড স্নিপেটগুলি যোগ করুন:
@implementation MyAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.tagManager = [TAGManager instance]; // Add the code in bold below to preview a Google Tag Manager container. // IMPORTANT: This code must be called before the container is opened. NSURL *url = [launchOptions valueForKey:UIApplicationLaunchOptionsURLKey]; if (url != nil) { [self.tagManager previewWithUrl:url]; } id<TAGContainerFuture> future = [TAGContainerOpener openContainerWithId:@"GTM-XXXX" // Placeholder Container ID. tagManager:self.tagManager openType:kTAGOpenTypePreferNonDefault timeout:nil]; // The rest of your method implementation. self.container = [future get]; return YES; } // Add the code in bold below preview a Google Tag Manager container. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { if ([self.tagManager previewWithUrl:url]) { return YES; } // Code to handle other urls. return NO; }
এরপরে, আপনার অ্যাপ্লিকেশনের প্রপার্টি লিস্ট ফাইলের 'URL types' কী-এর অধীনে নিম্নলিখিত URL আইডেন্টিফায়ার এবং URL স্কিমটি রেজিস্টার করুন:
URL identifier: your.package_name URL scheme: tagmanager.c.your.package.name

আপনার অ্যাপে ড্রাফট কন্টেইনারটির প্রিভিউ দেখতে এমুলেটর বা ফিজিক্যাল ডিভাইসে লিঙ্কটি খুলুন।
যখন আপনি আপনার অ্যাপ্লিকেশনের জন্য খসড়া কনফিগারেশন মানগুলো উপলব্ধ করতে প্রস্তুত হবেন, তখন কন্টেইনারটি পাবলিশ করুন ।
উন্নত কনফিগারেশন
গুগল ট্যাগ ম্যানেজার ফর মোবাইল-এ বেশ কিছু উন্নত কনফিগারেশন অপশন রয়েছে, যা আপনাকে রুল ব্যবহার করে রানটাইম কন্ডিশনের উপর ভিত্তি করে ভ্যালু নির্বাচন করতে, ম্যানুয়ালি কন্টেইনার রিফ্রেশ করতে এবং কন্টেইনার খোলার জন্য অতিরিক্ত অপশন পেতে সাহায্য করে। নিম্নলিখিত বিভাগগুলিতে সবচেয়ে প্রচলিত কয়েকটি উন্নত কনফিগারেশনের রূপরেখা দেওয়া হয়েছে।
কন্টেইনার খোলার উন্নত বিকল্প
গুগল ট্যাগ ম্যানেজার এসডিকে কন্টেইনার খোলার জন্য বেশ কিছু পদ্ধতি প্রদান করে, যা আপনাকে লোডিং প্রক্রিয়ার উপর আরও বেশি নিয়ন্ত্রণ দিতে পারে:
openContainerById:কলব্যাক:
openContainerById:callback: হলো একটি কন্টেইনার খোলার জন্য সর্বনিম্ন স্তরের এবং সবচেয়ে নমনীয় এপিআই। এটি অবিলম্বে একটি ডিফল্ট কন্টেইনার সহ ফিরে আসে এবং যদি কোনও সংরক্ষিত কন্টেইনার না থাকে, অথবা যদি সংরক্ষিত কন্টেইনারটি সতেজ না হয় (> ১২ ঘন্টা পুরানো), তবে এটি ডিস্ক বা নেটওয়ার্ক থেকে অ্যাসিঙ্ক্রোনাসভাবে একটি কন্টেইনার লোড করে।
@interface ContainerCallback : NSObject<TAGContainerCallback> @end @implementation ContainerCallback /** * Called before the refresh is about to begin. * * @param container The container being refreshed. * @param refreshType The type of refresh which is starting. */ - (void)containerRefreshBegin:(TAGContainer *)container refreshType:(TAGContainerCallbackRefreshType)refreshType { // Notify UI that container refresh is beginning. } /** * Called when a refresh has successfully completed for the given refresh type. * * @param container The container being refreshed. * @param refreshType The type of refresh which completed successfully. */ - (void)containerRefreshSuccess:(TAGContainer *)container refreshType:(TAGContainerCallbackRefreshType)refreshType { // Notify UI that container is available. } /** * Called when a refresh has failed to complete for the given refresh type. * * @param container The container being refreshed. * @param failure The reason for the refresh failure. * @param refreshType The type of refresh which failed. */ - (void)containerRefreshFailure:(TAGContainer *)container failure:(TAGContainerCallbackRefreshFailure)failure refreshType:(TAGContainerCallbackRefreshType)refreshType { // Notify UI that container request has failed. } @end
লোডিং প্রক্রিয়া চলাকালীন, openContainerById:callback: বেশ কয়েকটি লাইফসাইকেল কলব্যাক জারি করে, যাতে আপনার কোড জানতে পারে কখন লোডিং অনুরোধ শুরু হয়, এটি ব্যর্থ বা সফল হয় কি না এবং কেন, এবং কন্টেইনারটি শেষ পর্যন্ত ডিস্ক থেকে নাকি নেটওয়ার্ক থেকে লোড হয়েছে।
আপনার অ্যাপ্লিকেশনের জন্য ডিফল্ট মান ব্যবহার করা গ্রহণযোগ্য না হলে, একটি সংরক্ষিত বা নেটওয়ার্ক কন্টেইনার কখন লোড হয়েছে তা জানার জন্য আপনাকে এই কলব্যাকগুলি ব্যবহার করতে হবে। মনে রাখবেন, অ্যাপটি যদি প্রথমবার চালানো হয় এবং কোনো নেটওয়ার্ক সংযোগ না থাকে, তবে আপনি কোনো সংরক্ষিত বা নেটওয়ার্ক কন্টেইনার লোড করতে পারবেন না।
openContainerById:callback: এই কলব্যাকগুলিতে আর্গুমেন্ট হিসেবে নিম্নলিখিত enum মানগুলি প্রেরণ করে:
রিফ্রেশটাইপ
| মূল্য | বর্ণনা |
|---|---|
kTAGContainerCallbackRefreshTypeSaved | রিফ্রেশ অনুরোধটি স্থানীয়ভাবে সংরক্ষিত একটি কন্টেইনার লোড করছে। |
kTAGContainerCallbackRefreshTypeNetwork | রিফ্রেশ অনুরোধটি নেটওয়ার্কের মাধ্যমে একটি কন্টেইনার লোড করছে। |
রিফ্রেশ ব্যর্থতা
| মূল্য | বর্ণনা |
|---|---|
kTAGContainerCallbackRefreshFailureNoSavedContainer | সংরক্ষিত কোনো কন্টেইনার উপলব্ধ নেই। |
kTAGContainerCallbackRefreshFailureIoError | একটি I/O ত্রুটির কারণে কন্টেইনারটি রিফ্রেশ করা সম্ভব হয়নি। |
kTAGContainerCallbackRefreshFailureNoNetwork | কোনো নেটওয়ার্ক সংযোগ উপলব্ধ নেই। |
kTAGContainerCallbackRefreshFailureNetworkError | একটি নেটওয়ার্ক ত্রুটি ঘটেছে। |
kTAGContainerCallbackRefreshFailureServerError | সার্ভারে একটি ত্রুটি ঘটেছে। |
kTAGContainerCallbackRefreshFailureUnknownError | এমন একটি ত্রুটি ঘটেছে যাকে কোনো শ্রেণিতে ফেলা যায় না। |
নন-ডিফল্ট এবং নতুন কন্টেইনার খোলার পদ্ধতি
TAGContainerOpener openContainerById:callback: র্যাপ করে এবং কন্টেইনার খোলার জন্য দুটি সুবিধাজনক মেথড প্রদান করে: openContainerWithId:tagManager:openType:timeout:notifier: এবং openContainerWithId:tagManager:openType:timeout:
এই পদ্ধতিগুলোর প্রত্যেকটি একটি এনুমারেশন গ্রহণ করে, যা একটি নন-ডিফল্ট অথবা নতুন কন্টেইনারের জন্য অনুরোধ করে।
বেশিরভাগ অ্যাপ্লিকেশনের জন্য kTAGOpenTypePreferNonDefault ব্যবহার করার পরামর্শ দেওয়া হয় এবং এটি একটি নির্দিষ্ট টাইমআউট সময়ের মধ্যে ডিস্ক বা নেটওয়ার্ক থেকে প্রথম উপলব্ধ নন-ডিফল্ট কন্টেইনারটি ফেরত দেওয়ার চেষ্টা করে, এমনকি যদি সেই কন্টেইনারটি ১২ ঘণ্টার বেশি পুরানোও হয়। যদি এটি একটি পুরনো সংরক্ষিত কন্টেইনার ফেরত দেয়, তবে এটি একটি নতুন কন্টেইনারের জন্য একটি অ্যাসিঙ্ক্রোনাস নেটওয়ার্ক অনুরোধও করবে। kTAGOpenTypePreferNonDefault ব্যবহার করার সময়, যদি অন্য কোনো কন্টেইনার উপলব্ধ না থাকে, অথবা যদি টাইমআউট সময়সীমা অতিক্রম করা হয়, তাহলে একটি ডিফল্ট কন্টেইনার ফেরত দেওয়া হবে।
kTAGOpenTypePreferFresh নির্দিষ্ট টাইমআউট সময়ের মধ্যে ডিস্ক বা নেটওয়ার্ক থেকে একটি নতুন কন্টেইনার ফেরত দেওয়ার চেষ্টা করে। যদি নেটওয়ার্ক সংযোগ অনুপলব্ধ থাকে এবং/অথবা টাইমআউট সময় অতিক্রম করে, তবে এটি একটি সংরক্ষিত কন্টেইনার ফেরত দেয়।
যেসব ক্ষেত্রে দীর্ঘ অনুরোধের সময় ব্যবহারকারীর অভিজ্ঞতাকে লক্ষণীয়ভাবে প্রভাবিত করতে পারে, যেমন UI ফ্ল্যাগ বা ডিসপ্লে স্ট্রিং-এর ক্ষেত্রে, সেখানে kTAGOpenTypePreferFresh ব্যবহার করার পরামর্শ দেওয়া হয় না। এছাড়া, একটি নেটওয়ার্ক কন্টেইনার অনুরোধ জোরপূর্বক করার জন্য আপনি যেকোনো সময় TAGContainer::refresh ব্যবহার করতে পারেন।
এই দুটি সুবিধাজনক মেথডই নন-ব্লকিং। openContainerWithId:tagManager:openType:timeout: একটি TAGContainerFuture অবজেক্ট রিটার্ন করে, যার get মেথডটি লোড হওয়ার সাথে সাথেই একটি TAGContainer রিটার্ন করে (কিন্তু ততক্ষণ পর্যন্ত এটি ব্লক থাকবে)। openContainerWithId:tagManager:openType:timeout:notifier: মেথডটি একটিমাত্র কলব্যাক গ্রহণ করে, যা কন্টেইনারটি উপলব্ধ হলে কল করা হয়। উভয় মেথডেরই ডিফল্ট টাইমআউট পিরিয়ড হলো 2.0 সেকেন্ড।
নিয়ম ব্যবহার করে রানটাইমে ম্যাক্রো মূল্যায়ন করা
কন্টেইনারগুলো রানটাইমে রুল ব্যবহার করে ভ্যালু মূল্যায়ন করতে পারে। রুলগুলো ডিভাইসের ভাষা, প্ল্যাটফর্ম বা অন্য কোনো ম্যাক্রো ভ্যালুর মতো মানদণ্ডের উপর ভিত্তি করে তৈরি হতে পারে। উদাহরণস্বরূপ, রানটাইমে ডিভাইসের ভাষার উপর ভিত্তি করে একটি স্থানীয় ডিসপ্লে স্ট্রিং নির্বাচন করতে রুল ব্যবহার করা যেতে পারে। নিম্নলিখিত রুলটি ব্যবহার করে এটি কনফিগার করা যায়:

এরপর আপনি প্রতিটি ভাষার জন্য ভ্যালু কালেকশন ম্যাক্রো তৈরি করতে পারেন এবং প্রতিটি ম্যাক্রোতে উপযুক্ত ভাষা কোড যুক্ত করে এই নিয়মটি যোগ করতে পারেন। যখন এই কন্টেইনারটি পাবলিশ করা হবে, তখন আপনার অ্যাপ্লিকেশনটি রানটাইমে ব্যবহারকারীর ডিভাইসের ভাষার উপর নির্ভর করে স্থানীয় ভাষার ডিসপ্লে স্ট্রিং প্রদর্শন করতে সক্ষম হবে।
মনে রাখবেন, যদি আপনার ডিফল্ট কন্টেইনারে নিয়মের প্রয়োজন হয়, তবে আপনাকে অবশ্যই একটি বাইনারি কন্টেইনার ফাইলকে আপনার ডিফল্ট কন্টেইনার হিসেবে ব্যবহার করতে হবে।
নিয়মাবলী কনফিগার করার বিষয়ে আরও জানুন (হেল্প সেন্টার)।
বাইনারি ডিফল্ট কন্টেইনার ফাইল
যেসব ডিফল্ট কন্টেইনারে নিয়মের প্রয়োজন হয়, সেগুলোর জন্য প্রপার্টি লিস্ট ফাইল বা JSON ফাইলের পরিবর্তে একটি বাইনারি কন্টেইনার ফাইল ব্যবহার করা উচিত। বাইনারি কন্টেইনারগুলো গুগল ট্যাগ ম্যানেজার নিয়মের মাধ্যমে রানটাইমে ম্যাক্রো ভ্যালু নির্ধারণ করার সুবিধা দেয়, কিন্তু প্রপার্টি লিস্ট বা JSON ফাইলগুলো তা দেয় না।
বাইনারি কন্টেইনার ফাইলগুলো গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেস থেকে ডাউনলোড করা যেতে পারে এবং নিম্নলিখিত নামকরণের নিয়ম মেনে আপনার মূল অ্যাপ্লিকেশন বান্ডেলে যোগ করতে হবে: GTM-XXXX , যেখানে ফাইলের নামটি আপনার কন্টেইনার আইডি নির্দেশ করে।
যেসব ক্ষেত্রে একটি প্রপার্টি লিস্ট ফাইল এবং/অথবা JSON ফাইলের পাশাপাশি একটি বাইনারি কন্টেইনার ফাইল উপস্থিত থাকে, সেখানে SDK ডিফল্ট কন্টেইনার হিসেবে বাইনারি কন্টেইনার ফাইলটি ব্যবহার করবে।
ফাংশন কল ম্যাক্রো ব্যবহার করে
ফাংশন কল ম্যাক্রো হলো এমন ম্যাক্রো যা আপনার অ্যাপ্লিকেশনের কোনো নির্দিষ্ট ফাংশনের রিটার্ন ভ্যালুতে সেট করা থাকে। ফাংশন কল ম্যাক্রো ব্যবহার করে আপনার গুগল ট্যাগ ম্যানেজার রুলসের সাথে রানটাইম ভ্যালু যুক্ত করা যায়; যেমন, ডিভাইসের কনফিগার করা ভাষা এবং মুদ্রার উপর ভিত্তি করে রানটাইমে নির্ধারণ করা যে একজন ব্যবহারকারীকে কোন মূল্যটি দেখানো হবে।
একটি ফাংশন কল ম্যাক্রো কনফিগার করতে:
- গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে ফাংশন কল ম্যাক্রোটি সংজ্ঞায়িত করুন। আর্গুমেন্টগুলো ঐচ্ছিকভাবে কী-ভ্যালু পেয়ার হিসেবে কনফিগার করা যেতে পারে।
- এমন একটি হ্যান্ডলার সংজ্ঞায়িত করুন যা
TAGFunctionCallMacroHandlerপ্রোটোকলটি বাস্তবায়ন করে:// MyFunctionCallMacroHandler.h #import "TAGContainer.h" // The function name field of the macro, as defined in the Google Tag Manager // web interface. extern NSString *const kMyMacroFunctionName; @interface MyFunctionCallMacroHandler : NSObject<TAGFunctionCallMacroHandler> @end // MyFunctionCallMacroHandler.m #import "MyFunctionCallMacroHandler.h" // Corresponds to the function name field in the Google Tag Manager interface. NSString *const kMyMacroFunctionName = @"myConfiguredFunctionName"; @implementation MacroHandler - (id)valueForMacro:(NSString *)functionName parameters:(NSDictionary *)parameters { if ([functionName isEqualToString:kMyMacroFunctionName]) { // Process and return the calculated value of this macro accordingly. return macro_value; } return nil; } @end
- TAGContainer::registerFunctionCallMacroHandler:forMacro: এবং Google Tag Manager ইন্টারফেসে নির্দিষ্ট করা ফাংশনের নামটি ব্যবহার করে হ্যান্ডলারটি রেজিস্টার করুন:
// // MyAppDelegate.h // #import <UIKit/UIKit.h> @interface MyAppDelegate : UIResponder <UIApplicationDelegate> @end // // MyAppDelegate.m // #import "MyAppDelegate.h" #import "MyFunctionCallMacroHandler.h" #import "TAGContainer.h" #import "TAGContainerOpener.h" #import "TAGManager.h" @implementation MyAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Open the container. id<TAGContainerFuture> future = [TAGContainerOpener openContainerWithId:@"GTM-XXXX" // Placeholder Container ID. tagManager:[TAGManager instance] openType:kTAGOpenTypePreferNonDefault timeout:nil]; // Method calls that don't need the container. self.container = [future get]; // Register a function call macro handler using the macro name defined // in the Google Tag Manager web interface. [self.container registerFunctionCallMacroHandler:[[MyFunctionCallMacroHandler alloc] init] forMacro:kMyMacroFunctionName]; } @end
ফাংশন কল ট্যাগ ব্যবহার করে
যখনই ডেটা লেয়ারে কোনো ইভেন্ট পুশ করা হয় এবং ট্যাগ নিয়মগুলো true হিসেবে প্রমাণিত হয়, তখন ফাংশন কল ট্যাগগুলো পূর্ব-নিবন্ধিত ফাংশনগুলোকে কার্যকর করতে সক্ষম করে।
একটি ফাংশন কল ট্যাগ কনফিগার করতে:
- গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে ফাংশন কল ট্যাগটি সংজ্ঞায়িত করুন। আর্গুমেন্টগুলো ঐচ্ছিকভাবে কী-ভ্যালু পেয়ার হিসেবে কনফিগার করা যেতে পারে।
-
TAGFunctionCallTagHandlerপ্রোটোকলটি বাস্তবায়ন করুন:// // MyFunctionCallTagHandler.h // #import "TAGContainer.h" extern NSString *const kMyTagFunctionName; @interface MyFunctionCallTagHandler : NSObject<TAGFunctionCallTagHandler> @end // // MyFunctionCallTagHandler.m // // Corresponds to the function name field in the Google Tag Manager interface. NSString *const kMyTagFunctionName = @"myConfiguredFunctionName"; @implementation MyFunctionCallTagHandler /** * This method will be called when any custom tag's rule(s) evaluate to true and * should check the functionName and process accordingly. * * @param functionName corresponds to the function name field, not tag * 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. */ - (void)execute:(NSString *)functionName parameters:(NSDictionary *)parameters { if ([functionName isEqualToString:kMyTagFunctionName]) { // Process accordingly. } } @end
- গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে কনফিগার করা ট্যাগ নামটি ব্যবহার করে ফাংশন কল ট্যাগ হ্যান্ডলারটি রেজিস্টার করুন:
// // MyAppDelegate.h // #import <UIKit/UIKit.h> @interface MyAppDelegate : UIResponder <UIApplicationDelegate> @end // // MyAppDelegate.m // #import "MyAppDelegate.h" #import "MyFunctionCallTagHandler.h" #import "TAGContainer.h" #import "TAGContainerOpener.h" #import "TAGManager.h" @implementation MyAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Open the container. id<TAGContainerFuture> future = [TAGContainerOpener openContainerWithId:@"GTM-XXXX" // Placeholder Container ID. tagManager:[TAGManager instance] openType:kTAGOpenTypePreferNonDefault timeout:nil]; // Method calls that don't need the container. self.container = [future get]; // Register a function call tag handler using the function name of the tag as // defined in the Google Tag Manager web interface. [self.container registerFunctionCallTagHandler:[[MyFunctionCallTagHandler alloc] init] forTag:kMyTagFunctionName]; } @end
কাস্টম রিফ্রেশ সময়কাল নির্ধারণ করা
বর্তমান কন্টেইনারের বয়স ১২ ঘণ্টার বেশি হয়ে গেলে Google Tag Manager SDK একটি নতুন কন্টেইনার পুনরুদ্ধার করার চেষ্টা করবে। একটি কাস্টম কন্টেইনার রিফ্রেশ পিরিয়ড সেট করতে, নিচের উদাহরণের মতো NSTimer ব্যবহার করুন:
- (void)refreshContainer:(NSTimer *)timer { [self.container refresh]; } self.refreshTimer = [NSTimer scheduledTimerWithTimeInterval:<refresh_interval> target:self selector:@selector(refreshContainer:) userInfo:nil repeats:YES];
লগার দিয়ে ডিবাগিং
গুগল ট্যাগ ম্যানেজার এসডিকে ডিফল্টরূপে ত্রুটি এবং সতর্কবার্তাগুলো লগে প্রিন্ট করে। আরও বিশদ লগিং চালু করা ডিবাগিংয়ের জন্য সহায়ক হতে পারে এবং এটি আপনার নিজস্ব Logger ইমপ্লিমেন্ট করার মাধ্যমে সম্ভব, যেমনটি এই উদাহরণে দেখানো হয়েছে:
// MyAppDelegate.h // This example assumes this file is using ARC. // This Logger class will print out not just errors and warnings (as the default // logger does), but also info, debug, and verbose messages. @interface MyLogger: NSObject<TAGLogger> @end @implementation MyLogger - (void)error:(NSString *)message { NSLog(@"Error: %@", message); } - (void)warning:(NSString *)message { NSLog(@"Warning: %@", message); } - (void)info:(NSString *)message { NSLog(@"Info: %@", message); } - (void)debug:(NSString *)message { NSLog(@"Debug: %@", message); } - (void)verbose:(NSString *)message { NSLog(@"Verbose: %@", message); } @end // MyAppDelegate.m // This example assumes this file is using ARC. @implementation MyAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.tagManager = [TAGManager instance]; self.tagManager.logger = [[MyLogger alloc] init]; // Rest of Tag Manager and method implementation. return YES; } // Rest of app delegate implementation. @end
অথবা, আপনি TagManager::logger::setLogLevel ব্যবহার করে বিদ্যমান লগারের LogLevel সেট করতে পারেন, যেমনটি এই উদাহরণে দেখানো হয়েছে:
// Change the LogLevel to INFO to enable logging at INFO and higher levels. self.tagManager = [TAGManager instance]; [self.tagManager.logger setLogLevel:kTAGLoggerLogLevelInfo];