Objective-C için Başlangıç Kılavuzu

Bu geliştirici kılavuzunda, Google Etiket Yöneticisi'nin mobil uygulamalarda nasıl uygulanacağı açıklanmaktadır.

Giriş

Google Etiket Yöneticisi, geliştiricilerin uygulama ikililerini yeniden oluşturup uygulama pazarlarına yeniden göndermeleri gerekmeden Google Etiket Yöneticisi arayüzünü kullanarak mobil uygulamalarındaki yapılandırma değerlerini değiştirmesine olanak tanır.

Bu, uygulamanızdaki yapılandırma değerlerini veya işaretleri yönetmek için kullanışlıdır. Gelecekte değiştirmeniz gerekebilecek değerler ve işaretler arasında şunlar yer alır:

  • Çeşitli kullanıcı arayüzü ayarları ve görüntü dizeleri
  • Uygulamanızda yayınlanan reklamların boyutları, konumları veya türleri
  • Oyun ayarları

Yapılandırma değerleri, kurallar kullanılarak çalışma zamanında da değerlendirilebilir. Bu sayede aşağıdaki gibi dinamik yapılandırmalar etkinleştirilebilir:

  • Reklam banner'ı boyutunu belirlemek için ekran boyutunu kullanma
  • Kullanıcı arayüzü öğelerini yapılandırmak için dili ve konumu kullanma

Google Etiket Yöneticisi, uygulamalarda izleme etiketlerinin ve piksellerin dinamik olarak uygulanmasını da sağlar. Geliştiriciler, önemli etkinlikleri bir veri katmanına gönderebilir ve hangi izleme etiketlerinin veya piksellerin tetiklenmesi gerektiğine daha sonra karar verebilir. TagManager aşağıdaki etiketleri destekler:

  • Google Mobil Uygulama Analizi
  • Özel işlev çağrısı etiketi

Başlamadan Önce

Bu başlangıç kılavuzunu kullanmadan önce aşağıdakilere ihtiyacınız olacaktır:

Google Etiket Yöneticisi'ni yeni kullanmaya başladıysanız bu kılavuza devam etmeden önce kapsayıcılar, makrolar ve kurallar hakkında daha fazla bilgi edinmenizi (Yardım Merkezi) öneririz.

Başlarken

Bu bölümde, geliştiricilere tipik bir Etiket Yöneticisi iş akışı hakkında bilgi verilir:

  1. Google Etiket Yöneticisi SDK'sını projenize ekleme
  2. Varsayılan kapsayıcı değerlerini ayarlama
  3. Kapsayıcıyı açma
  4. Kapsayıcıdan Yapılandırma Değerlerini Alma
  5. Etkinlikleri DataLayer'a aktarma
  6. Kapsayıcıyı Önizleme ve Yayınlama

1. Google Etiket Yöneticisi SDK'sını Projenize Ekleme

Google Etiket Yöneticisi SDK'sını kullanmadan önce, SDK paketinin libGoogleAnalyticsServices.a Library dizinindeki Google Etiket Yöneticisi (GTM) üstbilgi dosyalarını projenize eklemeniz gerekir.

Ardından, aşağıdaki kitaplıkları uygulama hedefinizin bağlı kitaplıklarına ekleyin (henüz eklenmemişlerse):

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

Uygulamanızın, Google Etiket Yöneticisi SDK makroları aracılığıyla reklamverenler için tanımlayıcıya (IDFA) ve bu çerçeve tarafından sağlanan izleme işaretine erişmesini istiyorsanız şu ek kitaplıkları da bağlamanız gerekir:

  • libAdIdAccess.a
  • AdSupport.framework

2. Projenize Varsayılan Kapsayıcı Dosyası Ekleme

Google Etiket Yöneticisi, uygulamanızın ilk çalıştırılmasında varsayılan bir kapsayıcı kullanır. Uygulama, ağ üzerinden yeni bir kapsayıcı alana kadar varsayılan kapsayıcı kullanılır.

