উদ্দেশ্য-সি-এর জন্য শুরু করা গাইড

এই বিকাশকারী নির্দেশিকা বর্ণনা করে কিভাবে একটি মোবাইল অ্যাপ্লিকেশনে Google ট্যাগ ম্যানেজার প্রয়োগ করতে হয়।

ভূমিকা

Google ট্যাগ ম্যানেজার ডেভেলপারদের তাদের মোবাইল অ্যাপ্লিকেশনগুলিতে কনফিগারেশন মান পরিবর্তন করতে সক্ষম করে Google ট্যাগ ম্যানেজার ইন্টারফেস ব্যবহার করে অ্যাপ মার্কেটপ্লেসগুলিতে অ্যাপ্লিকেশন বাইনারিগুলিকে পুনঃনির্মাণ এবং পুনরায় জমা না করেই৷

এটি আপনার অ্যাপ্লিকেশনের যেকোনো কনফিগারেশন মান বা পতাকা পরিচালনার জন্য দরকারী যা আপনাকে ভবিষ্যতে পরিবর্তন করতে হতে পারে, যার মধ্যে রয়েছে:

  • বিভিন্ন UI সেটিংস এবং ডিসপ্লে স্ট্রিং
  • মাপ, অবস্থান, বা আপনার অ্যাপ্লিকেশনে পরিবেশিত বিজ্ঞাপনের ধরন
  • খেলা সেটিংস

নিয়ম ব্যবহার করে রানটাইমে কনফিগারেশন মানগুলিও মূল্যায়ন করা যেতে পারে, গতিশীল কনফিগারেশন সক্ষম করে যেমন:

  • বিজ্ঞাপন ব্যানারের আকার নির্ধারণ করতে পর্দার আকার ব্যবহার করা
  • UI উপাদানগুলি কনফিগার করতে ভাষা এবং অবস্থান ব্যবহার করে৷

Google TagManager এছাড়াও অ্যাপ্লিকেশনগুলিতে ট্র্যাকিং ট্যাগ এবং পিক্সেলগুলির গতিশীল বাস্তবায়ন সক্ষম করে৷ বিকাশকারীরা গুরুত্বপূর্ণ ইভেন্টগুলিকে একটি ডেটা স্তরে ঠেলে দিতে পারে এবং পরে সিদ্ধান্ত নিতে পারে কোন ট্র্যাকিং ট্যাগ বা পিক্সেলগুলি ফায়ার করা উচিত৷ TagManager বর্তমানে নিম্নলিখিত ট্যাগ সমর্থন করে:

  • গুগল মোবাইল অ্যাপ বিশ্লেষণ
  • কাস্টম ফাংশন কল ট্যাগ

তুমি শুরু করার আগে

এই শুরু করার নির্দেশিকা ব্যবহার করার আগে, আপনার নিম্নলিখিতগুলির প্রয়োজন হবে:

আপনি যদি Google ট্যাগ ম্যানেজারে নতুন হয়ে থাকেন, তাহলে এই নির্দেশিকাটি চালিয়ে যাওয়ার আগে আমরা আপনাকে কন্টেনার, ম্যাক্রো এবং নিয়ম (সহায়তা কেন্দ্র) সম্পর্কে আরও জানুন

শুরু হচ্ছে

এই বিভাগটি ডেভেলপারদের একটি সাধারণ ট্যাগ ম্যানেজার ওয়ার্কফ্লো এর মাধ্যমে গাইড করবে:

  1. আপনার প্রোজেক্টে Google ট্যাগ ম্যানেজার SDK যোগ করুন
  2. ডিফল্ট কন্টেইনার মান সেট করুন
  3. কন্টেইনার খুলুন
  4. কন্টেইনার থেকে কনফিগারেশন মান পান
  5. ডেটা লেয়ারে ইভেন্টগুলি পুশ করুন
  6. প্রিভিউ এবং কন্টেইনার প্রকাশ করুন

1. আপনার প্রোজেক্টে Google ট্যাগ ম্যানেজার SDK যোগ করা

Google ট্যাগ ম্যানেজার SDK ব্যবহার করার আগে, আপনার প্রোজেক্টে SDK প্যাকেজের Library ডিরেক্টরি থেকে libGoogleAnalyticsServices.a এবং Google ট্যাগ ম্যানেজার (GTM) হেডার ফাইল যোগ করতে হবে।

