Hướng dẫn bắt đầu sử dụng Objective-C

Hướng dẫn dành cho nhà phát triển này mô tả cách triển khai Trình quản lý thẻ của Google trong một ứng dụng dành cho thiết bị di động.

Giới thiệu

Trình quản lý thẻ của Google cho phép nhà phát triển thay đổi cấu hình trong các ứng dụng di động của họ bằng Trình quản lý thẻ của Google giao diện mà không phải tạo lại và gửi lại tệp nhị phân của ứng dụng đến ứng dụng thị trường.

Điều này hữu ích để quản lý mọi giá trị cấu hình hoặc gắn cờ trong ứng dụng mà bạn có thể cần thay đổi trong tương lai, bao gồm:

  • Nhiều chế độ cài đặt giao diện người dùng và chuỗi hiển thị
  • Kích thước, vị trí hoặc loại quảng cáo được phân phát trong ứng dụng của bạn
  • Cài đặt trò chơi

Giá trị cấu hình cũng có thể được đánh giá trong thời gian chạy bằng cách sử dụng các quy tắc, bật các cấu hình động như:

  • Sử dụng kích thước màn hình để xác định kích thước biểu ngữ quảng cáo
  • Sử dụng ngôn ngữ và vị trí để định cấu hình các phần tử trên giao diện người dùng

Trình quản lý thẻ của Google cũng cho phép triển khai động các thẻ theo dõi và pixel trong ứng dụng. Nhà phát triển có thể đẩy các sự kiện quan trọng vào một dữ liệu và quyết định thẻ theo dõi hoặc pixel nào sẽ được kích hoạt. TagManager hiện hỗ trợ các thẻ sau:

  • Google Mobile App Analytics
  • Thẻ Lệnh gọi hàm tuỳ chỉnh

Trước khi bạn bắt đầu

Trước khi sử dụng hướng dẫn bắt đầu này, bạn sẽ cần những thứ sau:

Nếu mới sử dụng Trình quản lý thẻ của Google, bạn nên tìm hiểu thêm về vùng chứa, macro và quy tắc (Trung tâm trợ giúp) trước khi tiếp tục hướng dẫn này.

Bắt đầu

Mục này sẽ hướng dẫn nhà phát triển thông qua quy trình làm việc thông thường của Trình quản lý thẻ:

  1. Thêm SDK Trình quản lý thẻ của Google vào dự án
  2. Đặt giá trị vùng chứa mặc định
  3. Mở vùng chứa
  4. Nhận giá trị cấu hình từ vùng chứa
  5. Đẩy sự kiện lên DataLayer
  6. Xem trước và Xuất bản vùng chứa

1. Thêm SDK Trình quản lý thẻ của Google vào dự án của bạn

Trước khi sử dụng SDK Trình quản lý thẻ của Google, bạn sẽ cần thêm libGoogleAnalyticsServices.a và các tệp tiêu đề Trình quản lý thẻ của Google (GTM) từ Library thư mục của gói SDK vào dự án của bạn.

Tiếp theo, thêm đoạn mã sau vào thư viện được liên kết của mục tiêu ứng dụng nếu chúng chưa có:

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

Nếu bạn muốn ứng dụng của mình truy cập vào giá trị nhận dạng cho nhà quảng cáo (IDFA) và cờ theo dõi do khuôn khổ đó cung cấp thông qua Bạn cũng cần liên kết các thư viện bổ sung sau đây với macro Trình quản lý thẻ của Google:

  • libAdIdAccess.a
  • AdSupport.framework

2. Thêm tệp vùng chứa mặc định vào dự án

Trình quản lý thẻ của Google sử dụng vùng chứa mặc định trong lần chạy đầu tiên ứng dụng của bạn. Mặc định vùng chứa sẽ được sử dụng cho đến khi ứng dụng có thể truy xuất một vùng chứa mới qua mạng.

Để tải xuống và thêm tệp nhị phân của vùng chứa mặc định vào ứng dụng của bạn, hãy làm theo các bước sau:

  1. Đăng nhập vào giao diện web của Trình quản lý thẻ của Google.
  2. Chọn Phiên bản của vùng chứa bạn muốn tải xuống.
  3. Nhấp vào nút Download (Tải xuống) để truy xuất tệp nhị phân của vùng chứa.
  4. Thêm tệp nhị phân vào thư mục gốc của dự án và vào "Tệp hỗ trợ" trong dự án.