Uygulamanıza varsayılan kapsayıcı ikili programı indirip eklemek için aşağıdaki adımları uygulayın:

  1. Google Etiket Yöneticisi web arayüzünde oturum açın.
  2. İndirmek istediğiniz kapsayıcının sürümünü seçin.
  3. Kapsayıcı ikilisini almak için İndir düğmesini tıklayın.
  4. İkili program dosyasını projenizin kök dizinine ve projenizdeki "Supporting Files" (Destekleyici Dosyalar) klasörüne ekleyin.

Varsayılan dosya adı, kapsayıcı kimliği olmalıdır (örneğin, GTM-1234). İkili program dosyasını indirdikten sonra doğru adlandırma kuralına uyduğunuzdan emin olmak için dosya adından sürüm son ekini kaldırmayı unutmayın.

İkili program dosyası kullanılması önerilse de kapsayıcınızda kural veya etiket yoksa bunun yerine özellik listesi ya da JSON dosyası kullanabilirsiniz. Dosya, ana pakette bulunmalı ve şu adlandırma kuralına uymalıdır: <Container_ID>.<plist|json>. Örneğin, kapsayıcı kimliğiniz GTM-1234 ise varsayılan kapsayıcı değerlerinizi GTM-1234.plist adlı bir özellik listesi dosyasında belirtebilirsiniz.

3. Kapsayıcıyı açma

Bir kapsayıcıdan değer almadan önce uygulamanızın kapsayıcıyı açması gerekir. Bir kapsayıcıyı açtığınızda kapsayıcı, diskten (varsa) yüklenir veya gerekirse ağdan istenir.

iOS'te bir kapsayıcıyı açmanın en kolay yolu, aşağıdaki örnekte gösterildiği gibi openContainerWithId:tagManager:openType:timeout:notifier: kullanmaktır:

// 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. Kapsayıcıdan Yapılandırma Değerlerini Alma

Kapsayıcı açıldıktan sonra, yapılandırma değerleri <type>ForKey: yöntemleri kullanılarak alınabilir:

// 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"];

Mevcut olmayan bir anahtarla yapılan istekler, istenen türe uygun bir varsayılan değer döndürür:

// 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. Değerleri dataLayer'a aktarma

DataLayer, uygulamanızla ilgili çalışma zamanı bilgilerinin (ör. dokunma etkinlikleri veya ekran görüntülemeleri) bir kapsayıcıdaki Etiket Yöneticisi makroları ve etiketleri tarafından kullanılabilmesini sağlayan bir haritadır.

Örneğin, ekran görüntülemeleriyle ilgili bilgileri DataLayer haritasına aktararak, bu ekran görüntülemelerine yanıt olarak dönüşüm piksellerini ve izleme çağrılarını tetiklemek için Etiket Yöneticisi web arayüzünde etiketler oluşturabilirsiniz. Bu etiketleri uygulamanıza sabit kodlamanız gerekmez.

Etkinlikler, push: kullanılarak dataLayer'a aktarılır.

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

Web arayüzünde artık şu kuralı oluşturarak her ekran görüntüleme için tetiklenecek etiketler (ör. Google Analytics etiketleri) oluşturabilirsiniz: eşittir "openScreen". Ekran adını bu etiketlerden birine iletmek için veri katmanındaki "screenName" anahtarına referans veren bir veri katmanı makrosu oluşturun. Ayrıca, yalnızca belirli ekran görünümleri için etkinleşecek bir etiket (ör. Google Ads dönüşüm pikseli) de oluşturabilirsiniz. Bunun için "openScreen"e eşit && "ConfirmationScreen"e eşit kuralını oluşturmanız gerekir.

6. Kapsayıcıyı Önizleme ve Yayınlama

Makro değerleri her zaman yayınlanan mevcut sürüme karşılık gelir. Bir kapsayıcının en son sürümünü yayınlamadan önce taslak kapsayıcınızı önizleyebilirsiniz.

Bir kapsayıcıyı önizlemek için Google Etiket Yöneticisi web arayüzünde önizlemek istediğiniz kapsayıcı sürümünü ve ardından Preview simgesini seçerek bir önizleme URL'si oluşturun. Bu önizleme URL'sini kaydedin. Daha sonraki adımlarda bu URL'ye ihtiyacınız olacaktır.