এর পরে, আপনার অ্যাপ্লিকেশন টার্গেটের লিঙ্কযুক্ত লাইব্রেরিতে নিম্নলিখিতগুলি যোগ করুন যদি সেগুলি ইতিমধ্যে উপস্থিত না থাকে:

  • CoreData.framework
  • SystemConfiguration.framework
  • libz.dylib
  • libsqlite3.dylib
  • libGoogleAnalyticsServices.a

আপনি যদি Google ট্যাগ ম্যানেজার SDK ম্যাক্রোর মাধ্যমে বিজ্ঞাপনদাতাদের (IDFA) জন্য শনাক্তকারী এবং সেই ফ্রেমওয়ার্ক দ্বারা প্রদত্ত ট্র্যাকিং পতাকা অ্যাক্সেস করতে চান, তাহলে আপনাকে এই অতিরিক্ত লাইব্রেরিগুলিকেও লিঙ্ক করতে হবে:

  • libAdIdAccess.a
  • AdSupport.framework

2. আপনার প্রকল্পে একটি ডিফল্ট কন্টেইনার ফাইল যোগ করা

Google ট্যাগ ম্যানেজার আপনার অ্যাপ্লিকেশনের প্রথম রানে একটি ডিফল্ট ধারক ব্যবহার করে। অ্যাপটি নেটওয়ার্কের মাধ্যমে একটি নতুন কন্টেইনার পুনরুদ্ধার করতে সক্ষম না হওয়া পর্যন্ত ডিফল্ট ধারকটি ব্যবহার করা হবে৷

ডাউনলোড করতে এবং আপনার অ্যাপ্লিকেশনে একটি ডিফল্ট ধারক বাইনারি যোগ করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. গুগল ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে সাইন ইন করুন।
  2. আপনি যে ধারকটি ডাউনলোড করতে চান তার সংস্করণটি নির্বাচন করুন।
  3. কন্টেইনার বাইনারি পুনরুদ্ধার করতে ডাউনলোড বোতামে ক্লিক করুন।
  4. আপনার প্রোজেক্টের রুট ডিরেক্টরিতে এবং আপনার প্রোজেক্টের "সাপোর্টিং ফাইল" ফোল্ডারে বাইনারি ফাইল যোগ করুন।

ডিফল্ট ফাইলের নাম কনটেইনার আইডি হওয়া উচিত (উদাহরণস্বরূপ GTM-1234 )। একবার আপনি বাইনারি ফাইলটি ডাউনলোড করার পরে, আপনি সঠিক নামকরণের নিয়ম অনুসরণ করছেন তা নিশ্চিত করতে ফাইলের নাম থেকে সংস্করণ প্রত্যয়টি সরাতে ভুলবেন না।

যদিও বাইনারি ফাইল ব্যবহার করা বাঞ্ছনীয়, আপনার কন্টেইনারে নিয়ম বা ট্যাগ না থাকলে, আপনি পরিবর্তে একটি সাধারণ সম্পত্তি তালিকা বা JSON ফাইল ব্যবহার করতে পারেন। ফাইলটি মূল বান্ডেলে অবস্থিত হওয়া উচিত এবং এই নামকরণের নিয়ম অনুসরণ করা উচিত: <Container_ID>.<plist|json> । উদাহরণস্বরূপ, যদি আপনার কন্টেইনার আইডি হয় GTM-1234 , আপনি GTM-1234.plist নামের একটি সম্পত্তি তালিকা ফাইলে আপনার ডিফল্ট কন্টেইনার মান নির্দিষ্ট করতে পারেন।

3. একটি পাত্র খোলা

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

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.

4. কনটেইনার থেকে কনফিগারেশন মান পাওয়া

একবার ধারকটি খোলা হলে, <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.

5. ডেটা লেয়ারে মানগুলি পুশ করা

DataLayer হল এমন একটি মানচিত্র যা আপনার অ্যাপ সম্পর্কে রানটাইম তথ্য, যেমন টাচ ইভেন্ট বা স্ক্রীন ভিউ, ট্যাগ ম্যানেজার ম্যাক্রো এবং ট্যাগগুলি একটি কন্টেইনারে উপলব্ধ হতে সক্ষম করে৷

উদাহরণস্বরূপ, 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

