Panduan Memulai untuk Objective-C

Panduan developer ini menjelaskan cara mengimplementasikan Google Tag Manager di aplikasi seluler.

Pengantar

Google Tag Manager memungkinkan developer mengubah nilai konfigurasi di aplikasi seluler mereka menggunakan antarmuka Google Tag Manager tanpa harus membuat ulang dan mengirim ulang biner aplikasi ke marketplace aplikasi.

Hal ini berguna untuk mengelola nilai konfigurasi atau flag apa pun di aplikasi Anda yang mungkin perlu diubah di masa mendatang, termasuk:

  • Berbagai setelan UI dan string tampilan
  • Ukuran, lokasi, atau jenis iklan yang ditayangkan di aplikasi Anda
  • Setelan game

Nilai konfigurasi juga dapat dievaluasi saat runtime menggunakan aturan, sehingga memungkinkan konfigurasi dinamis seperti:

  • Menggunakan ukuran layar untuk menentukan ukuran banner iklan
  • Menggunakan bahasa dan lokasi untuk mengonfigurasi elemen UI

Google Tag Manager juga memungkinkan implementasi dinamis tag pelacakan dan piksel di aplikasi. Developer dapat mendorong peristiwa penting ke lapisan data dan menentukan tag atau piksel pelacakan mana yang harus diaktifkan. Tag Manager mendukung tag berikut:

  • Google Mobile App Analytics
  • Tag Panggilan Fungsi Kustom

Sebelum Anda Mulai

Sebelum menggunakan panduan memulai ini, Anda memerlukan hal berikut:

Jika Anda baru menggunakan Google Tag Manager, sebaiknya pelajari lebih lanjut penampung, makro, dan aturan (Pusat Bantuan) sebelum melanjutkan panduan ini.

Memulai

Bagian ini akan memandu developer melalui alur kerja Tag Manager yang umum:

  1. Menambahkan Google Tag Manager SDK ke project Anda
  2. Menetapkan Nilai Penampung Default
  3. Membuka Penampung
  4. Mendapatkan Nilai Konfigurasi dari Penampung
  5. Mendorong Peristiwa ke DataLayer
  6. Melihat Pratinjau &Memublikasikan Penampung

1. Menambahkan Google Tag Manager SDK ke Project Anda

Sebelum menggunakan Google Tag Manager SDK, Anda harus menambahkan libGoogleAnalyticsServices.a dan file header Google Tag Manager (GTM) dari direktori Library paket SDK ke project Anda.

Selanjutnya, tambahkan hal berikut ke library tertaut target aplikasi Anda jika mereka belum ada:

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

Jika Anda ingin aplikasi Anda mengakses ID untuk pengiklan (IDFA) dan flag pelacakan yang disediakan oleh framework tersebut melalui makro Google Tag Manager SDK, Anda juga harus menautkan library tambahan ini:

  • libAdIdAccess.a
  • AdSupport.framework

2. Menambahkan File Penampung Default ke Project Anda

Google Tag Manager menggunakan penampung default saat aplikasi Anda dijalankan untuk pertama kalinya. Penampung default akan digunakan hingga aplikasi dapat mengambil penampung baru melalui jaringan.

Untuk mendownload dan menambahkan biner penampung default ke aplikasi Anda, ikuti langkah-langkah berikut:

  1. Login ke antarmuka web Google Tag Manager.
  2. Pilih Versi penampung yang ingin Anda download.
  3. Klik tombol Download untuk mengambil biner penampung.
  4. Tambahkan file biner ke direktori root project Anda dan ke folder "Supporting Files" di project Anda.

Nama file default harus berupa ID penampung (misalnya GTM-1234). Setelah mendownload file biner, pastikan untuk menghapus akhiran versi dari nama file untuk memastikan Anda mengikuti konvensi penamaan yang benar.

Meskipun sebaiknya gunakan file biner, jika penampung Anda tidak berisi aturan atau tag, Anda dapat memilih untuk menggunakan daftar properti atau file JSON. File harus berada di paket utama dan harus mengikuti konvensi penamaan ini: <Container_ID>.<plist|json>. Misalnya, jika ID penampung Anda adalah GTM-1234, Anda dapat menentukan nilai penampung default dalam file daftar properti bernama GTM-1234.plist.

3. Membuka Penampung