Önizleme URL'leri, Etiket Yöneticisi web arayüzünün önizleme penceresinde kullanılabilir.
Şekil 1: Etiket Yöneticisi web arayüzünden önizleme URL'si alma.

Kapsayıcı önizlemelerini etkinleştirmek için uygulama temsilcisi uygulama dosyanıza kod eklemeniz ve projenizin özellik listesinde Google Etiket Yöneticisi önizleme URL'si şemasını tanımlamanız gerekir.

Öncelikle, aşağıdaki kalın yazılmış kod snippet'lerini uygulama temsilcisi dosyanıza ekleyin:

@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;
}

Ardından, uygulamanızın mülk listesi dosyasının URL türleri anahtarı altında aşağıdaki URL tanımlayıcısını ve URL şemasını kaydedin:

URL identifier: your.package_name
URL scheme: tagmanager.c.your.package.name
Etiket Yöneticisi önizleme URL şemasını uygulamanızın özellik listesi dosyasında kaydedin.
Şekil 3: Etiket Yöneticisi önizleme URL şemasını uygulamanızın özellik listesi dosyasına ekleme.

Taslak kapsayıcıyı uygulamanızda önizlemek için bağlantıyı bir emülatörde veya fiziksel cihazda açın.

Taslak yapılandırma değerlerinizi uygulamanızda kullanıma sunmaya hazır olduğunuzda kapsayıcıyı yayınlayın.

Gelişmiş Yapılandırma

Mobil için Google Etiket Yöneticisi'nde, kuralları kullanarak çalışma zamanı koşullarına göre değer seçmenize, kapsayıcıyı manuel olarak yenilemenize ve kapsayıcıları açmak için ek seçenekler elde etmenize olanak tanıyan bir dizi gelişmiş yapılandırma seçeneği bulunur. Aşağıdaki bölümlerde, en yaygın gelişmiş yapılandırmalardan bazıları özetlenmektedir.

Kapsayıcıları Açmak İçin Gelişmiş Seçenekler

Google Etiket Yöneticisi SDK'sı, kapsayıcıları açmak için çeşitli yöntemler sunar. Bu yöntemler, yükleme süreci üzerinde daha fazla kontrol sahibi olmanızı sağlayabilir:

openContainerById:callback:

openContainerById:callback:, kapsayıcı açmak için en düşük düzeyli ve en esnek API'dir. Varsayılan bir kapsayıcıyla hemen geri döner ve kaydedilmiş bir kapsayıcı yoksa veya kaydedilmiş kapsayıcı yeni değilse (12 saatten eski) kapsayıcıyı diskten ya da ağdan eşzamansız olarak da yükler.

@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

Yükleme işlemi boyunca openContainerById:callback:, kodunuzun yükleme isteğinin ne zaman başladığını, başarısız olup olmadığını ve neden başarısız olduğunu ya da başarılı olduğunu ve kapsayıcının en sonunda diskten mi yoksa ağdan mı yüklendiğini öğrenebilmesi için çeşitli yaşam döngüsü geri çağırmaları yayınlar.

Uygulamanızın varsayılan değerleri kullanması kabul edilebilir bir durum değilse kaydedilmiş veya ağ kapsayıcısının ne zaman yüklendiğini öğrenmek için bu geri çağırmaları kullanmanız gerekir. Uygulama ilk kez çalıştırılıyorsa ve ağ bağlantısı yoksa kaydedilmiş veya ağ kapsayıcısı yükleyemeyeceğinizi unutmayın.

openContainerById:callback:, aşağıdaki enumdeğerleri bu geri çağırmalara bağımsız değişken olarak iletir:

RefreshType

DeğerAçıklama
kTAGContainerCallbackRefreshTypeSaved Yenileme isteği, yerel olarak kaydedilmiş bir kapsayıcıyı yüklüyor.
kTAGContainerCallbackRefreshTypeNetwork Yenileme isteği, ağ üzerinden bir kapsayıcı yüklüyor.

RefreshFailure

