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

Hướng dẫn 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 ứ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 giá trị cấu hình trong ứng dụng dành cho thiết bị di động bằng cách sử dụng giao diện Trình quản lý thẻ của Google mà không phải tạo lại và gửi lại tệp nhị phân của ứng dụng cho các trang web thương mại về ứng dụng.

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

  • Các chuỗi hiển thị và chế độ cài đặt giao diện người dùng khác nhau
  • 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

Các 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ữ của quảng cáo
  • Sử dụng ngôn ngữ và vị trí để định cấu hình các thành phần 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 các ứng dụng. Nhà phát triển có thể đẩy các sự kiện quan trọng vào một lớp dữ liệu và quyết định sau đó nên kích hoạt thẻ hoặc pixel theo dõi nào. Trình quản lý thẻ hiện hỗ trợ các thẻ sau:

  • Phân tích ứng dụng di động của Google
  • 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 điều 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

Phần 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 Lớp dữ liệu
  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 cần thêm libGoogleAnalyticsServices.a và các tệp tiêu đề Trình quản lý thẻ của Google (GTM) từ thư mục Library của gói SDK vào dự án của mình.

Tiếp theo, hãy thêm nội dung sau vào thư viện được liên kết của mục tiêu ứng dụng nếu 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 khung đó cung cấp thông qua các macro SDK của Trình quản lý thẻ của Google, bạn cũng sẽ cần phải liên kết các thư viện bổ sung sau:

  • libAdIdAccess.a
  • AdSupport.framework

2. Thêm một 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 ứng dụng đầu tiên của bạn. Vùng chứa mặc định sẽ được dùng cho đến khi ứng dụng có thể truy xuất vùng chứa mới qua mạng.

Để tải 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 mà bạn muốn tải xuống.
  3. Nhấp vào nút 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à thư mục "Tệp hỗ trợ" trong dự án của bạn.

Tên tệp mặc định phải là mã vùng chứa (ví dụ: GTM-1234). Sau khi bạn 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 tuân 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 quy tắc hoặc thẻ, bạn có thể chọn sử dụng danh sách thuộc tính hoặc tệp JSON đơn giản. Tệp phải nằm trong gói chính và phải tuân theo quy ước đặt tên sau: <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 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 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 vùng chứa 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 các giá trị cấu hình bằng các phương thức <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"];

Các yêu cầu được thực hiện bằng khoá không tồn tại sẽ trả về một giá trị mặc định phù hợp với loại đã 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 giá trị vào DataLayer

DataLayer là một bản đồ cho phép thông tin trong thời gian chạy về ứng dụng của bạn (chẳng hạn như các sự kiện chạm hoặc lượt xem màn hình) có sẵn 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 đưa thông tin về lượt xem màn hình vào bản đồ DataLayer, bạn có thể thiết lập các thẻ trong giao diện web của Trình quản lý thẻ để kích hoạt pixel chuyển đổi và theo dõi lệnh gọi để phản hồi các lượt xem màn hình đó mà không cần mã hoá cứng chúng vào ứng dụng.

Các sự kiện được đẩy sang 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: = "openScreen". Để chuyển tên màn hình đến một trong các thẻ này, hãy tạo một macro lớp dữ liệu tham chiếu đến khóa "screenName" trong lớp dữ liệu. Bạn cũng có thể tạo một thẻ (như pixel chuyển đổi Google Ads) để chỉ kích hoạt cho các lượt xem màn hình cụ thể, bằng cách tạo quy tắc, trong đó = "openScreen" && bằng "ConfirmationScreen".

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

Các giá trị vĩ mô 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 vùng chứa, bạn có thể xem trước vùng chứa nháp của mình.

Để xem trước vùng chứa, hãy tạo URL xem trước trong giao diện web Trình quản lý thẻ của Google 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. Hãy giữ lại URL xem trước này vì bạn sẽ cần URL đó trong các bước sau.

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

Để bật bản xem trước vùng chứa, bạn phải thêm mã vào tệp triển khai uỷ quyền ứng dụng và xác định giao thức URL xem trước trong 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 ứ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ý giá trị 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 trong ứ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 của ứng dụng.
Hình 3: Thêm giao thứ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 bản nháp trong ứng dụng.