ওয়েব ইন্টারফেসে, আপনি এখন এই নিয়ম তৈরি করে প্রতিটি স্ক্রীন ভিউয়ের জন্য ফায়ার করার জন্য ট্যাগগুলি (যেমন Google Analytics ট্যাগ) তৈরি করতে পারেন: সমান "ওপেনস্ক্রিন"। এই ট্যাগগুলির মধ্যে একটিতে স্ক্রীনের নাম পাস করতে, একটি ডেটা স্তর ম্যাক্রো তৈরি করুন যা ডেটা স্তরে "স্ক্রিননাম" কী উল্লেখ করে। এছাড়াও আপনি একটি ট্যাগ তৈরি করতে পারেন (যেমন একটি Google বিজ্ঞাপন রূপান্তর পিক্সেল) শুধুমাত্র নির্দিষ্ট স্ক্রিন ভিউয়ের জন্য ফায়ার করার জন্য, এমন একটি নিয়ম তৈরি করে যেখানে সমান "ওপেনস্ক্রিন" এবং& সমান "কনফার্মেশন স্ক্রীন"।

6. একটি ধারক প্রিভিউ করা এবং প্রকাশ করা

ম্যাক্রো মান সর্বদা বর্তমান প্রকাশিত সংস্করণের সাথে মিলে যাবে। একটি ধারকটির সর্বশেষ সংস্করণ প্রকাশ করার আগে, আপনি আপনার খসড়া ধারকটির পূর্বরূপ দেখতে পারেন৷

একটি কন্টেইনারের পূর্বরূপ দেখতে, আপনি যে ধারকটির পূর্বরূপ দেখতে চান তার সংস্করণ নির্বাচন করে এবং তারপর Preview নির্বাচন করে Google ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে একটি পূর্বরূপ URL তৈরি করুন। এই প্রিভিউ ইউআরএলে থাকুন কারণ পরবর্তী ধাপে আপনার এটির প্রয়োজন হবে।

প্রাকদর্শন URLগুলি ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসের পূর্বরূপ উইন্ডোতে উপলব্ধ
চিত্র 1: ট্যাগ ম্যানেজার ওয়েব ইন্টারফেস থেকে একটি পূর্বরূপ URL প্রাপ্ত করা।

কন্টেইনার প্রিভিউ সক্ষম করতে, আপনাকে অবশ্যই আপনার অ্যাপ প্রতিনিধি বাস্তবায়ন ফাইলে কোড যোগ করতে হবে এবং আপনার প্রোজেক্টের সম্পত্তি তালিকায় Google ট্যাগ ম্যানেজার প্রিভিউ ইউআরএল স্কিম সংজ্ঞায়িত করতে হবে।

প্রথমে, আপনার অ্যাপ প্রতিনিধি ফাইলে নিম্নলিখিত বোল্ড কোড স্নিপেট যোগ করুন:

@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 প্রকার কী-এর অধীনে নিম্নলিখিত URL শনাক্তকারী এবং URL স্কিম নিবন্ধন করুন:

URL identifier: your.package_name
URL scheme: tagmanager.c.your.package.name
আপনার অ্যাপ্লিকেশনের সম্পত্তি তালিকা ফাইলে ট্যাগ ম্যানেজার পূর্বরূপ URL স্কিম নিবন্ধন করুন।
চিত্র 3: আপনার অ্যাপ্লিকেশনের সম্পত্তি তালিকা ফাইলে ট্যাগ ম্যানেজার প্রিভিউ URL স্কিম যোগ করা।

আপনার অ্যাপে খসড়া ধারকটির পূর্বরূপ দেখতে একটি এমুলেটর বা শারীরিক ডিভাইসে লিঙ্কটি খুলুন।

আপনি যখন আপনার অ্যাপ্লিকেশনে আপনার খসড়া কনফিগারেশন মানগুলি উপলব্ধ করতে প্রস্তুত হন, তখন ধারকটি প্রকাশ করুন

উন্নত কনফিগারেশন

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

পাত্রে খোলার জন্য উন্নত বিকল্প

Google ট্যাগ ম্যানেজার SDK কন্টেইনার খোলার জন্য বিভিন্ন পদ্ধতি প্রদান করে যা আপনাকে লোডিং প্রক্রিয়ার উপর আরও নিয়ন্ত্রণ দিতে পারে:

openContainerById:কলব্যাক:

openContainerById:callback: একটি কন্টেইনার খোলার জন্য সর্বনিম্ন স্তর এবং সবচেয়ে নমনীয় API। এটি একটি ডিফল্ট কন্টেইনারের সাথে অবিলম্বে ফিরে আসে এবং কোনো সংরক্ষিত কন্টেইনার না থাকলে বা সংরক্ষিত ধারকটি তাজা না হলে (> 12 ঘন্টা পুরানো) ডিস্ক বা নেটওয়ার্ক থেকে অ্যাসিঙ্ক্রোনাসভাবে একটি ধারক লোড করে।

