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

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

Giriş

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

Bu özellik, uygulamanızda gelecekte değiştirmeniz gerekebilecek yapılandırma değerlerini veya işaretlerini yönetmek için faydalıdır. Örneğin:

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

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

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

Google TagManager, uygulamalarda izleme etiketlerinin ve piksellerin dinamik olarak uygulanmasını da sağlar. Geliştiriciler önemli etkinlikleri bir veri katmanına aktarabilir ve daha sonra hangi izleme etiketlerinin veya piksellerinin tetikleneceğine karar verebilirler. TagManager şu anda aşağıdaki etiketleri desteklemektedir:

  • Google Mobil Uygulama Analizi
  • Özel İş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 kullanmaya yeni başladıysanız bu kılavuza devam etmeden önce kapsayıcılar, makrolar ve kurallar hakkında daha fazla bilgi edinmenizi öneririz (Yardım Merkezi).

Başlayın

Bu bölüm, geliştiricilere tipik bir Etiket Yöneticisi iş akışı boyunca rehberlik edecektir:

  1. Google Etiket Yöneticisi SDK'sını projenize ekleme
  2. Varsayılan Kapsayıcı Değerlerini Ayarlama
  3. Kapsayıcıyı açın
  4. Kapsayıcıdan Yapılandırma Değerlerini Alma
  5. Etkinlikleri Datalayer'a aktarma
  6. Kapsayıcıyı Önizleyin ve Yayınlayın

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

Google Etiket Yöneticisi SDK'sını kullanmadan önce, SDK paketinin Library dizininden libGoogleAnalyticsServices.a ve Google Etiket Yöneticisi (GTM) başlık dosyalarını projenize eklemeniz gerekir.

Daha sonra, hâlihazırda mevcut değilse uygulama hedefinizin bağlı kitaplıklarına aşağıdakileri ekleyin:

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

Uygulamanızın, Google Etiket Yöneticisi SDK'sı makroları aracılığıyla bu çerçeve tarafından sağlanan reklamveren tanımlayıcısı (IDFA) ve izleme işaretine erişmesini isterseniz ş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 ilk kez çalıştırıldığında varsayılan bir kapsayıcı kullanır. Uygulama, ağ üzerinden yeni bir kapsayıcı alana kadar varsayılan kapsayıcı kullanılır.

Varsayılan kapsayıcı ikili programını indirmek ve uygulamanıza 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ı ikili programını almak için İndir düğmesini tıklayın.
  4. İkili dosyayı projenizin kök dizinine ve projenizdeki "Destekleyen Dosyalar" klasörüne ekleyin.

Varsayılan dosya adı, kapsayıcı kimliği olmalıdır (örneğin, GTM-1234). İkili dosyayı indirdikten sonra doğru adlandırma kuralını izlemek için dosya adından sürüm son ekini kaldırdığınızdan emin olun.

İkili dosyanın kullanılması önerilir ancak kapsayıcınız kural veya etiket içermiyorsa basit bir mülk listesi veya JSON dosyası kullanmayı tercih edebilirsiniz. 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 mülk listesi dosyasında belirtebilirsiniz.

3. Kapsayıcı Açma

Bir container'dan değer almadan önce uygulamanızın container'ı açması gerekir. Bir container açıldığında, container diskten yüklenir (varsa) veya (gerekirse) ağdan istenir.

iOS'te kapsayıcı açmanın en kolay yolu, aşağıdaki örnekte olduğu 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

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

Var 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 Veri Katmanı'na Aktarma

DataKatmanlar, bir kapsayıcıdaki Etiket Yöneticisi makroları ve etiketleri tarafından kullanılabilir hale getirmek üzere uygulamanızla ilgili çalışma zamanı bilgilerinin (ör. dokunma etkinlikleri veya ekran görüntülenmeleri) kullanılmasını sağlayan bir haritadır.

Örneğin, ekran görüntülenmeleriyle ilgili bilgileri DataKatmanlar haritasına aktararak, Etiket Yöneticisi web arayüzünde dönüşüm piksellerini tetikleyecek ve bu ekran görüntülemelere yanıt olarak gelen çağrıları uygulamanıza sabit kodlamaya gerek kalmadan izlemelerini sağlayacak etiketler oluşturabilirsiniz.