Tên tệp mặc định phải là mã vùng chứa (ví dụ: GTM-1234). Sau khi đã tải tệp nhị phân xuống, hãy nhớ xoá hậu tố của phiên bản khỏi tên tệp để đảm bảo bạn làm theo quy ước đặt tên chính xác.

Mặc dù bạn nên sử dụng tệp nhị phân, nhưng nếu vùng chứa của bạn không chứa các quy tắc hoặc thẻ, bạn có thể chọn sử dụng danh sách thuộc tính hoặc JSON thay thế. Tệp phải nằm trong gói chính và phải tuân theo quy ước đặt tên này: <Container_ID>.<plist|json>. Ví dụ: nếu mã vùng chứa của bạn là GTM-1234, bạn có thể chỉ định các giá trị vùng chứa mặc định của bạn trong tệp danh sách thuộc tính có tên GTM-1234.plist

3. Mở vùng chứa

Trước khi truy xuất các giá trị từ một vùng chứa, ứng dụng của bạn cần mở vùng chứa. Thao tác mở một vùng chứa sẽ tải vùng chứa đó từ ổ đĩa (nếu có), hoặc sẽ yêu cầu mã từ mạng (nếu cần).

Cách dễ nhất để mở một vùng chứa trên iOS là sử dụng openContainerWithId:tagManager:openType:timeout:notifier:, như trong ví dụ sau:

// 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. Nhận giá trị cấu hình từ vùng chứa

Khi vùng chứa mở, bạn có thể truy xuất giá trị cấu hình bằng cách sử dụng thời gian <type>ForKey: phương thức:

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

Các yêu cầu được thực hiện bằng khoá không tồn tại sẽ trả về giá trị mặc định phù hợp thành loại được yêu cầu:

// 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. Đẩy các giá trị đến DataLayer

DataLayer là một bản đồ cho phép thông tin về ứng dụng trong thời gian chạy, chẳng hạn như thao tác chạm sự kiện hoặc lượt xem màn hình, để áp dụng cho các macro và thẻ của Trình quản lý thẻ trong vùng chứa.

Ví dụ: bằng cách đẩy thông tin về chế độ xem màn hình vào bản đồ DataLayer, bạn có thể thiết lập thẻ trong giao diện web của Trình quản lý thẻ để kích hoạt pixel chuyển đổi cũng như theo dõi cuộc gọi để phản hồi những lượt xem màn hình đó mà không cần tốn công sức lập trình vào ứng dụng của bạn.

Các sự kiện được đẩy đến DataLayer bằng cách sử dụng 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

Trong giao diện web, bạn hiện có thể tạo thẻ (như thẻ Google Analytics) để kích hoạt cho mỗi lượt xem màn hình bằng cách tạo quy tắc sau: bằng "openScreen". Để chuyển tên màn hình vào một trong các thẻ này, hãy tạo macro lớp dữ liệu tham chiếu đến "screenName" vào lớp dữ liệu. Bạn cũng có thể tạo một thẻ (như pixel chuyển đổi trên Google Ads) để chỉ kích hoạt cho một số lượt xem màn hình cụ thể, theo cách tạo quy tắc trong đó bằng "openScreen" && là "ConfirmationScreen" ("Xác nhận màn hình").

6. Xem trước và Xuất bản vùng chứa

Giá trị macro sẽ luôn tương ứng với phiên bản đã xuất bản hiện tại. Trước khi xuất bản phiên bản mới nhất của một vùng chứa, bạn có thể xem trước vùng chứa nháp của bạn.

Để xem trước một vùng chứa, hãy tạo một URL xem trước trong Giao diện web của Trình quản lý thẻ bằng cách chọn phiên bản vùng chứa bạn muốn xem trước, sau đó chọn Preview. Chờ URL xem trước này vì bạn sẽ cần đến nó trong các bước sau.

Bạn có thể xem trước URL trong cửa sổ xem trước của Thẻ
           Giao diện web của trình quản lý
