دليل الخطوات الأولى للهدف ج

يوضّح دليل المطوّرين هذا كيفية تنفيذ أداة "إدارة العلامات من Google" في تطبيق على الأجهزة الجوّالة.

مقدمة

تتيح أداة "إدارة العلامات من Google" للمطوّرين تغيير قيم الإعدادات في تطبيقاتهم للأجهزة الجوّالة باستخدام واجهة "إدارة العلامات من Google" بدون الحاجة إلى إعادة إنشاء وإعادة إرسال ملفات التطبيق الثنائية إلى أسواق التطبيقات.

ويكون ذلك مفيدًا لإدارة أي قيم إعدادات أو علامات في تطبيقك قد تحتاج إلى تغييرها في المستقبل، بما في ذلك:

  • إعدادات واجهة المستخدم وسلاسل العرض المختلفة
  • أحجام الإعلانات أو مواقعها أو أنواعها المعروضة في تطبيقك
  • إعدادات الألعاب

يمكن أيضًا تقييم قيم الإعدادات في وقت التشغيل باستخدام القواعد، ما يتيح إعدادات ديناميكية مثل:

  • استخدام حجم الشاشة لتحديد حجم بانر الإعلان
  • استخدام اللغة والموقع الجغرافي لضبط عناصر واجهة المستخدم

تتيح أداة Google Tag Manager أيضًا التنفيذ الديناميكي لعلامات التتبُّع ووحدات البكسل في التطبيقات. يمكن للمطوّرين إرسال الأحداث المهمة إلى طبقة البيانات وتحديد علامات التتبُّع أو وحدات البكسل التي يجب تفعيلها لاحقًا. تتيح أداة "إدارة العلامات من Google" استخدام العلامات التالية:

  • إحصاءات تطبيقات الأجهزة الجوّالة من Google
  • علامة استدعاء الدالة المخصّصة

قبل البدء

قبل استخدام دليل بدء الاستخدام هذا، يجب توفُّر ما يلي:

إذا كنت حديث العهد بأداة "إدارة العلامات من Google"، ننصحك بالاطّلاع على مزيد من المعلومات حول الحاويات ووحدات الماكرو والقواعد (مركز المساعدة) قبل مواصلة قراءة هذا الدليل.

البدء

سيرشد هذا القسم المطوّرين خلال سير عمل نموذجي في "إدارة العلامات من Google":

  1. إضافة حزمة تطوير البرامج (SDK) الخاصة بأداة "إدارة العلامات من Google" إلى مشروعك
  2. ضبط القيم التلقائية للحاوية
  3. فتح الحاوية
  4. الحصول على قيم الإعداد من الحاوية
  5. إرسال الأحداث إلى DataLayer
  6. معاينة الحاوية ونشرها

1. إضافة حزمة تطوير البرامج (SDK) الخاصة بأداة "إدارة العلامات من Google" إلى مشروعك

قبل استخدام حزمة تطوير البرامج (SDK) الخاصة بأداة "إدارة العلامات من Google"، عليك إضافة libGoogleAnalyticsServices.a وملفات العناوين الخاصة بأداة "إدارة العلامات من Google" من الدليل Library لحزمة SDK إلى مشروعك.

بعد ذلك، أضِف ما يلي إلى المكتبات المرتبطة بهدف تطبيقك إذا لم تكن موجودة من قبل:

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

إذا كنت تريد أن يصل تطبيقك إلى معرّف المعلِنين (IDFA) وعلامة التتبُّع التي يوفّرها هذا الإطار من خلال وحدات ماكرو في حزمة تطوير البرامج (SDK) الخاصة بـ "إدارة العلامات من Google"، عليك أيضًا ربط المكتبات الإضافية التالية:

  • libAdIdAccess.a
  • AdSupport.framework

2. إضافة ملف حاوية تلقائي إلى مشروعك

تستخدِم أداة Google Tag Manager حاوية تلقائية عند تشغيل تطبيقك للمرة الأولى. سيتم استخدام الحاوية التلقائية إلى أن يتمكّن التطبيق من استرداد حاوية جديدة عبر الشبكة.

لتنزيل برنامج ثنائي للحاوية التلقائية وإضافته إلى تطبيقك، اتّبِع الخطوات التالية:

  1. سجِّل الدخول إلى واجهة الويب الخاصة بأداة "إدارة العلامات من Google".
  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 هي خريطة تتيح توفير معلومات وقت التشغيل حول تطبيقك، مثل أحداث اللمس أو مشاهدات الشاشة، لوحدات الماكرو والعلامات في "إدارة العلامات من Google" ضمن حاوية.

على سبيل المثال، من خلال إرسال معلومات حول مشاهدات الشاشة إلى خريطة DataLayer، يمكنك إعداد علامات في واجهة الويب الخاصة بأداة &quot;إدارة العلامات من Google&quot; لتفعيل وحدات البكسل الخاصة بالإحالات الناجحة وطلبات التتبُّع استجابةً لمشاهدات الشاشة هذه بدون الحاجة إلى ترميزها بشكل ثابت في تطبيقك.

