ऑब्जेक्टिव-सी के लिए शुरुआती निर्देश

इस डेवलपर गाइड में बताया गया है कि मोबाइल ऐप्लिकेशन में Google Tag Manager को कैसे लागू किया जाता है.

शुरुआती जानकारी

Google Tag Manager की मदद से डेवलपर, Google Tag Manager इंटरफ़ेस का इस्तेमाल करके अपने मोबाइल ऐप्लिकेशन में कॉन्फ़िगरेशन की वैल्यू बदल सकते हैं. इसके लिए, उन्हें ऐप्लिकेशन बाइनरी बनाने की ज़रूरत नहीं है.

यह आपके ऐप्लिकेशन में किसी भी कॉन्फ़िगरेशन वैल्यू या फ़्लैग को मैनेज करने के लिए फ़ायदेमंद है, जिसमें आपको आने वाले समय में बदलाव करने की ज़रूरत पड़ सकती है. इनमें ये शामिल हैं:

  • कई यूज़र इंटरफ़ेस (यूआई) सेटिंग और डिसप्ले स्ट्रिंग
  • आपके ऐप्लिकेशन में दिखाए जाने वाले विज्ञापनों के साइज़, जगह या टाइप
  • गेम की सेटिंग

रनटाइम पर कॉन्फ़िगरेशन वैल्यू का आकलन भी नियमों का इस्तेमाल करके किया जा सकता है. इससे डाइनैमिक कॉन्फ़िगरेशन चालू होते हैं, जैसे:

  • विज्ञापन बैनर का साइज़ तय करने के लिए, स्क्रीन साइज़ का इस्तेमाल करना
  • यूज़र इंटरफ़ेस (यूआई) एलिमेंट कॉन्फ़िगर करने के लिए, भाषा और जगह की जानकारी का इस्तेमाल करना

Google TagManager, ऐप्लिकेशन में ट्रैकिंग टैग और पिक्सल को डाइनैमिक तरीके से लागू करने की सुविधा भी देता है. डेवलपर, ज़रूरी इवेंट को डेटा लेयर में डाल सकते हैं. साथ ही, बाद में यह तय कर सकते हैं कि किस ट्रैकिंग टैग या पिक्सल को ट्रिगर करना है. फ़िलहाल, TagManager इन टैग के साथ काम करता है:

  • Google Mobile App Analytics
  • कस्टम फ़ंक्शन कॉल टैग

आरंभ करने से पहले

इस शुरुआती निर्देश का इस्तेमाल करने से पहले, आपको इनकी ज़रूरत होगी:

अगर आपने Google Tag Manager का इस्तेमाल पहले कभी नहीं किया है, तो हमारा सुझाव है कि इस गाइड को जारी रखने से पहले, आप कंटेनर, मैक्रो, और नियमों (सहायता केंद्र) के बारे में ज़्यादा जानें.

YouTube पर शुरुआत करना

यह सेक्शन, Tag Manager के सामान्य वर्कफ़्लो के बारे में डेवलपर को गाइड करेगा:

  1. अपने प्रोजेक्ट में Google Tag Manager SDK टूल जोड़ना
  2. कंटेनर की डिफ़ॉल्ट वैल्यू सेट करना
  3. कंटेनर खोलें
  4. कंटेनर से कॉन्फ़िगरेशन वैल्यू पाना
  5. Datalayer में इवेंट पुश करें
  6. कंटेनर की झलक देखना और उसे पब्लिश करना

1. अपने प्रोजेक्ट में Google Tag Manager SDK टूल जोड़ना

Google Tag Manager SDK टूल का इस्तेमाल करने से पहले, आपको SDK पैकेज की Library डायरेक्ट्री से, अपने प्रोजेक्ट में libGoogleAnalyticsServices.a और Google Tag Manager (GTM) हेडर फ़ाइलें जोड़नी होंगी.

इसके बाद, अगर आपके ऐप्लिकेशन के टारगेट की लिंक की गई लाइब्रेरी पहले से मौजूद नहीं हैं, तो उन्हें जोड़ें:

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

अगर आप चाहते हैं कि आपका ऐप्लिकेशन, विज्ञापन देने वालों (IDFA) और उस फ़्रेमवर्क से मिले ट्रैकिंग फ़्लैग को ऐक्सेस करे, जो Google Tag Manager SDK मैक्रो से मिले हों, तो आपको इन अतिरिक्त लाइब्रेरी को भी लिंक करना होगा:

  • libAdIdAccess.a
  • AdSupport.framework