DeğerAçıklama
kTAGContainerCallbackRefreshFailureNoSavedContainer Kayıtlı kapsayıcı yok.
kTAGContainerCallbackRefreshFailureIoError Bir G/Ç hatası nedeniyle kapsayıcı yenilenemedi.
kTAGContainerCallbackRefreshFailureNoNetwork Ağ bağlantısı yok.
kTAGContainerCallbackRefreshFailureNetworkError Bir ağ hatası oluştu.
kTAGContainerCallbackRefreshFailureServerError Sunucuda bir hata oluştu.
kTAGContainerCallbackRefreshFailureUnknownError Kategorize edilemeyen bir hata oluştu.

Varsayılan Olmayan ve Yeni Kapsayıcıları Açma Yöntemleri

TAGContainerOpener sarmalar openContainerById:callback: ve kapsayıcıları açmak için iki kolaylık yöntemi sunar: openContainerWithId:tagManager:openType:timeout:notifier: ve openContainerWithId:tagManager:openType:timeout:.

Bu yöntemlerin her biri, varsayılan olmayan veya yeni bir kapsayıcı isteyen bir numaralandırma alır.

kTAGOpenTypePreferNonDefault çoğu uygulama için önerilir ve belirli bir zaman aşımı süresi içinde, diskten veya ağdan kullanılabilir ilk varsayılan olmayan kapsayıcıyı döndürmeye çalışır. Bu kapsayıcı 12 saatten eski olsa bile bu işlem yapılır. Eski bir kaydedilmiş kapsayıcı döndürürse yeni bir kapsayıcı için eşzamansız bir ağ isteği de gönderir. kTAGOpenTypePreferNonDefault kullanılırken başka kapsayıcı yoksa veya zaman aşımı süresi aşılmışsa varsayılan bir kapsayıcı döndürülür.

kTAGOpenTypePreferFresh, verilen zaman aşımı süresi içinde diskten veya ağdan yeni bir kapsayıcı döndürmeye çalışır. Ağ bağlantısı yoksa ve/veya zaman aşımı süresi aşılmışsa kaydedilmiş bir kapsayıcı döndürür.

Daha uzun istek süresinin kullanıcı deneyimini belirgin şekilde etkileyebileceği yerlerde (ör. kullanıcı arayüzü işaretleri veya görüntüleme dizeleri) kTAGOpenTypePreferFresh kullanılması önerilmez. Ağ kapsayıcısı isteğini zorlamak için istediğiniz zaman TAGContainer::refresh öğesini de kullanabilirsiniz.

Bu kolaylık yöntemlerinin her ikisi de engellemeyen yöntemlerdir. openContainerWithId:tagManager:openType:timeout:, TAGContainerFuture nesnesini döndürür. Bu nesnenin get yöntemi, yüklendiği anda TAGContainer döndürür (ancak o zamana kadar engellenir). openContainerWithId:tagManager:openType:timeout:notifier: yöntemi, kapsayıcı kullanılabilir olduğunda çağrılan tek bir geri çağırma alır. Her iki yöntemin de varsayılan zaman aşımı süresi 2.0 saniyedir.

Kuralları kullanarak çalışma zamanında makroları değerlendirme

Kapsayıcılar, kuralları kullanarak değerleri çalışma zamanında değerlendirebilir. Kurallar, cihaz dili, platform veya başka bir makro değeri gibi ölçütlere göre belirlenebilir. Örneğin, kurallar, çalışma zamanında cihazın diline göre yerelleştirilmiş bir görüntüleme dizesi seçmek için kullanılabilir. Bu, aşağıdaki kural kullanılarak yapılandırılabilir:

Çalışma zamanında cihaz diline göre görüntüleme dizelerini seçmek için bir kural kullanılır: dil eşittir es. Bu kuralda önceden tanımlanmış dil makrosu ve iki karakterli ISO 639-1 dil kodu kullanılır.
Şekil 1: Yalnızca İspanyolca dilini kullanacak şekilde yapılandırılmış cihazlar için değer toplama makrosunu etkinleştiren bir kural ekleme.

Ardından, her dil için değer toplama makroları oluşturabilir ve bu kuralı her makroya ekleyerek uygun dil kodunu girebilirsiniz. Bu kapsayıcı yayınlandığında uygulamanız, çalışma zamanında kullanıcının cihazının diline bağlı olarak yerelleştirilmiş görüntüleme dizeleri gösterebilir.