يتم إرسال الأحداث إلى 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") يتم تفعيلها لكل مشاهدة صفحة في التطبيق من خلال إنشاء هذه القاعدة: يساوي openScreen. لتمرير اسم الشاشة إلى أحد هذه العلامات، أنشئ ماكرو لطبقة البيانات يشير إلى المفتاح "screenName" في طبقة البيانات. يمكنك أيضًا إنشاء علامة (مثل بكسل تتبُّع الإحالات الناجحة في "إعلانات Google") ليتم تنشيطها فقط عند عرض شاشات معيّنة، وذلك من خلال إنشاء قاعدة يكون فيها مساويًا لـ "openScreen" و مساويًا لـ "ConfirmationScreen".

6. معاينة حاوية ونشرها

ستتطابق قيم وحدات الماكرو دائمًا مع الإصدار المنشور الحالي. قبل نشر أحدث إصدار من الحاوية، يمكنك معاينة مسودة الحاوية.

لمعاينة حاوية، أنشئ عنوان URL للمعاينة في واجهة الويب الخاصة بأداة Google Tag Manager من خلال اختيار إصدار الحاوية الذي تريد معاينته، ثم النقر على Preview. احفظ عنوان URL الخاص بالمعاينة لأنّك ستحتاج إليه في خطوات لاحقة.

تتوفّر عناوين URL للمعاينة في نافذة المعاينة لواجهة الويب الخاصة بـ &quot;إدارة العلامات من Google&quot;
الشكل 1: الحصول على عنوان URL للمعاينة من واجهة الويب الخاصة بأداة &quot;إدارة العلامات من Google&quot;

لتفعيل معاينات الحاويات، يجب إضافة رمز إلى ملف تنفيذ تفويض تطبيقك وتحديد مخطط عنوان 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 الخاص بالمعاينة في &quot;مدير العلامات&quot; في ملف قائمة الخصائص لتطبيقك.
الشكل 3: إضافة مخطط URL لمعاينة Tag Manager إلى ملف قائمة الخصائص لتطبيقك

افتح الرابط على محاكي أو جهاز فعلي لمعاينة مسودة الحاوية في تطبيقك.

عندما تكون مستعدًا لإتاحة قيم الإعدادات الأولية في تطبيقك، انشر الحاوية.

إعدادات متقدّمة

تتضمّن أداة &quot;إدارة العلامات من Google&quot; للأجهزة الجوّالة عددًا من خيارات الإعداد المتقدّمة التي تتيح لك اختيار القيم استنادًا إلى شروط وقت التشغيل باستخدام القواعد، وتحديث الحاوية يدويًا، والحصول على خيارات إضافية لفتح الحاويات. توضّح الأقسام التالية بعض الإعدادات المتقدّمة الأكثر شيوعًا.

خيارات متقدّمة لفتح الحاويات

توفّر حزمة تطوير البرامج (SDK) الخاصة بأداة &quot;إدارة العلامات من Google&quot; عدة طرق لفتح الحاويات، ما يمنحك المزيد من التحكّم في عملية التحميل:

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 حدث خطأ في الإدخال/الإخراج منع إعادة تحميل الحاوية.
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.
الشكل 1:إضافة قاعدة لتفعيل ماكرو لجمع القيم للأجهزة التي تم ضبطها على اللغة الإسبانية فقط

يمكنك بعد ذلك إنشاء وحدات ماكرو لجمع القيم لكل لغة، وإضافة هذه القاعدة إلى كل وحدة ماكرو، مع إدراج رمز اللغة المناسب. عند نشر هذا الحاوية، سيتمكّن تطبيقك من عرض سلاسل العرض المترجَمة، وذلك حسب لغة جهاز المستخدم في وقت التشغيل.

يُرجى العِلم أنّه إذا كانت الحاوية التلقائية تتطلّب قواعد، عليك استخدام ملف حاوية ثنائي كحاوية تلقائية.

مزيد من المعلومات حول ضبط القواعد (مركز المساعدة)

ملفات الحاويات الثنائية التلقائية

يجب أن تستخدم الحاويات التلقائية التي تحتاج إلى قواعد ملف حاوية ثنائيًا بدلاً من ملف قائمة مواقع أو ملف JSON كحاوية تلقائية. تتيح الحاويات الثنائية إمكانية تحديد قيم وحدات الماكرو في وقت التشغيل باستخدام قواعد &quot;إدارة العلامات من Google&quot;، بينما لا تتيح ذلك ملفات قائمة الخصائص أو JSON.

يمكن تنزيل ملفات الحاويات الثنائية من واجهة الويب الخاصة بأداة &quot;إدارة العلامات من Google&quot;، ويجب إضافتها إلى حزمة التطبيق الرئيسية باتّباع اصطلاح التسمية التالي: 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:
    //
    // 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. سجِّل معالج علامة استدعاء الدالة باستخدام اسم العلامة الذي تم ضبطه في واجهة الويب الخاصة بأداة &quot;إدارة العلامات من Google&quot;:
    //
    // 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

ضبط فترة إعادة تحميل مخصّصة

سيحاول حزمة تطوير البرامج (SDK) الخاصة بـ Google Tag Manager استرداد حاوية جديدة إذا تجاوز عمر الحاوية الحالية 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

تعرض حزمة تطوير البرامج (SDK) الخاصة بأداة Google Tag Manager الأخطاء والتحذيرات في السجلات تلقائيًا. يمكن أن يكون تفعيل التسجيل المطوَّل مفيدًا لتصحيح الأخطاء، ويمكنك إجراء ذلك من خلال تنفيذ 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

أو يمكنك ضبط LogLevel الخاص بـ Logger الحالي باستخدام 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];