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

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

परिचय

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

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

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

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

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

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

  • Google मोबाइल ऐप्लिकेशन Analytics
  • कस्टम फ़ंक्शन कॉल टैग

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

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

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

शुरू करें

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

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

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

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

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

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

अगर आपको ऐप्लिकेशन को विज्ञापन देने वालों (IDFA) और ट्रैकिंग फ़्लैग का इस्तेमाल करके, Google टैग मैनेजर 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 एक ऐसा मैप है जो आपके ऐप्लिकेशन के बारे में रनटाइम की जानकारी को चालू करता है, जैसे कि टच इवेंट या स्क्रीन व्यू, ताकि टैग मैनेजर मैक्रो और टैग में कंटेनर.

उदाहरण के लिए, स्क्रीन व्यू की जानकारी को 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 कन्वर्ज़न पिक्सल) को सिर्फ़ खास स्क्रीन व्यू के लिए फ़ायर करने के लिए सेट करें. एक नियम बनाकर जिसमें बराबर है "openScreen" && "ConfirmationScreen" के बराबर है.

6. पूर्वावलोकन और कंटेनर को पब्लिश करना

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

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

टैग की झलक विंडो में, झलक वाले यूआरएल उपलब्ध होते हैं
           मैनेजर वेब इंटरफ़ेस
पहली इमेज: इस इमेज से झलक दिखाने वाला यूआरएल पाना 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
अपने ऐप्लिकेशन के टैग मैनेजर पूर्वावलोकन URL स्कीम को पंजीकृत करें
                प्रॉपर्टी की सूची वाली फ़ाइल है.
तीसरी इमेज: Tag Manager की झलक में शामिल यूआरएल स्कीम जोड़ना को आपके ऐप्लिकेशन की प्रॉपर्टी सूची फ़ाइल में लिंक कर सकता है.

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

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

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

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

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

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

openContainerById:callback:

किसी ऐप्लिकेशन को खोलने के लिए, 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 का इस्तेमाल करने का सुझाव दिया जाता है. दिए गए मान में पहले उपलब्ध गैर-डिफ़ॉल्ट कंटेनर को लौटाने का प्रयास करता है डिस्क या नेटवर्क से टाइम आउट की अवधि, भले ही वह कंटेनर ज़्यादा हो 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 टैग मैनेजर के नियमों के साथ रनटाइम के दौरान मैक्रो मान, जबकि प्रॉपर्टी की सूची या JSON फ़ाइलें नहीं हैं.

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

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

फ़ंक्शन कॉल मैक्रो का उपयोग करना

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

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

  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 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

कस्टम रीफ़्रेश अवधि सेट करना

Google Tag Manager 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];

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

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, जैसा कि इस उदाहरण में बताया गया है:

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