Varsayılan kapsayıcınızın kurallara ihtiyacı varsa varsayılan kapsayıcı olarak ikili kapsayıcı dosyası kullanmanız gerektiğini unutmayın.

Kuralları yapılandırma hakkında daha fazla bilgi edinin (Yardım Merkezi).

İkili Varsayılan Kapsayıcı Dosyaları

Kural gerektiren varsayılan kapsayıcılar, varsayılan kapsayıcı olarak özellik listesi dosyası veya JSON dosyası yerine ikili kapsayıcı dosyası kullanmalıdır. İkili kapsayıcılar, Google Etiket Yöneticisi kurallarıyla çalışma zamanında makro değerlerinin belirlenmesini desteklerken özellik listesi veya JSON dosyaları bunu desteklemez.

İkili kapsayıcı dosyaları, Google Etiket Yöneticisi web arayüzünden indirilebilir ve aşağıdaki adlandırma kuralına uyularak ana uygulama paketinize eklenmelidir: GTM-XXXX. Burada dosya adı, kapsayıcı kimliğinizi temsil eder.

Özellik listesi dosyası ve/veya JSON dosyası ile ikili kapsayıcı dosyasının bulunduğu durumlarda SDK, varsayılan kapsayıcı olarak ikili kapsayıcı dosyasını kullanır.

İşlev çağrısı makrolarını kullanma

İşlev çağrısı makroları, uygulamanızda belirtilen bir işlevin dönüş değerine ayarlanmış makrolardır. İşlev Çağrısı Makroları, çalışma zamanı değerlerini Google Etiket Yöneticisi kurallarınıza dahil etmek için kullanılabilir. Örneğin, bir cihazın yapılandırılmış diline ve para birimine göre çalışma zamanında kullanıcıya hangi fiyatın gösterileceğini belirleyebilirsiniz.

Bir işlev çağrısı makrosunu yapılandırmak için:

  1. İşlev çağrısı makrosunu Google Etiket Yöneticisi web arayüzünde tanımlayın. Bağımsız değişkenler isteğe bağlı olarak anahtar/değer çiftleri şeklinde yapılandırılabilir.
  2. TAGFunctionCallMacroHandler protokolünü uygulayan bir işleyici tanımlayın:
    // 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: ve Google Etiket Yöneticisi arayüzünde belirtilen işlev adını kullanarak işleyiciyi kaydedin:
    //
    // 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

İşlev çağrısı etiketlerini kullanma

İşlev Çağrısı Etiketleri, bir etkinlik veri katmanına her gönderildiğinde ve etiket kuralları true olarak değerlendirildiğinde önceden kaydedilmiş işlevlerin yürütülmesini sağlar.

İşlev çağrısı etiketini yapılandırmak için:

  1. İşlev çağrısı etiketini Google Etiket Yöneticisi web arayüzünde tanımlayın. Bağımsız değişkenler isteğe bağlı olarak anahtar/değer çiftleri şeklinde yapılandırılabilir.
  2. TAGFunctionCallTagHandler protokolünü uygulayın:
    //
    // 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 Etiket Yöneticisi web arayüzünde yapılandırılan etiket adını kullanarak işlev çağrısı etiketi işleyicisini kaydedin:
    //
    // 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

Özel yenileme süresi ayarlama

Google Etiket Yöneticisi SDK'sı, mevcut kapsayıcının yaşı 12 saati aşarsa yeni bir kapsayıcıyı almaya çalışır. Özel bir kapsayıcı yenileme süresi ayarlamak için aşağıdaki örnekte gösterildiği gibi NSTimer kullanın:

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

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

Logger ile hata ayıklama

Google Etiket Yöneticisi SDK'sı, hataları ve uyarıları varsayılan olarak günlüklerde yazdırır. Daha ayrıntılı günlük kaydını etkinleştirmek hata ayıklama için yararlı olabilir ve kendi Logger öğenizi uygulayarak mümkündür. Örneğin:

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

Alternatif olarak, aşağıdaki örnekte gösterildiği gibi TagManager::logger::setLogLevel kullanarak mevcut Logger'ın LogLevel'ini ayarlayabilirsiniz:

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