Etkinlikler, push: kullanılarak DataKatman'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 her ekran görüntülemede tetiklenecek etiketler (ör. Google Analytics etiketleri) oluşturmak için şu kuralı oluşturabilirsiniz: şuna eşittir: "openScreen". Ekran adını bu etiketlerden birine iletmek için, veri katmanında "screenName" anahtarına başvuruda bulunan bir veri katmanı makrosu oluşturun. Ayrıca, şuna eşittir: "openScreen" && şuna eşittir: "ConfirmationScreen"'a eşit olan bir kural oluşturarak yalnızca belirli ekran görüntülemelerinde tetiklenecek bir etiket (Google Ads dönüşüm pikseli gibi) oluşturabilirsiniz.

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

Makro değerleri her zaman yayınlanan geçerli 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, önizlemek istediğiniz kapsayıcı sürümünü ve ardından Preview öğesini seçerek Google Etiket Yöneticisi web arayüzünde bir önizleme URL'si oluşturun. Daha sonraki adımlarda ihtiyaç duyacağınızdan bu önizleme URL'sini kullanmaya devam edebilirsiniz.

Önizleme URL&#39;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 uygulamanızın temsilci uygulama dosyasına kod eklemeniz ve projenizin mülk listesinde Google Etiket Yöneticisi önizleme URL'si şemasını tanımlamanız gerekir.

Öncelikle, aşağıdaki kalın harflerle yazılmış kod snippet'lerini uygulama yetki 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 özellik 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&#39;si şemasını uygulamanızın özellik listesi dosyasına kaydedin.
Şekil 3: Uygulamanızın mülk listesi dosyasına Etiket Yöneticisi önizleme URL'si şemasını 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ızın kullanımına sunmaya hazır olduğunuzda kapsayıcıyı yayınlayın.

Gelişmiş Yapılandırma

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

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

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

OpenContainerById:callback:

openContainerById:callback:, container açmak için en düşük düzey ve en esnek API'dir. Varsayılan container ile hemen döndürülür ve kayıtlı kapsayıcı yoksa ya da kayıtlı kapsayıcı yeni değilse (> 12 saatten eskiyse) diskten veya ağdan eşzamansız olarak bir container 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 sırasında openContainerById:callback:, yükleme isteğinin ne zaman başladığını, işlemin başarısız olup olmadığını, neden başarılı veya başarısız olduğunu ve neden başarılı olup olmadığını ve container'ın diskten veya ağdan yüklenip yüklenmediğini öğrenebilmesi için yükleme işlemi boyunca birkaç yaşam döngüsü geri çağırması yayınlar.

Uygulamanızın varsayılan değerleri kullanması kabul edilebilir olmadığı sürece kayıtlı bir kapsayıcının 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 kayıtlı bir kapsayıcıyı veya ağ kapsayıcısını yükleyemeyeceğinizi unutmayın.

openContainerById:callback:, aşağıdaki enum değerlerini bu geri çağırmalara bağımsız değişken olarak aktarır:

RefreshType

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

RefreshFailure

DeğerAçıklama
kTAGContainerCallbackRefreshFailureNoSavedContainer Kullanılabilir kayıtlı kapsayıcı yok.
kTAGContainerCallbackRefreshFailureIoError Bir G/Ç hatası, kapsayıcının yenilenmesini engelledi.
kTAGContainerCallbackRefreshFailureNoNetwork Kullanılabilir 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, openContainerById:callback: öğesini sarmalar ve kapsayıcıları açmak için iki kolay yöntem 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.

Çoğu uygulama için kTAGOpenTypePreferNonDefault önerilir ve bu kapsayıcı 12 saatten eski olsa bile belirli bir zaman aşımı süresi içinde (disk veya ağdan) ilk kullanılabilir olmayan ilk kapsayıcıyı döndürmeye çalışır. Eski ve kaydedilmiş bir kapsayıcı döndürürse yeni bir tane için de eşzamansız ağ isteğinde bulunur. kTAGOpenTypePreferNonDefault kullanılırken başka bir kapsayıcı yoksa veya zaman aşımı süresi aşılırsa varsayılan bir kapsayıcı döndürülür.

kTAGOpenTypePreferFresh, belirtilen zaman aşımı süresi içinde diskten veya ağdan yeni bir container döndürmeye çalışır. Bir ağ bağlantısı yoksa ve/veya zaman aşımı süresi aşılırsa kayıtlı bir kapsayıcıyı döndürür.

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 özelliğinin kullanılması önerilmez. Ayrıca, istediğiniz zaman bir ağ kapsayıcısı isteğini zorlamak için TAGContainer::refresh kullanabilirsiniz.