Hình 1: Nhận URL xem trước từ Giao diện web của Trình quản lý thẻ.

Để bật tính năng xem trước vùng chứa, bạn phải thêm mã vào ứng dụng của mình tệp triển khai uỷ quyền và xác định URL xem trước của Trình quản lý thẻ của Google trong danh sách thuộc tính của dự án.

Trước tiên, hãy thêm các đoạn mã được in đậm sau đây vào tệp uỷ quyền của ứng dụng:

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

Tiếp theo, hãy đăng ký mã nhận dạng URL và lược đồ URL sau đây trong Khoá loại URL của tệp danh sách thuộc tính của ứng dụng:

URL identifier: your.package_name
URL scheme: tagmanager.c.your.package.name
Đăng ký lược đồ URL xem trước của trình quản lý thẻ trong
                tệp danh sách thuộc tính.
Hình 3: Thêm lược đồ URL xem trước của Trình quản lý thẻ vào tệp danh sách thuộc tính của ứng dụng.

Mở đường liên kết trên trình mô phỏng hoặc thiết bị thực để xem trước vùng chứa dự thảo trong ứng dụng của bạn.

Khi bạn đã sẵn sàng cung cấp các giá trị cấu hình nháp cho ứng dụng, xuất bản vùng chứa.

Cấu hình nâng cao

Trình quản lý thẻ của Google dành cho thiết bị di động có một số cấu hình nâng cao cho phép bạn chọn giá trị dựa trên điều kiện thời gian chạy bằng cách sử dụng quy tắc, làm mới vùng chứa theo cách thủ công và có được các lựa chọn bổ sung để mở vùng chứa. Các phần sau đây trình bày một số .

Các tuỳ chọn nâng cao để mở vùng chứa

SDK Trình quản lý thẻ của Google cung cấp một số phương pháp để mở vùng chứa có thể cho phép bạn kiểm soát nhiều hơn đối với quá trình tải:

openContainerById:callback:

openContainerById:callback: là API cấp thấp nhất và linh hoạt nhất để mở một vùng chứa. URL này sẽ trả về ngay lập tức với vùng chứa mặc định và cũng tải không đồng bộ một vùng chứa từ ổ đĩa hoặc mạng nếu không được lưu vùng chứa tồn tại hoặc nếu vùng chứa đã lưu không mới (cũ hơn 12 giờ).

@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

Trong suốt quá trình tải, xảy ra openContainerById:callback: vấn đề một số phương thức gọi lại trong vòng đời để mã của bạn có thể xác định thời điểm bắt đầu yêu cầu tải, liệu yêu cầu có thành công hay không và tại sao yêu cầu đó thất bại, cũng như vùng chứa cuối cùng đã được tải từ đĩa hoặc mạng.

Trừ phi ứng dụng của bạn được phép sử dụng các giá trị mặc định, bạn sẽ cần sử dụng các lệnh gọi lại này để biết khi nào một mạng đã lưu hoặc vùng chứa đã tải. Xin lưu ý rằng bạn sẽ không thể tải tệp vùng chứa mạng nếu đây là lần đầu tiên ứng dụng được chạy và không có kết nối mạng.

openContainerById:callback: vượt qua enum sau các giá trị làm đối số cho các lệnh gọi lại này:

RefreshType

Giá trịMô tả
kTAGContainerCallbackRefreshTypeSaved Yêu cầu làm mới đang tải một vùng chứa đã lưu cục bộ.
kTAGContainerCallbackRefreshTypeNetwork Yêu cầu làm mới đang tải một vùng chứa qua mạng.

RefreshFailure

Giá trịMô tả
kTAGContainerCallbackRefreshFailureNoSavedContainer Hiện không có vùng chứa đã lưu nào.
kTAGContainerCallbackRefreshFailureIoError Lỗi I/O đã ngăn làm mới vùng chứa.
kTAGContainerCallbackRefreshFailureNoNetwork Không có kết nối mạng.
kTAGContainerCallbackRefreshFailureNetworkError Đã xảy ra lỗi mạng.
kTAGContainerCallbackRefreshFailureServerError Đã xảy ra lỗi trên máy chủ.
kTAGContainerCallbackRefreshFailureUnknownError Đã xảy ra lỗi không thể phân loại.