2. अपने प्रोजेक्ट में डिफ़ॉल्ट कंटेनर फ़ाइल जोड़ना

आपका ऐप्लिकेशन पहली बार चलाए जाने पर, Google Tag Manager एक डिफ़ॉल्ट कंटेनर का इस्तेमाल करता है. डिफ़ॉल्ट कंटेनर का इस्तेमाल तब तक किया जाएगा, जब तक ऐप्लिकेशन, नेटवर्क पर नया कंटेनर हासिल नहीं कर लेता.

डिफ़ॉल्ट कंटेनर बाइनरी डाउनलोड करके अपने ऐप्लिकेशन में जोड़ने के लिए, यह तरीका अपनाएं:

  1. Google Tag Manager के वेब इंटरफ़ेस में साइन इन करें.
  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 में वैल्यू पुश करना

DataLine एक ऐसा मैप है जो आपके ऐप्लिकेशन के रनटाइम की जानकारी को चालू करता है. जैसे, टच इवेंट या स्क्रीन व्यू. इससे कंटेनर में मौजूद टैग मैनेजर मैक्रो और टैग के लिए, रनटाइम की जानकारी उपलब्ध कराई जा सकती है.

उदाहरण के लिए, स्क्रीन व्यू के बारे में जानकारी को Datalayer मैप में पुश करके, आप Tag Manager वेब इंटरफ़ेस में टैग सेट अप कर सकते हैं, ताकि कन्वर्ज़न पिक्सल ट्रिगर किए जा सकें. साथ ही, उन स्क्रीन व्यू के जवाब में कॉल ट्रैक किए जा सकें. इसके लिए, आपको अपने ऐप्लिकेशन में हार्ड कोड करने की ज़रूरत नहीं है.

push: का इस्तेमाल करके, इवेंट को Datalayer में पुश किया जाता है

//
//  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 टैग) बना सकते हैं: इसके बराबर है "openScreen". स्क्रीन के नाम को इनमें से किसी एक टैग को पास करने के लिए, डेटा लेयर मैक्रो बनाएं. यह मैक्रो डेटा लेयर में "screenName" कुंजी का इस्तेमाल करता है. सिर्फ़ खास स्क्रीन व्यू को चालू करने के लिए, एक टैग (जैसे कि Google Ads कन्वर्ज़न पिक्सल) भी बनाया जा सकता है. ऐसा करने के लिए एक ऐसा नियम बनाया जा सकता है जिसमें equals "openScreen" && equals "ConfirmationScreen" बराबर हो.

6. कंटेनर की झलक देखना और उसे पब्लिश करना

मैक्रो वैल्यू हमेशा, पब्लिश किए गए मौजूदा वर्शन के हिसाब से होंगी. कंटेनर का सबसे नया वर्शन पब्लिश करने से पहले, अपने ड्राफ़्ट कंटेनर की झलक देखी जा सकती है.

कंटेनर की झलक देखने के लिए, कंटेनर के उस वर्शन को चुनकर Preview को चुनें जिसकी झलक आपको देखनी है. ऐसा करके, Google Tag Manager के वेब इंटरफ़ेस में झलक दिखाने वाला यूआरएल जनरेट करें. इस झलक यूआरएल पर बने रहें, क्योंकि आपको बाद के चरणों में इसकी ज़रूरत पड़ेगी.

झलक यूआरएल, Tag Manager वेब इंटरफ़ेस की झलक विंडो में उपलब्ध हैं
पहली इमेज: Tag Manager के वेब इंटरफ़ेस से, झलक दिखाने वाला यूआरएल पाना.

कंटेनर की झलक चालू करने के लिए, आपको अपने ऐप्लिकेशन प्रतिनिधि को लागू करने वाली फ़ाइल में कोड जोड़ना होगा. साथ ही, अपने प्रोजेक्ट की प्रॉपर्टी की सूची में Google Tag Manager की झलक दिखाने वाले यूआरएल स्कीम को तय करना होगा.

सबसे पहले, अपनी ऐप्लिकेशन डेलिगेट फ़ाइल में ये बोल्ड कोड स्निपेट जोड़ें:

@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 identifier: your.package_name
URL scheme: tagmanager.c.your.package.name
अपने ऐप्लिकेशन की प्रॉपर्टी की सूची वाली फ़ाइल में, Tag Manager की झलक दिखाने वाली यूआरएल स्कीम को रजिस्टर करें.
तीसरी इमेज: अपने ऐप्लिकेशन की प्रॉपर्टी की सूची वाली फ़ाइल में, Tag Manager की झलक दिखाने वाली यूआरएल स्कीम जोड़ना.

अपने ऐप्लिकेशन में ड्राफ़्ट कंटेनर की झलक देखने के लिए, एम्युलेटर या फ़िज़िकल डिवाइस पर इस लिंक को खोलें.

जब आप अपने ऐप्लिकेशन पर ड्राफ़्ट कॉन्फ़िगरेशन की वैल्यू उपलब्ध कराने के लिए तैयार हों, तब कंटेनर पब्लिश करें.

बेहतर कॉन्फ़िगरेशन

मोबाइल के लिए Google Tag Manager में कॉन्फ़िगरेशन के कई बेहतर विकल्प हैं. इनकी मदद से, नियमों का इस्तेमाल करके रनटाइम की शर्तों के आधार पर वैल्यू चुनी जा सकती हैं, कंटेनर को मैन्युअल तरीके से रीफ़्रेश किया जा सकता है, और कंटेनर खोलने के लिए अतिरिक्त विकल्प मिलते हैं. नीचे दिए गए सेक्शन में, आम तौर पर इस्तेमाल होने वाले बेहतर कॉन्फ़िगरेशन की जानकारी दी गई है.

कंटेनर खोलने के लिए बेहतर विकल्प

Google Tag Manager SDK टूल, कंटेनर खोलने के लिए कई तरीके उपलब्ध कराता है. इनकी मदद से, लोड होने की प्रोसेस पर ज़्यादा कंट्रोल पाया जा सकता है:

OpenContainerById:कॉलबैक:

कंटेनर खोलने के लिए, openContainerById:callback: सबसे निचले लेवल का और सबसे सुविधाजनक एपीआई है. अगर सेव किया गया कंटेनर मौजूद नहीं है या सेव किया गया कंटेनर नया नहीं है (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 वैल्यू को इन कॉलबैक में आर्ग्युमेंट के तौर पर पास करता है:

RefreshType

वैल्यूब्यौरा
kTAGContainerCallbackRefreshTypeSaved रीफ़्रेश करने का अनुरोध, स्थानीय तौर पर सेव किया गया कंटेनर लोड कर रहा है.
kTAGContainerCallbackRefreshTypeNetwork रीफ़्रेश करने का अनुरोध, नेटवर्क पर कंटेनर लोड किया जा रहा है.

RefreshFailure

वैल्यूब्यौरा
kTAGContainerCallbackRefreshFailureNoSavedContainer सेव किया गया कोई कंटेनर उपलब्ध नहीं है.
kTAGContainerCallbackRefreshFailureIoError I/O गड़बड़ी की वजह से कंटेनर को रीफ़्रेश नहीं किया जा सका.
kTAGContainerCallbackRefreshFailureNoNetwork इंटरनेट नहीं है.
kTAGContainerCallbackRefreshFailureNetworkError नेटवर्क में कोई गड़बड़ी हुई.
kTAGContainerCallbackRefreshFailureServerError सर्वर में कोई गड़बड़ी हुई.
kTAGContainerCallbackRefreshFailureUnknownError एक ऐसी गड़बड़ी हुई है जिसे कैटगरी में नहीं बांटा जा सकता.

ऐसे कंटेनर खोलने के तरीके जो डिफ़ॉल्ट नहीं हैं और नए हैं

TAGContainerOpener, openContainerById:callback: को रैप करता है और कंटेनर खोलने के लिए दो आसान तरीके देता है: openContainerWithId:tagManager:openType:timeout:notifier: और openContainerWithId:tagManager:openType:timeout:.

इनमें से हर एक तरीके की मदद से गिनती के आधार पर या तो नॉन-डिफ़ॉल्ट या फ़्रेश कंटेनर का अनुरोध किया जाता है.

ज़्यादातर ऐप्लिकेशन के लिए kTAGOpenTypePreferNonDefault का सुझाव दिया जाता है. यह सलाह दी जाती है कि Drive या नेटवर्क से किसी समयसीमा के अंदर, पहले मौजूद नॉन-डिफ़ॉल्ट कंटेनर को वापस लाने की कोशिश की जाए. भले ही, वह कंटेनर 12 घंटे से ज़्यादा पुराना हो. अगर यह सेव किया गया पुराना कंटेनर दिखाता है, तो यह नए के लिए एसिंक्रोनस नेटवर्क अनुरोध भी करेगा. kTAGOpenTypePreferNonDefault का इस्तेमाल करते समय, अगर कोई दूसरा कंटेनर उपलब्ध नहीं है या टाइम आउट की अवधि तय सीमा से ज़्यादा हो गई है, तो डिफ़ॉल्ट कंटेनर दिखाया जाएगा.

kTAGOpenTypePreferFresh तय टाइम आउट अवधि के अंदर, डिस्क या नेटवर्क से नया कंटेनर दिखाने की कोशिश करता है. नेटवर्क कनेक्शन उपलब्ध न होने और/या टाइम आउट की अवधि खत्म होने पर, यह सेव किया गया कंटेनर दिखाता है.

ऐसी जगहों पर kTAGOpenTypePreferFresh का इस्तेमाल करने का सुझाव नहीं दिया जाता जहां अनुरोध करने में ज़्यादा समय लगता है, जिससे उपयोगकर्ता अनुभव पर काफ़ी असर पड़ सकता है, जैसे कि यूज़र इंटरफ़ेस (यूआई) फ़्लैग या डिसप्ले स्ट्रिंग. नेटवर्क कंटेनर का अनुरोध करने के लिए, TAGContainer::refresh का इस्तेमाल किसी भी समय किया जा सकता है.

सुविधा के ये दोनों तरीके ब्लॉक नहीं किए जा सकते. openContainerWithId:tagManager:openType:timeout: एक TAGContainerFuture ऑब्जेक्ट दिखाता है, जिसका get तरीका लोड होते ही TAGContainer दिखाता है (लेकिन तब तक यह ब्लॉक हो जाएगा). openContainerWithId:tagManager:openType:timeout:notifier: तरीके के लिए सिर्फ़ एक कॉलबैक लिया जाता है, जिसे कंटेनर उपलब्ध होने पर कॉल किया जाता है. दोनों तरीकों के लिए, टाइम आउट की डिफ़ॉल्ट अवधि 2.0 सेकंड है.

नियमों का इस्तेमाल करके रनटाइम में मैक्रो का आकलन करना

कंटेनर, नियमों का इस्तेमाल करके रनटाइम के दौरान वैल्यू का आकलन कर सकते हैं. नियम, डिवाइस की भाषा, प्लैटफ़ॉर्म या किसी अन्य मैक्रो वैल्यू जैसी शर्तों पर आधारित हो सकते हैं. उदाहरण के लिए, नियमों का इस्तेमाल रनटाइम के समय डिवाइस की भाषा के आधार पर स्थानीय जगह के अनुसार डिसप्ले स्ट्रिंग चुनने के लिए किया जा सकता है. इसे नीचे दिए गए नियम का इस्तेमाल करके कॉन्फ़िगर किया जा सकता है:

रनटाइम के दौरान, डिवाइस की भाषा के आधार पर डिसप्ले स्ट्रिंग
            चुनने के लिए एक नियम का इस्तेमाल किया जाता है: भाषा es के बराबर है. इस नियम में पहले से तय भाषा मैक्रो और दो वर्ण वाले ISO 639-1 भाषा कोड का इस्तेमाल किया जाता है.
पहली इमेज: स्पैनिश भाषा का इस्तेमाल करने के लिए कॉन्फ़िगर किए गए डिवाइसों के लिए, वैल्यू कलेक्शन मैक्रो चालू करने का नियम जोड़ा जा रहा है.

इसके बाद, हर भाषा के लिए वैल्यू कलेक्शन मैक्रो बनाए जा सकते हैं और इस नियम को हर मैक्रो में जोड़ा जा सकता है. साथ ही, सही भाषा कोड डाला जा सकता है. इस कंटेनर के पब्लिश होने पर, आपका ऐप्लिकेशन स्थानीय जगह के हिसाब से डिसप्ले स्ट्रिंग दिखा पाएगा. हालांकि, रनटाइम के समय, यह उपयोगकर्ता के डिवाइस की भाषा पर निर्भर करता है.

ध्यान दें कि अगर आपके डिफ़ॉल्ट कंटेनर को नियमों की ज़रूरत है, तो आपको डिफ़ॉल्ट कंटेनर के तौर पर बाइनरी कंटेनर फ़ाइल का इस्तेमाल करना होगा.

नियम कॉन्फ़िगर करने के बारे में ज़्यादा जानें (सहायता केंद्र).

बाइनरी डिफ़ॉल्ट कंटेनर फ़ाइलें

जिन डिफ़ॉल्ट कंटेनर को नियमों की ज़रूरत होती है उन्हें डिफ़ॉल्ट कंटेनर के तौर पर, प्रॉपर्टी की सूची वाली फ़ाइल या JSON फ़ाइल के बजाय, बाइनरी कंटेनर फ़ाइल का इस्तेमाल करना चाहिए. बाइनरी कंटेनर, रनटाइम के दौरान Google Tag Manager के नियमों की मदद से मैक्रो वैल्यू तय करने में मदद करते हैं, जबकि प्रॉपर्टी की सूची या JSON फ़ाइलें ऐसा नहीं करती हैं.

बाइनरी कंटेनर फ़ाइलें, Google Tag Manager के वेब इंटरफ़ेस से डाउनलोड की जा सकती हैं. इसके बाद, इन्हें नाम वाले इस कन्वेंशन के बाद आपके मुख्य ऐप्लिकेशन बंडल में जोड़ा जाना चाहिए: GTM-XXXX, जहां फ़ाइल का नाम आपके कंटेनर आईडी को दिखाता है.

अगर प्रॉपर्टी की सूची वाली फ़ाइल और/या JSON फ़ाइल के साथ-साथ बाइनरी कंटेनर फ़ाइल भी मौजूद है, तो SDK टूल, बाइनरी कंटेनर फ़ाइल को डिफ़ॉल्ट कंटेनर के तौर पर इस्तेमाल करेगा.

फ़ंक्शन कॉल मैक्रो का इस्तेमाल करना

फ़ंक्शन कॉल मैक्रो ऐसे मैक्रो होते हैं जो आपके ऐप्लिकेशन में दिए गए किसी फ़ंक्शन की रिटर्न वैल्यू पर सेट होते हैं. फ़ंक्शन कॉल मैक्रो का इस्तेमाल अपने Google Tag Manager के नियमों के साथ रनटाइम वैल्यू को शामिल करने के लिए किया जा सकता है. उदाहरण के लिए, यह तय किया जा सकता है कि उपयोगकर्ता को डिवाइस की कॉन्फ़िगर की गई भाषा और मुद्रा के आधार पर, रनटाइम की कौनसी कीमत दिखानी है.

फ़ंक्शन कॉल मैक्रो कॉन्फ़िगर करने के लिए:

  1. Google Tag Manager वेब इंटरफ़ेस में फ़ंक्शन कॉल मैक्रो तय करें. तर्क, विकल्प के तौर पर की-वैल्यू पेयर के तौर पर कॉन्फ़िगर किए जा सकते हैं.
  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 Tag Manager इंटरफ़ेस में बताए गए फ़ंक्शन नाम का इस्तेमाल करके हैंडलर को रजिस्टर करें:
  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 Tag Manager वेब इंटरफ़ेस में फ़ंक्शन कॉल टैग तय करें. तर्क, विकल्प के तौर पर की-वैल्यू पेयर के तौर पर कॉन्फ़िगर किए जा सकते हैं.
  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 Tag Manager वेब इंटरफ़ेस में कॉन्फ़िगर किए गए टैग के नाम का इस्तेमाल करके, फ़ंक्शन कॉल टैग हैंडलर रजिस्टर करें:
  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
    

रीफ़्रेश करने के लिए कस्टम पीरियड सेट करना

अगर मौजूदा कंटेनर की उम्र 12 घंटे से ज़्यादा है, तो 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];

लॉगर की मदद से डीबग करना

Google Tag Manager 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 का इस्तेमाल करके, मौजूदा लॉगर का Loglevel सेट किया जा सकता है, जैसा कि इस उदाहरण में दिखाया गया है:

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