Bu kolay kullanım yöntemlerinin her ikisi de engel teşkil etmez. openContainerWithId:tagManager:openType:timeout:, TAGContainerFuture nesnesi döndürür. Bu nesnenin get yöntemi, yüklenir yüklenmez bir TAGContainer döndürür (ancak bu işlem tamamlanana kadar engellenir). openContainerWithId:tagManager:openType:timeout:notifier: yöntemi, container kullanılabilir olduğunda tek bir geri çağırma işlemi gerçekleştirir. Her iki yöntemde de varsayılan zaman aşımı süresi 2.0 saniyedir.

Kuralları Kullanarak Makroları Çalışma Zamanında Değerlendirme

Kapsayıcılar, çalışma zamanında değerleri kuralları kullanarak değerlendirebilir. Kurallar cihaz dili, platform veya diğer makro değerleri gibi kriterlere dayanabilir. Örneğin, çalışma zamanında cihazın diline bağlı olarak yerelleştirilmiş bir görüntüleme dizesi seçmek için kurallar kullanılabilir. Bu ayar, 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 es&#39;e eşittir. Bu kural, önceden tanımlanmış dil makrosu ve iki karakterli ISO 639-1 dil kodu kullanır.
Şekil 1: Yalnızca İspanyolca dilini kullanacak şekilde yapılandırılmış cihazlarda değer toplama makrosu etkinleştirmek için bir kural ekleme.

Daha sonra, her bir dil için değer toplama makroları oluşturabilir ve uygun dil kodunu ekleyerek bu kuralı her bir makroya ekleyebilirsiniz. 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 dizelerini gösterebilir.

Varsayılan kapsayıcınız için kurallar gerekiyorsa varsayılan kapsayıcınız olarak ikili kapsayıcı dosyası kullanmanız gerektiğini unutmayın.

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

Varsayılan İkili Kapsayıcı Dosyaları

Kural gerektiren varsayılan kapsayıcılar, varsayılan kapsayıcı olarak mülk listesi dosyası veya JSON dosyası yerine bir ikili program kapsayıcı dosyası kullanmalıdır. İkili kapsayıcılar, Google Etiket Yöneticisi kurallarıyla çalışma zamanında makro değerlerini belirleme desteği sunar. Mülk listesi veya JSON dosyaları bu destek sağlamaz.

İkili program kapsayıcı dosyaları Google Etiket Yöneticisi web arayüzünden indirilebilir ve şu adlandırma kuralına göre ana uygulama paketinize eklenmelidir: GTM-XXXX. Dosya adı, kapsayıcı kimliğinizi temsil eder.

Mülk listesi dosyasının ve/veya JSON dosyasının yanı sıra bir ikili program kapsayıcı dosyasının da 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öndürdüğü değere ayarlanan makrolardır. İşlev Çağrısı Makroları, çalışma zamanı değerlerini Google Etiket Yöneticisi kurallarınızla birleştirmek için kullanılabilir. Örneğin, bir cihazın yapılandırılan diline ve para birimine göre kullanıcıya çalışma zamanında hangi fiyatın gösterileceğini belirlemek için kullanılabilir.

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

  1. Google Etiket Yöneticisi web arayüzünde işlev çağrısı makrosunu tanımlayın. Bağımsız değişkenler, isteğe bağlı olarak anahtar/değer çiftleri olarak 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. İşleyiciyi TAGContainer::registerFunctionCallMakroHandler:forMakro: ve Google Etiket Yöneticisi arayüzünde belirtilen işlev adını kullanarak kaydedin:
  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
    

İşlev Çağrısı Etiketlerini Kullanma

İşlev Çağrı Etiketleri, veri katmanına bir etkinlik aktarıldığında 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. Google Etiket Yöneticisi web arayüzünde işlev çağrısı etiketini tanımlayın. Bağımsız değişkenler, isteğe bağlı olarak anahtar/değer çiftleri olarak 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şleyiciyi kaydedin:
  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
    

Özel Yenileme Dönemi Ayarlama

Mevcut kapsayıcı yaşı 12 saati aşarsa Google Etiket Yöneticisi SDK'sı yeni bir kapsayıcı almaya çalışır. Özel bir kapsayıcı yenileme süresi ayarlamak için aşağıdaki örnekte olduğu 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];

Günlükçü ile hata ayıklama

Google Etiket Yöneticisi SDK'sı varsayılan olarak hataları ve uyarıları günlüklere yazdırır. Daha ayrıntılı günlük kaydının etkinleştirilmesi, hata ayıklama açısından faydalı olabilir ve aşağıdaki örnekte olduğu gibi kendi Logger yönteminizi uygulayarak bunu yapabilirsiniz:

// 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 olduğu gibi, TagManager::logger::setLogLevel kullanarak mevcut Logger'ın LogLevel değerini de ayarlayabilirsiniz:

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