Khi bạn đã sẵn sàng cung cấp giá trị cấu hình nháp cho ứng dụng của mình, hãy phát hành 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ố tuỳ chọn cấu hình nâng cao cho phép bạn chọn các giá trị dựa trên điều kiện thời gian chạy bằng cách sử dụng các quy tắc, làm mới vùng chứa theo cách thủ công và có thêm các tuỳ chọn để mở vùng chứa. Các phần sau đây trình bày một số cấu hình nâng cao phổ biến nhất.

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 thức để mở vùng chứa, giúp bạn có nhiều quyền kiểm soát 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ở vùng chứa. Phương thức 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ó vùng chứa nào đã lưu hoặc nếu vùng chứa đã lưu không mới (trê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, openContainerById:callback: sẽ đưa ra một số phương thức gọi lại trong vòng đời để mã của bạn có thể tìm hiểu thời điểm yêu cầu tải bắt đầu, lý do yêu cầu không thành công và thành công, cũng như liệu vùng chứa cuối cùng được tải qua ổ đĩa hay mạng.

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

openContainerById:callback: truyền các giá trị enum sau đây làm đối số cho các lệnh gọi lại này:

RefreshType

Giá trịNội dung mô tả
kTAGContainerCallbackRefreshTypeSaved Yêu cầu làm mới đang tải một vùng chứa được 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ịNội dung mô tả
kTAGContainerCallbackRefreshFailureNoSavedContainer Không có vùng chứa đã lưu nào.
kTAGContainerCallbackRefreshFailureIoError Lỗi I/O đã ngăn việc 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 pháp mở vùng chứa không mặc định và mới chứa

TAGContainerOpener gói openContainerById:callback: và cung cấp 2 phương thức tiện lợi để mở vùng chứa: openContainerWithId:tagManager:openType:timeout:notifier:openContainerWithId:tagManager:openType:timeout:.

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

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

Bạn không nên sử dụng kTAGOpenTypePreferFresh ở những nơi có thể 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 yêu cầu vùng chứa mạng.

Cả hai phương thức thuận tiện này đều không chặn. openContainerWithId:tagManager:openType:timeout: trả về một đối tượng TAGContainerFuture, trong đó phương thức get trả về TAGContainer ngay khi vừa tải xong (nhưng điều đó sẽ bị chặn cho đến lúc đó). Phương thức openContainerWithId:tagManager:openType:timeout:notifier: nhậ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 thức đề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 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 các quy tắc. Các quy tắc có thể dựa trên các tiêu chí như ngôn ngữ thiết bị, nền tảng hoặc bất kỳ giá trị macro nào khác. Ví dụ: bạn có thể sử dụng các quy tắc để chọn một chuỗi hiển thị đã bản địa hoá dựa trên ngôn ngữ của thiết bị trong thời gian chạy. Bạn có thể định cấu hình mục này 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ị trong thời gian chạy: language bằng es. Quy tắc này sử dụng macro ngôn ngữ được xác định trước và mã ngôn ngữ ISO 639-1 gồm hai ký tự.
Hình 1: Thêm quy tắc để chỉ bật macro thu thập giá trị cho các thiết bị được định cấu hình để sử dụng tiếng Tây Ban Nha.

Sau đó, bạn có thể tạo macro tập hợp giá trị cho từng ngôn ngữ và thêm quy tắc này vào từng macro, chèn mã ngôn ngữ thích hợp. Khi vùng chứa này được xuất bản, ứng dụng của bạn sẽ có thể hiển thị các chuỗi hiển thị đã bản địa hoá, 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 có quy tắc, bạn phải dùng tệp vùng chứa nhị phân làm vùng chứa mặc định.

Tìm hiểu thêm về cách định cấu hình quy tắc (Trung tâm trợ giúp).

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

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

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

Trong trường hợp có tệp danh sách thuộc tính và/hoặc tệp JSON cũng như tệp vùng chứa nhị phân, SDK sẽ sử dụng tệp 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. Bạn có thể sử dụng Macro lệnh gọi hàm để kết hợp 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ư xác định giá sẽ hiển thị cho người dùng dựa trên ngôn ngữ và đơn vị tiền tệ đã định cấu hình của thiết bị.

Để đị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ể tuỳ ý định cấu hình các đối số dưới dạng cặp khoá-giá trị.
  2. Xác định trình xử lý triển khai giao thức TAGFunctionCallMacroHandler :
    // 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à các 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ể tuỳ ý định cấu hình các đối số dưới dạng cặp khoá-giá trị.
  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ẻ 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ố gắng truy xuất một vùng chứa mới nếu thời hạn sử dụng hiện tại của vùng chứa vượt quá 12 giờ. Để đặ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à bạn có thể triển khai Logger của riêng mình, 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 Trình ghi nhật ký 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];