Panduan developer ini menjelaskan cara menerapkan Google Tag Manager di aplikasi seluler.
Pengantar
Google Tag Manager memungkinkan developer mengubah konfigurasi di aplikasi seluler mereka menggunakan Google Tag Manager tanpa harus membangun ulang dan mengirim ulang biner aplikasi ke aplikasi marketplace.
Hal ini berguna untuk mengelola nilai konfigurasi apa pun atau penanda dalam aplikasi Anda yang mungkin perlu Anda ubah di masa mendatang, termasuk:
- Berbagai setelan UI dan string tampilan
- Ukuran, lokasi, atau jenis iklan yang ditayangkan dalam aplikasi Anda
- Setelan game
Nilai konfigurasi juga dapat dievaluasi saat runtime menggunakan aturan, mengaktifkan konfigurasi dinamis seperti:
- Menggunakan ukuran layar untuk menentukan ukuran banner iklan
- Menggunakan bahasa dan lokasi untuk mengonfigurasi elemen UI
Google TagManager juga mengaktifkan penerapan tag pelacakan secara dinamis dan piksel dalam aplikasi. Developer dapat mendorong peristiwa penting ke dalam data dan kemudian memutuskan tag atau piksel pelacakan mana yang harus diaktifkan. TagManager saat ini mendukung tag berikut:
- Google Analisis Aplikasi Seluler
- Tag Panggilan Fungsi Khusus
Sebelum Anda Mulai
Sebelum menggunakan panduan memulai ini, Anda akan memerlukan hal berikut:
- Akun Google Tag Manager
- Tag Manager baru makro penampung dan pengumpulan nilai
- Aplikasi seluler untuk iOS tempat menerapkan Google Tag Manager
- Layanan Google Analytics SDK, yang berisi library Tag Manager.
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 standar:
- Menambahkan Google Tag Manager SDK ke project
- Menetapkan Nilai Penampung Default
- Membuka Container
- Mendapatkan Nilai Konfigurasi dari Penampung
- Mengirim Peristiwa ke DataLayer
- Pratinjau & Memublikasikan Penampung
1. Menambahkan SDK Google Tag Manager ke Project Anda
Sebelum menggunakan SDK Google Tag Manager, Anda harus menambahkan
libGoogleAnalyticsServices.a
dan file header Google Tag Manager (GTM) dari Library
paket SDK ke project Anda.
Berikutnya, tambahkan kode berikut ke pustaka tertaut target aplikasi jika belum ada:
CoreData.framework
SystemConfiguration.framework
libz.dylib
libsqlite3.dylib
libGoogleAnalyticsServices.a
Jika Anda ingin aplikasi Anda mengakses ID untuk pengiklan (IDFA) dan pelacakan yang disediakan oleh framework tersebut melalui Makro SDK Google Tag Manager, 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 pertama kali aplikasi Anda dijalankan. Default akan digunakan hingga aplikasi dapat mengambil penampung baru melalui jaringan.
Untuk mendownload dan menambahkan biner container default ke aplikasi Anda, ikuti langkah-langkah berikut:
- Login ke antarmuka web Google Tag Manager.
- Pilih Versi penampung yang ingin Anda download.
- Klik tombol Download untuk mengambil biner penampung.
- Tambahkan file biner ke direktori utama proyek Anda dan ke "File Pendukung" dalam project Anda.
Nama file default harus berupa ID penampung (misalnya, GTM-1234
). Setelah Anda
mengunduh 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 JSON
file tersebut.
File tersebut 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 Container
Sebelum mengambil nilai dari container, aplikasi Anda harus dibuka container-nya. Membuka container 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 terbuka, nilai konfigurasi dapat diambil menggunakan
tindakan
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 ke 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 sentuhan peristiwa atau tampilan layar, agar tersedia untuk makro dan tag Tag Manager di container.
Misalnya, dengan mendorong informasi tentang tampilan layar ke dalam peta DataLayer, Anda dapat menyiapkan tag di antarmuka web Tag Manager untuk mengaktifkan piksel konversi dan melacak panggilan sebagai respons terhadap tampilan layar tersebut tanpa perlu kode ke dalam aplikasi Anda.
Peristiwa dikirim 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) diaktifkan untuk setiap tampilan layar dengan membuat aturan ini: sama dengan "openScreen". Untuk meneruskan nama layar ke salah satu tag ini, buat makro lapisan data yang merujuk ke "screenName" di lapisan data. Anda juga dapat membuat tag (seperti piksel konversi Google Ads) agar hanya diaktifkan untuk tampilan layar tertentu, dengan membuat aturan di mana sama dengan "openScreen" && sama dengan "ConfirmationScreen".
6. Melihat pratinjau & Memublikasikan Penampung
Nilai makro akan selalu sesuai dengan versi yang dipublikasikan saat ini. Sebelum memublikasikan penampung versi terbaru, Anda dapat melihat pratinjau penampung draf Anda.
Untuk melihat pratinjau penampung, buat URL pratinjau di Google
Antarmuka web Tag Manager dengan memilih versi penampung
yang ingin Anda lihat pratinjaunya, lalu pilih Preview
. Tunggu sebentar
URL pratinjau ini karena Anda akan memerlukannya di langkah berikutnya.
Untuk mengaktifkan pratinjau penampung, Anda harus menambahkan kode ke aplikasi delegasikan file penerapan dan tentukan URL pratinjau Google Tag Manager skema kustom 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 bawah Kunci jenis URL file daftar properti aplikasi Anda:
URL identifier: your.package_name URL scheme: tagmanager.c.your.package.name
Buka link di emulator atau perangkat fisik untuk lihat pratinjau penampung draf di aplikasi Anda.
Jika Anda sudah siap untuk menyediakan draf nilai konfigurasi bagi aplikasi, memublikasikan penampung.
Konfigurasi Lanjutan
Google Tag Manager untuk Seluler memiliki sejumlah konfigurasi lanjutan opsi yang memungkinkan Anda memilih nilai berdasarkan kondisi runtime menggunakan aturan, memuat ulang penampung secara manual, dan mendapatkan opsi tambahan untuk membuka container. Bagian berikut menguraikan beberapa {i>template <i}yang paling umum konfigurasi standar.
Opsi Lanjutan untuk Membuka Container
SDK Google Tag Manager menyediakan beberapa metode untuk membuka container yang dapat memberi Anda lebih banyak kontrol atas proses pemuatan:
openContainerById:callback:
openContainerById:callback:
adalah API level terendah dan paling fleksibel untuk membuka
container. Metode ini segera ditampilkan dengan
kontainer default dan
memuat kontainer secara asinkron dari {i>disk <i}atau jaringan
ada, atau jika penampung tersimpan tidak baru (> 12 jam lamanya).
@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:
masalah
beberapa callback siklus proses sehingga kode Anda bisa mengetahui kapan
dimulainya permintaan pemuatan, apakah dan mengapa permintaan itu gagal atau berhasil, dan apakah
kontainer pada akhirnya dimuat
dari {i>disk<i} atau jaringan.
Kecuali aplikasi Anda dapat menggunakan nilai {i>default<i}, Anda perlu menggunakan callback ini untuk mengetahui kapan penampung telah dimuat. Perhatikan bahwa Anda tidak akan dapat memuat file yang disimpan atau kontainer jaringan jika ini adalah pertama kalinya aplikasi berjalan dan tidak ada koneksi jaringan.
openContainerById:callback:
meneruskan enum
berikut
sebagai argumen ke callback ini:
RefreshType
Nilai | Deskripsi |
---|---|
kTAGContainerCallbackRefreshTypeSaved
|
Permintaan pembaruan sedang memuat penampung yang disimpan secara lokal. |
kTAGContainerCallbackRefreshTypeNetwork
|
Permintaan pembaruan sedang memuat penampung melalui jaringan. |
RefreshFailure
Nilai | Deskripsi |
---|---|
kTAGContainerCallbackRefreshFailureNoSavedContainer
|
Tidak ada penampung tersimpan yang tersedia. |
kTAGContainerCallbackRefreshFailureIoError
|
Error I/O mencegah pemuatan ulang container. |
kTAGContainerCallbackRefreshFailureNoNetwork
| Tidak ada koneksi jaringan yang tersedia. |
kTAGContainerCallbackRefreshFailureNetworkError
|
Terjadi error pada jaringan. |
kTAGContainerCallbackRefreshFailureServerError
|
Terjadi error pada server. |
kTAGContainerCallbackRefreshFailureUnknownError
|
Telah terjadi kesalahan yang tidak dapat dikategorikan. |
Metode untuk Membuka Container Non-Default dan Baru
TAGContainerOpener
menggabungkan openContainerById:callback:
serta menyediakan dua metode praktis untuk membuka container:
openContainerWithId:tagManager:openType:timeout:notifier:
dan
openContainerWithId:tagManager:openType:timeout:
.
Setiap metode ini mengambil enumerasi yang meminta {i>non-default<i} atau penampung baru.
kTAGOpenTypePreferNonDefault
direkomendasikan untuk sebagian besar aplikasi dan
berupaya mengembalikan penampung non-default pertama yang tersedia dalam
periode waktu tunggu, baik dari disk atau jaringan, meskipun kontainer itu lebih besar
dari 12 jam lalu. Jika mengembalikan penampung tersimpan yang usang, hal itu juga akan membuat
permintaan jaringan asinkron untuk jaringan yang baru.
Saat menggunakan kTAGOpenTypePreferNonDefault
, default
akan dikembalikan jika tidak ada penampung lain yang tersedia, atau jika periode waktu tunggu habis
terlampaui.
kTAGOpenTypePreferFresh
mencoba menampilkan penampung baru dari
{i>disk<i} atau jaringan dalam periode
waktu tunggu yang ditentukan.
Metode ini menampilkan penampung tersimpan jika
koneksi tidak tersedia dan/atau periode waktu tunggu terlampaui.
Tidak direkomendasikan menggunakan kTAGOpenTypePreferFresh
di tempat-tempat di mana waktu permintaan yang lebih lama dapat sangat memengaruhi pengalaman pengguna,
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 bersifat memblokir.
openContainerWithId:tagManager:openType:timeout:
menampilkan
Objek TAGContainerFuture
, yang metode get
-nya menampilkan
TAGContainer
segera setelah dimuat (tetapi itu akan diblokir sampai saat itu).
Metode openContainerWithId:tagManager:openType:timeout:notifier:
mengambil satu callback,
dipanggil saat container tersedia.
Kedua metode memiliki periode waktu tunggu default
2.0
detik.
Mengevaluasi Makro pada Runtime menggunakan Aturan
Penampung dapat mengevaluasi nilai saat runtime menggunakan aturan. Aturan mungkin didasarkan berdasarkan kriteria seperti bahasa perangkat, platform, atau nilai makro lainnya. Sebagai contoh, aturan dapat digunakan untuk memilih string tampilan yang dilokalkan berdasarkan bahasa perangkat saat runtime. Hal ini dapat dikonfigurasi menggunakan aturan berikut:
Anda kemudian dapat membuat makro pengumpulan nilai untuk setiap bahasa, dan menambahkan ini untuk setiap makro, dengan menyisipkan kode bahasa yang sesuai. Ketika penampung ini dipublikasikan, aplikasi Anda akan dapat menampilkan tampilan yang dilokalkan {i>string<i}, tergantung pada bahasa perangkat pengguna pada saat {i>runtime<i}.
Perlu diketahui bahwa jika penampung default memerlukan aturan, Anda harus menggunakan file container biner sebagai default Anda container.
Pelajari lebih lanjut cara mengonfigurasi aturan (Pusat Bantuan).
File Container Default Biner
Penampung default yang memerlukan aturan harus menggunakan file container biner bukan file daftar properti atau JSON sebagai container default. Container biner menawarkan dukungan untuk menentukan nilai makro saat waktu proses dengan aturan Google Tag Manager, sedangkan daftar properti atau JSON tidak dilakukan oleh file.
File penampung biner dapat didownload dari web Google Tag Manager
antarmuka pengguna dan
harus ditambahkan ke paket aplikasi utama Anda sesuai dengan konvensi penamaan ini:
GTM-XXXX
, dengan nama file yang mewakili
ID penampung.
Jika file daftar properti dan/atau file JSON Seperti file kontainer biner, SDK akan menggunakan kontainer biner sebagai container default.
Menggunakan Makro Panggilan Fungsi
Makro Panggilan Fungsi adalah makro yang ditetapkan ke nilai hasil fungsi tertentu dalam aplikasi Anda. Makro Panggilan Fungsi dapat digunakan untuk menggabungkan nilai runtime dengan aturan Google Tag Manager, seperti menentukan pada runtime harga mana yang akan ditampilkan kepada pengguna berdasarkan bahasa dan mata uang perangkat.
Untuk mengonfigurasi makro panggilan fungsi:
- Tentukan makro panggilan fungsi di antarmuka web Google Tag Manager. Argumen dapat dikonfigurasi sebagai pasangan nilai kunci secara opsional.
- 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
- Mendaftarkan pengendali menggunakan TAGContainer::registerFunctionCallMacroHandler:forMacro: dan nama fungsi yang 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 pradaftar untuk dijalankan kapan saja
peristiwa didorong ke lapisan data dan aturan tag
mengevaluasi ke true
.
Untuk mengonfigurasi tag panggilan fungsi:
- Tentukan tag panggilan fungsi di antarmuka web Google Tag Manager. Argumen dapat dikonfigurasi sebagai pasangan nilai kunci secara opsional.
- Terapkan 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
- Daftarkan pengendali tag panggilan fungsi menggunakan nama tag yang dikonfigurasi di Antarmuka web Google Tag Manager:
// // 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 Pembaruan Khusus
SDK Google Tag Manager akan mencoba mengambil
penampung baru jika usia penampung saat ini melebihi 12 jam. Untuk menyetel
periode pembaruan penampung khusus, 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];
Proses debug dengan Pencatat
SDK Google Tag Manager mencetak error dan peringatan ke log secara default.
Mengaktifkan logging panjang dapat membantu proses debug dan dapat dilakukan dengan
menerapkan 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 mengatur LogLevel
yang ada dengan 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];