Sebelum mengambil nilai dari penampung, aplikasi Anda harus membuka penampung. Membuka penampung akan memuatnya dari disk (jika tersedia), atau akan memintanya dari jaringan (jika diperlukan).

Cara termudah untuk membuka penampung di iOS adalah dengan menggunakan openContainerWithId:tagManager:openType:timeout:notifier:, seperti dalam contoh berikut:

// 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. Mendapatkan Nilai Konfigurasi dari Penampung

Setelah penampung dibuka, nilai konfigurasi dapat diambil menggunakan metode <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"];

Permintaan yang dibuat dengan kunci yang tidak ada akan menampilkan nilai default yang sesuai dengan jenis yang diminta:

// 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. Mendorong Nilai ke DataLayer

DataLayer adalah peta yang memungkinkan informasi runtime tentang aplikasi Anda, seperti peristiwa sentuh atau tampilan layar, tersedia untuk makro dan tag Tag Manager dalam penampung.

Misalnya, dengan mendorong informasi tentang tampilan layar ke peta DataLayer, Anda dapat menyiapkan tag di antarmuka web Tag Manager untuk mengaktifkan piksel konversi dan panggilan pelacakan sebagai respons terhadap tampilan layar tersebut tanpa perlu melakukan hard code ke dalam aplikasi Anda.

Peristiwa didorong ke DataLayer menggunakan 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

Di antarmuka web, Anda kini dapat membuat tag (seperti tag Google Analytics) untuk diaktifkan bagi setiap tampilan layar dengan membuat aturan ini: sama dengan "openScreen". Untuk meneruskan nama layar ke salah satu tag ini, buat makro lapisan data yang mereferensikan kunci "screenName" di lapisan data. Anda juga dapat membuat tag (seperti piksel konversi Google Ads) untuk diaktifkan hanya untuk tampilan layar tertentu, dengan membuat aturan yang sama dengan "openScreen" && sama dengan "ConfirmationScreen".

6. Melihat Pratinjau &Memublikasikan Penampung

Nilai makro akan selalu sesuai dengan versi yang dipublikasikan saat ini. Sebelum memublikasikan versi penampung terbaru, Anda dapat melihat pratinjau penampung draf.

Untuk melihat pratinjau penampung, buat URL pratinjau di antarmuka web Google Tag Manager dengan memilih versi penampung yang ingin Anda lihat pratinjaunya, lalu memilih Preview. Simpan URL pratinjau ini karena Anda akan membutuhkannya di langkah-langkah berikutnya.

URL pratinjau tersedia di jendela pratinjau antarmuka web Tag Manager
Gambar 1: Mendapatkan URL pratinjau dari antarmuka web Tag Manager.

Untuk mengaktifkan pratinjau penampung, Anda harus menambahkan kode ke file implementasi delegasi aplikasi dan menentukan skema URL pratinjau Google Tag Manager dalam daftar properti project Anda.

Pertama, tambahkan cuplikan kode yang dicetak tebal berikut ke file delegasi aplikasi Anda:

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

Selanjutnya, daftarkan ID URL dan skema URL berikut di bagian kunci jenis URL file daftar properti aplikasi Anda:

URL identifier: your.package_name
URL scheme: tagmanager.c.your.package.name
Daftarkan skema URL pratinjau Tag Manager dalam file daftar properti aplikasi Anda.
Gambar 3: Menambahkan skema URL pratinjau Tag Manager ke file daftar properti aplikasi Anda.

Buka link di emulator atau perangkat fisik untuk melihat pratinjau penampung draf di aplikasi Anda.

Jika Anda sudah siap untuk menyediakan nilai konfigurasi draf bagi aplikasi Anda, publikasikan penampung.

Konfigurasi Lanjutan

Google Tag Manager for Mobile memiliki sejumlah opsi konfigurasi lanjutan yang memungkinkan Anda memilih nilai berdasarkan kondisi runtime menggunakan aturan, me-refresh penampung secara manual, dan mendapatkan opsi tambahan untuk membuka penampung. Bagian berikut menguraikan beberapa konfigurasi lanjutan yang paling umum.

Opsi Lanjutan untuk Membuka Penampung

Google Tag Manager SDK menyediakan beberapa metode untuk membuka penampung yang dapat memberi Anda kontrol lebih besar atas proses pemuatan:

openContainerById:callback:

openContainerById:callback: adalah API tingkat terendah dan paling fleksibel untuk membuka penampung. API ini akan langsung menampilkan penampung default dan juga memuat penampung secara asinkron dari disk atau jaringan jika tidak ada penampung tersimpan, atau jika penampung tersimpan tidak baru (> 12 jam).

@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

Selama proses pemuatan, openContainerById:callback: akan mengeluarkan beberapa callback siklus proses sehingga kode Anda dapat mengetahui kapan permintaan pemuatan dimulai, apakah dan mengapa permintaan tersebut gagal atau berhasil, serta apakah penampung pada akhirnya dimuat dari disk atau jaringan.

Kecuali jika aplikasi Anda dapat menggunakan nilai default, Anda harus menggunakan callback ini untuk mengetahui kapan penampung tersimpan atau jaringan dimuat. Perhatikan bahwa Anda tidak akan dapat memuat penampung tersimpan atau jaringan jika ini adalah pertama kalinya aplikasi dijalankan dan tidak ada koneksi jaringan.

openContainerById:callback: meneruskan nilai enum berikut sebagai argumen ke callback ini:

RefreshType

NilaiDeskripsi
kTAGContainerCallbackRefreshTypeSaved Permintaan refresh memuat penampung yang disimpan secara lokal.
kTAGContainerCallbackRefreshTypeNetwork Permintaan refresh memuat penampung melalui jaringan.

RefreshFailure

NilaiDeskripsi
kTAGContainerCallbackRefreshFailureNoSavedContainer Tidak ada penampung tersimpan yang tersedia.
kTAGContainerCallbackRefreshFailureIoError Error I/O mencegah refresh penampung.
kTAGContainerCallbackRefreshFailureNoNetwork Tidak ada koneksi jaringan yang tersedia.
kTAGContainerCallbackRefreshFailureNetworkError Terjadi error jaringan.
kTAGContainerCallbackRefreshFailureServerError Terjadi error di server.
kTAGContainerCallbackRefreshFailureUnknownError Terjadi error yang tidak dapat dikategorikan.

Metode untuk Membuka Penampung Non-Default dan Baru

TAGContainerOpener menggabungkan openContainerById:callback: dan menyediakan dua metode praktis untuk membuka penampung: openContainerWithId:tagManager:openType:timeout:notifier: dan openContainerWithId:tagManager:openType:timeout:.

Setiap metode ini menggunakan enumerasi yang meminta penampung non-default atau baru.

kTAGOpenTypePreferNonDefault direkomendasikan untuk sebagian besar aplikasi dan mencoba menampilkan penampung non-default pertama yang tersedia dalam periode waktu tunggu tertentu, baik dari disk maupun jaringan, meskipun penampung tersebut berusia lebih dari 12 jam. Jika menampilkan penampung tersimpan yang sudah tidak berlaku, penampung tersebut juga akan membuat permintaan jaringan asinkron untuk penampung baru. Saat menggunakan kTAGOpenTypePreferNonDefault, penampung default akan ditampilkan jika tidak ada penampung lain yang tersedia, atau jika periode waktu tunggu terlampaui.

kTAGOpenTypePreferFresh mencoba menampilkan penampung baru dari disk atau jaringan dalam periode waktu tunggu yang diberikan. Penampung ini akan menampilkan penampung tersimpan jika koneksi jaringan tidak tersedia dan/atau periode waktu tunggu terlampaui.

Sebaiknya jangan gunakan kTAGOpenTypePreferFresh di tempat yang waktu permintaan lebih lama dapat memengaruhi pengalaman pengguna secara signifikan, seperti dengan flag UI atau string tampilan. Anda juga dapat menggunakan TAGContainer::refresh kapan saja untuk memaksa permintaan penampung jaringan.

Kedua metode praktis ini tidak memblokir. openContainerWithId:tagManager:openType:timeout: menampilkan objek TAGContainerFuture, yang metode get menampilkan TAGContainer segera setelah dimuat (tetapi akan diblokir hingga saat itu). Metode openContainerWithId:tagManager:openType:timeout:notifier: menggunakan satu callback, yang dipanggil saat penampung tersedia. Kedua metode memiliki periode waktu tunggu default selama 2.0 detik.

Mengevaluasi Makro saat Runtime menggunakan Aturan

Penampung dapat mengevaluasi nilai saat runtime menggunakan aturan. Aturan dapat didasarkan pada kriteria seperti bahasa perangkat, platform, atau nilai makro lainnya. Misalnya, aturan dapat digunakan untuk memilih string tampilan yang dilokalkan berdasarkan bahasa perangkat saat runtime. Hal ini dapat dikonfigurasi menggunakan aturan berikut:

Aturan digunakan untuk memilih string tampilan berdasarkan bahasa perangkat saat
            runtime: language equals es. Aturan ini menggunakan makro bahasa yang telah ditentukan sebelumnya dan kode bahasa ISO 639-1 dua karakter.
Gambar 1:Menambahkan aturan untuk mengaktifkan makro pengumpulan nilai hanya untuk perangkat yang dikonfigurasi untuk menggunakan bahasa Spanyol.

Kemudian, Anda dapat membuat makro pengumpulan nilai untuk setiap bahasa, dan menambahkan aturan ini ke setiap makro, dengan menyisipkan kode bahasa yang sesuai. Saat penampung ini dipublikasikan, aplikasi Anda akan dapat menampilkan string tampilan yang dilokalkan, bergantung pada bahasa perangkat pengguna saat runtime.

Perhatikan bahwa jika penampung default Anda memerlukan aturan, Anda harus menggunakan file penampung biner sebagai penampung default.

Pelajari lebih lanjut cara mengonfigurasi aturan (Pusat Bantuan).

File Penampung Default Biner

Penampung default yang memerlukan aturan harus menggunakan file penampung biner bukan file daftar properti atau JSON file sebagai penampung default. Penampung biner menawarkan dukungan untuk menentukan nilai makro saat runtime dengan aturan Google Tag Manager, sedangkan file daftar properti atau JSON tidak.

File penampung biner dapat didownload dari antarmuka web Google Tag Manager dan harus ditambahkan ke paket aplikasi utama Anda dengan mengikuti konvensi penamaan ini: GTM-XXXX, dengan nama file yang mewakili ID penampung Anda.

Jika file daftar properti dan/atau file JSON serta file penampung biner ada, SDK akan menggunakan file penampung biner sebagai penampung default.

Menggunakan Makro Panggilan Fungsi

Makro Panggilan Fungsi adalah makro yang ditetapkan ke nilai yang ditampilkan dari fungsi tertentu di aplikasi Anda. Makro Panggilan Fungsi dapat digunakan untuk menggabungkan nilai runtime dengan aturan Google Tag Manager Anda, seperti menentukan saat runtime harga mana yang akan ditampilkan kepada pengguna berdasarkan bahasa dan mata uang perangkat yang dikonfigurasi.

Untuk mengonfigurasi makro panggilan fungsi:

  1. Tentukan makro panggilan fungsi di antarmuka web Google Tag Manager. Argumen dapat dikonfigurasi secara opsional sebagai pasangan kunci-nilai.
  2. Tentukan pengendali yang mengimplementasikan TAGFunctionCallMacroHandler protokol:
    // 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. Daftarkan pengendali menggunakan TAGContainer::registerFunctionCallMacroHandler:forMacro: dan nama fungsi ditentukan di antarmuka 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

Menggunakan Tag Panggilan Fungsi

Tag Panggilan Fungsi memungkinkan fungsi yang telah didaftarkan sebelumnya dijalankan setiap kali peristiwa didorong ke lapisan data dan aturan tag dievaluasi ke true.

Untuk mengonfigurasi tag panggilan fungsi:

  1. Tentukan tag panggilan fungsi di antarmuka web Google Tag Manager. Argumen dapat dikonfigurasi secara opsional sebagai pasangan kunci-nilai.
  2. Implementasikan protokol 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. Daftarkan pengendali tag panggilan fungsi menggunakan nama tag yang dikonfigurasi di Google Tag Manager web interface:
    //
    // 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

Menetapkan Periode Refresh Kustom

Google Tag Manager SDK akan mencoba mengambil penampung baru jika usia penampung saat ini melebihi 12 jam. Untuk menetapkan periode refresh penampung kustom, gunakan NSTimer, seperti dalam contoh berikut:

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

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

Melakukan Debug dengan Logger

Google Tag Manager SDK mencetak error dan peringatan ke log secara default. Mengaktifkan logging yang lebih panjang dapat membantu proses debug dan dapat dilakukan dengan mengimplementasikan Logger Anda sendiri, seperti dalam contoh ini:

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

Atau, Anda dapat menetapkan LogLevel Logger yang ada menggunakan TagManager::logger::setLogLevel, seperti dalam contoh ini:

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