Phương thức mở vùng chứa không mặc định và vùng chứa mới

TAGContainerOpener kết thúc openContainerById:callback: và cung cấp 2 phương thức thuận tiện để mở vùng chứa: openContainerWithId:tagManager:openType:timeout:notifier:openContainerWithId:tagManager:openType:timeout:.

Mỗi phương thức trong số này có một bản liệt kê yêu cầu một phương thức không phải phương thức mặc định hoặc vùng chứa mới.

Bạn nên dùng kTAGOpenTypePreferNonDefault cho hầu hết các ứng dụng và cố gắng trả về vùng chứa không phải là vùng chứa mặc định có sẵn đầu tiên trong một vùng chứa nhất định khoảng thời gian chờ, từ đĩa hoặc mạng, ngay cả khi vùng chứa đó lớn hơn hơn 12 giờ. Nếu trả về một vùng chứa đã lưu cũ, điều này cũng sẽ yêu cầu mạng không đồng bộ cho một yêu cầu mới. Khi sử dụng kTAGOpenTypePreferNonDefault, giá trị mặc định vùng chứa sẽ được trả về nếu không có vùng chứa nào khác hoặc nếu khoảng thời gian chờ vượt quá.

kTAGOpenTypePreferFresh cố gắng trả về một vùng chứa mới từ ổ đĩa hoặc mạng trong khoảng thời gian chờ nhất định. Phương thức này sẽ trả về một vùng chứa đã lưu nếu một mạng kết nối không khả dụng và/hoặc đã vượt quá khoảng thời gian chờ.

Không nên sử dụng kTAGOpenTypePreferFresh ở những nơi mà thời gian yêu cầu lâu hơn có thể ảnh hưởng đáng kể đến trải nghiệm người dùng, chẳng hạn như với cờ giao diện người dùng hoặc chuỗi hiển thị. Bạn cũng có thể sử dụng TAGContainer::refresh bất cứ lúc nào để buộc thực hiện một yêu cầu vùng chứa mạng.

Cả hai phương thức tiện lợi này đều không chặn. openContainerWithId:tagManager:openType:timeout: trả về một Đối tượng TAGContainerFuture có phương thức get trả về một TAGContainer ngay khi tải (nhưng sẽ chặn cho đến thời điểm đó). Phương thức openContainerWithId:tagManager:openType:timeout:notifier: thực hiện một lệnh gọi lại duy nhất, được gọi khi vùng chứa có sẵn. Cả hai phương pháp đều có khoảng thời gian chờ mặc định là 2.0 giây.

Đánh giá macro trong thời gian chạy bằng cách sử dụng quy tắc

Các vùng chứa có thể đánh giá giá trị trong thời gian chạy bằng cách sử dụng quy tắc. Các quy tắc có thể dựa trên vào các tiêu chí như ngôn ngữ của thiết bị, nền tảng hoặc bất kỳ giá trị macro nào khác. Cho Ví dụ: bạn có thể sử dụng các quy tắc để chọn một chuỗi hiển thị được bản địa hoá dựa trên ngôn ngữ của thiết bị trong thời gian chạy. Tính năng này có thể được định cấu hình bằng cách sử dụng quy tắc sau:

Một quy tắc được dùng để chọn chuỗi hiển thị dựa trên ngôn ngữ của thiết bị tại
            thời gian chạy: ngôn ngữ bằng es. Quy tắc này sử dụng ngôn ngữ được xác định trước
            và một mã ngôn ngữ gồm hai ký tự theo ISO 639-1.
Hình 1: Thêm quy tắc để chỉ bật macro thu thập giá trị cho thiết bị định cấu hình để dùng tiếng Tây Ban Nha.

Sau đó, bạn có thể tạo macro tập hợp giá trị cho mỗi ngôn ngữ và thêm đoạn mã này cho mỗi macro, chèn mã ngôn ngữ thích hợp. Trường hợp vùng chứa này đã được xuất bản, ứng dụng của bạn sẽ có thể hiển thị màn hình đã bản địa hoá chuỗi, tuỳ thuộc vào ngôn ngữ trên thiết bị của người dùng trong thời gian chạy.