@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 বেশিরভাগ অ্যাপ্লিকেশনের জন্য সুপারিশ করা হয় এবং একটি নির্দিষ্ট সময়সীমার মধ্যে প্রথম উপলব্ধ নন-ডিফল্ট কন্টেইনারটি ফেরত দেওয়ার চেষ্টা করা হয়, হয় ডিস্ক বা নেটওয়ার্ক থেকে, এমনকি সেই কন্টেইনারটি 12 ঘন্টার বেশি পুরানো হলেও। যদি এটি একটি বাসি সংরক্ষিত কন্টেইনার ফেরত দেয়, তবে এটি একটি নতুনের জন্য একটি অ্যাসিঙ্ক্রোনাস নেটওয়ার্ক অনুরোধও করবে৷ kTAGOpenTypePreferNonDefault ব্যবহার করার সময়, যদি অন্য কোনো ধারক উপলব্ধ না হয়, বা সময়সীমা অতিক্রম করা হয় তাহলে একটি ডিফল্ট কন্টেইনার ফেরত দেওয়া হবে।

kTAGOpenTypePreferFresh প্রদত্ত সময়সীমার মধ্যে ডিস্ক বা নেটওয়ার্ক থেকে একটি নতুন ধারক ফেরত দেওয়ার চেষ্টা করে। একটি নেটওয়ার্ক সংযোগ অনুপলব্ধ এবং/অথবা সময়সীমা অতিক্রম করা হলে এটি একটি সংরক্ষিত ধারক ফেরত দেয়।

এটি এমন জায়গায় kTAGOpenTypePreferFresh ব্যবহার করার পরামর্শ দেওয়া হয় না যেখানে দীর্ঘ অনুরোধের সময় ব্যবহারকারীর অভিজ্ঞতাকে উল্লেখযোগ্যভাবে প্রভাবিত করতে পারে, যেমন UI পতাকা বা প্রদর্শন স্ট্রিং সহ। আপনি TAGContainer::refresh ব্যবহার করতে পারেন যে কোনো সময়ে একটি নেটওয়ার্ক কন্টেইনার অনুরোধ জোরপূর্বক করতে।

এই উভয় সুবিধার পদ্ধতিই অ-ব্লকিং। openContainerWithId:tagManager:openType:timeout: একটি TAGContainerFuture অবজেক্ট ফেরত দেয়, যার get পদ্ধতি একটি TAGContainer লোড হওয়ার সাথে সাথে ফেরত দেয় (তবে এটি ততক্ষণ পর্যন্ত ব্লক করা হবে)। openContainerWithId:tagManager:openType:timeout:notifier: পদ্ধতিটি একটি একক কলব্যাক নেয়, যখন কন্টেইনার উপলব্ধ থাকে তখন বলা হয়। উভয় পদ্ধতির একটি ডিফল্ট সময়সীমা 2.0 সেকেন্ড থাকে।

নিয়ম ব্যবহার করে রানটাইমে ম্যাক্রো মূল্যায়ন করা

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

রানটাইমে ডিভাইস ভাষার উপর ভিত্তি করে প্রদর্শন স্ট্রিং নির্বাচন করতে একটি নিয়ম ব্যবহার করা হয়: ভাষা সমান es। এই নিয়মটি পূর্ব-নির্ধারিত ভাষা ম্যাক্রো এবং একটি দুটি অক্ষরের ISO 639-1 ভাষা কোড ব্যবহার করে।
চিত্র 1: শুধুমাত্র স্প্যানিশ ভাষা ব্যবহার করার জন্য কনফিগার করা ডিভাইসগুলির জন্য একটি মান সংগ্রহ ম্যাক্রো সক্ষম করার জন্য একটি নিয়ম যোগ করা।

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

মনে রাখবেন যে আপনার ডিফল্ট কন্টেইনারের নিয়মের প্রয়োজন হলে, আপনাকে অবশ্যই আপনার ডিফল্ট ধারক হিসাবে একটি বাইনারি কন্টেইনার ফাইল ব্যবহার করতে হবে।

কনফিগার করার নিয়ম সম্পর্কে আরও জানুন (সহায়তা কেন্দ্র)।

বাইনারি ডিফল্ট কন্টেইনার ফাইল