Lưu ý rằng nếu vùng chứa mặc định của bạn cần quy tắc, bạn phải sử dụng tệp vùng chứa nhị phân làm mặc định vùng chứa.

Tìm hiểu thêm về cách thiết lập quy tắc (Trung tâm trợ giúp).

Tệp vùng chứa mặc định nhị phân

Các vùng chứa mặc định cần quy tắc nên sử dụng tệp vùng chứa nhị phân thay vì tệp danh sách thuộc tính hoặc JSON làm vùng chứa mặc định. Vùng chứa nhị phân cung cấp hỗ trợ cho việc xác định các giá trị macro trong thời gian chạy bằng quy tắc Trình quản lý thẻ của Google, trong khi đó danh sách thuộc tính hoặc JSON thì không.

Bạn có thể tải các tệp vùng chứa nhị phân xuống từ trang web của Trình quản lý thẻ của Google giao diện và phải được thêm vào gói ứng dụng chính của bạn theo quy ước đặt tên sau: GTM-XXXX, trong đó tên tệp đại diện cho mã vùng chứa.

Trong trường hợp tệp danh sách cơ sở lưu trú và/hoặc tệp JSON cũng như có tệp vùng chứa nhị phân, SDK sẽ sử dụng vùng chứa nhị phân làm vùng chứa mặc định.

Sử dụng macro lệnh gọi hàm

Macro lệnh gọi hàm là các macro được đặt thành giá trị trả về của một hàm được chỉ định trong ứng dụng của bạn. Macro lệnh gọi hàm có thể được sử dụng để kết hợp các giá trị thời gian chạy với quy tắc của Trình quản lý thẻ của Google, chẳng hạn như trong thời gian chạy, xác định mức giá cần hiển thị cho người dùng dựa trên chế độ cài đặt đã định cấu hình ngôn ngữ và đơn vị tiền tệ của thiết bị.

Cách định cấu hình macro lệnh gọi hàm:

  1. Xác định macro lệnh gọi hàm trong giao diện web của Trình quản lý thẻ của Google. Bạn có thể định cấu hình các đối số dưới dạng cặp khoá-giá trị (không bắt buộc).
  2. Xác định trình xử lý triển khai TAGFunctionCallMacroHandler giao thức:
    // 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. Đăng ký trình xử lý bằng cách sử dụng TAGContainer::registerFunctionCallMacroHandler:forMacro: và tên hàm được chỉ định trong giao diện Trình quản lý thẻ của Google:
  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

Sử dụng thẻ lệnh gọi hàm

Thẻ lệnh gọi hàm cho phép thực thi các hàm đã đăng ký trước bất cứ khi nào một sự kiện được đẩy vào lớp dữ liệu và quy tắc thẻ đánh giá thành true.

Cách định cấu hình thẻ lệnh gọi hàm:

  1. Xác định thẻ lệnh gọi hàm trong giao diện web của Trình quản lý thẻ của Google. Bạn có thể định cấu hình các đối số dưới dạng cặp khoá-giá trị (không bắt buộc).
  2. Triển khai giao thức 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. Đăng ký trình xử lý thẻ lệnh gọi hàm bằng cách sử dụng tên thẻ được định cấu hình trong Giao diện web của Trình quản lý thẻ của Google:
  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

Đặt khoảng thời gian làm mới tuỳ chỉnh

SDK Trình quản lý thẻ của Google sẽ cố truy xuất một vùng chứa mới nếu tuổi vùng chứa hiện tại vượt quá 12 giờ. Để đặt một khoảng thời gian làm mới vùng chứa tuỳ chỉnh, hãy sử dụng NSTimer, như trong ví dụ sau:

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

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

Gỡ lỗi bằng Trình ghi nhật ký

Theo mặc định, SDK Trình quản lý thẻ của Google sẽ in lỗi và cảnh báo vào nhật ký. Việc bật tính năng ghi nhật ký chi tiết hơn có thể hữu ích cho việc gỡ lỗi và có thể thực hiện được bằng cách triển khai Logger của riêng bạn, như trong ví dụ sau:

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

Hoặc bạn có thể đặt LogLevel của Logger hiện có bằng cách sử dụng TagManager::logger::setLogLevel, như trong ví dụ sau:

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