যে ডিফল্ট কন্টেইনারগুলির নিয়মের প্রয়োজন হয় সেগুলিকে ডিফল্ট কন্টেইনার হিসাবে একটি সম্পত্তি তালিকা ফাইল বা JSON ফাইলের পরিবর্তে একটি বাইনারি কন্টেইনার ফাইল ব্যবহার করা উচিত। বাইনারি কন্টেনারগুলি Google ট্যাগ ম্যানেজার নিয়মের সাথে রানটাইমে ম্যাক্রো মান নির্ধারণের জন্য সমর্থন দেয়, যেখানে সম্পত্তি তালিকা বা JSON ফাইলগুলি তা করে না।

বাইনারি কন্টেইনার ফাইলগুলি Google ট্যাগ ম্যানেজার ওয়েব ইন্টারফেস থেকে ডাউনলোড করা যেতে পারে এবং এই নামকরণের নিয়ম অনুসরণ করে আপনার প্রধান অ্যাপ্লিকেশন বান্ডেলে যোগ করা উচিত: GTM-XXXX , যেখানে ফাইলের নাম আপনার কন্টেইনার আইডি উপস্থাপন করে৷

যে ক্ষেত্রে একটি সম্পত্তি তালিকা ফাইল এবং/অথবা JSON ফাইলের পাশাপাশি একটি বাইনারি কন্টেইনার ফাইল উপস্থিত থাকে, SDK ডিফল্ট কন্টেইনার হিসাবে বাইনারি কন্টেইনার ফাইল ব্যবহার করবে।

ফাংশন কল ম্যাক্রো ব্যবহার করে

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

একটি ফাংশন কল ম্যাক্রো কনফিগার করতে:

  1. Google ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে ফাংশন কল ম্যাক্রো সংজ্ঞায়িত করুন। আর্গুমেন্টগুলি ঐচ্ছিকভাবে কী-মানের জোড়া হিসাবে কনফিগার করা যেতে পারে।
  2. একটি হ্যান্ডলারকে সংজ্ঞায়িত করুন যা 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
    
  3. TAGContainer::registerFunctionCallMacroHandler:forMacro: এবং Google ট্যাগ ম্যানেজার ইন্টারফেসে নির্দিষ্ট ফাংশন নাম ব্যবহার করে হ্যান্ডলার নিবন্ধন করুন:
  4. //
    // 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 হিসাবে মূল্যায়ন করা হয়।

একটি ফাংশন কল ট্যাগ কনফিগার করতে:

  1. Google ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে ফাংশন কল ট্যাগ সংজ্ঞায়িত করুন। আর্গুমেন্টগুলি ঐচ্ছিকভাবে কী-মানের জোড়া হিসাবে কনফিগার করা যেতে পারে।
  2. 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
    
  3. Google ট্যাগ ম্যানেজার ওয়েব ইন্টারফেসে কনফিগার করা ট্যাগ নাম ব্যবহার করে ফাংশন কল ট্যাগ হ্যান্ডলার নিবন্ধন করুন:
  4. //
    // 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 ট্যাগ ম্যানেজার SDK একটি নতুন কন্টেইনার পুনরুদ্ধার করার চেষ্টা করবে যদি বর্তমান কন্টেইনারের বয়স 12 ঘন্টা অতিক্রম করে। একটি কাস্টম কন্টেইনার রিফ্রেশ পিরিয়ড সেট করতে, NSTimer ব্যবহার করুন, নিচের উদাহরণের মতো:

- (void)refreshContainer:(NSTimer *)timer {
  [self.container refresh];
}

self.refreshTimer = [NSTimer scheduledTimerWithTimeInterval:<refresh_interval>
                                                     target:self
                                                   selector:@selector(refreshContainer:)
                                                   userInfo:nil
                                                    repeats:YES];

লগার দিয়ে ডিবাগিং

Google ট্যাগ ম্যানেজার SDK ডিফল্টভাবে লগগুলিতে ত্রুটি এবং সতর্কতা প্রিন্ট করে। আরও ভার্বোস লগিং সক্ষম করা ডিবাগিংয়ের জন্য সহায়ক হতে পারে এবং এই উদাহরণের মতো আপনার নিজস্ব 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 ব্যবহার করে বিদ্যমান লগারের লগলেভেল সেট করতে পারেন, যেমন এই উদাহরণে:

// Change the LogLevel to INFO to enable logging at INFO and higher levels.
self.tagManager = [TAGManager instance];
[self.tagManager.logger setLogLevel:kTAGLoggerLogLevelInfo];