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 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ác giá trị cấu hình trong ứng dụng di động của họ bằng giao diện Trình quản lý thẻ của Google mà không cần phải tạo lại và gửi lại các tệp nhị phân ứng dụng cho các trang web thương mại ứng dụng.
Điều này hữu ích cho việc quản lý mọi giá trị cấu hình hoặc 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
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, cho phép 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 linh hoạt 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 lớp dữ liệu và quyết định sau này nên kích hoạt thẻ theo dõi hoặc pixel nào. TagManager hỗ trợ các thẻ sau:
- Google Analytics cho ứng dụng di động
- 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 cần có những thứ sau:
- Một Tài khoản Trình quản lý thẻ của Google
- Một vùng chứa Trình quản lý thẻ mới và macro thu thập giá trị
- Một ứng dụng di động dành cho iOS để triển khai Trình quản lý thẻ của Google
- SDK dịch vụ Google Analytics, có chứa thư viện Trình quản lý thẻ.
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 xem hướng dẫn này.
Bắt đầu
Phần này sẽ hướng dẫn nhà phát triển thực hiện một quy trình làm việc điển hình với Trình quản lý thẻ:
- Thêm SDK Trình quản lý thẻ của Google vào dự án của bạn
- Đặt giá trị mặc định cho vùng chứa
- Mở vùng chứa
- Nhận giá trị cấu hình từ vùng chứa
- Đẩy sự kiện vào DataLayer
- 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
Trước khi sử dụng Google Tag Manager SDK, 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 những thư viện sau vào các 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.frameworkSystemConfiguration.frameworklibz.dyliblibsqlite3.dyliblibGoogleAnalyticsServices.a
Nếu muốn ứng dụng của mình truy cập vào giá trị nhận dạng của nhà quảng cáo (IDFA) và cờ theo dõi do khung đó cung cấp thông qua macro SDK Trình quản lý thẻ của Google, bạn cũng cần liên kết các thư viện bổ sung sau:
libAdIdAccess.aAdSupport.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 một vùng chứa mặc định trong lần chạy đầu tiên của ứng dụng. Vùng chứa mặc định sẽ được 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 một tệp nhị phân vùng chứa mặc định vào ứng dụng, hãy làm theo các bước sau:
- Đăng nhập vào giao diện web của Trình quản lý thẻ của Google.
- Chọn Phiên bản của vùng chứa mà bạn muốn tải xuống.
- Nhấp vào nút Tải xuống để truy xuất tệp nhị phân của vùng chứa.
- Thêm tệp nhị phân vào thư mục gốc của dự án và vào thư mục "Supporting Files" (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ố phiên bản khỏi tên tệp để đảm bảo bạn tuân thủ quy ước đặt tên chính xác.
Mặc dù 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 tệp danh sách thuộc tính hoặc tệp JSON. Tệp này phải nằm trong gói chính và 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 trong một tệp danh sách thuộc tính có tên là 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 đó. Việc mở một vùng chứa sẽ tải vùng chứa đó từ ổ đĩa (nếu có) hoặc 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 các giá trị cấu hình từ vùng chứa
Sau khi vùng chứa mở, bạn có thể truy xuất các giá trị cấu hình bằng cách sử dụ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 một khoá không tồn tại sẽ trả về một giá trị mặc định phù hợp với 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 thời gian chạy về ứng dụng của bạn (chẳng hạn như 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 một vùng chứa.
Ví dụ: bằng cách đẩy 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 Trình quản lý thẻ để kích hoạt pixel chuyển đổi và lệnh gọi theo dõi để phản hồi những lượt xem màn hình đó mà không cần mã hoá cứng chúng vào ứng dụng của mình.
Các sự kiện được chuyển đến DataLayer bằ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, giờ đây, bạn có thể tạo thẻ (chẳng hạn 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". Để truyề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 khoá "screenName" trong lớp dữ liệu. Bạn cũng có thể tạo một thẻ (chẳng hạn như pixel lượt chuyển đổi của Google Ads) chỉ kích hoạt cho một số lượt xem màn hình cụ thể bằng cách tạo một quy tắc trong đó bằng "openScreen" && bằng "ConfirmationScreen".
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 hiện tại đã xuất bản. 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.
Để 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ẻ của Google bằng cách chọn phiên bản vùng chứa mà bạn muốn xem trước, rồi chọn Preview. Lưu URL xem trước này vì bạn sẽ cần đến nó trong các bước sau.
Để bật tính năng 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 giản đồ 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 ứ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 trong khoá URL types 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
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 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 của mình, hãy xuất bản vùng chứa.
Cấu hình nâng cao
Trình quản lý thẻ của Google cho thiết bị di động có một số lựa 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à nhận 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ấu hình nâng cao phổ biến nhất.
Các lựa 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ở các vùng chứa có thể giúp bạn kiểm soát tốt hơn quá trình tải:
openContainerById:callback:
openContainerById:callback: là API linh hoạt và có cấp độ thấp nhất để mở một vùng chứa. Phương thức này sẽ trả về ngay lập tức một 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 đã lưu hoặc nếu vùng chứa đã lưu không mới (> 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ể biết khi nào yêu cầu tải bắt đầu, liệu yêu cầu có thất bại hay thành công và lý do, cũng như liệu cuối cùng vùng chứa có được tải từ ổ đĩa hay mạng hay không.
Trừ phi ứng dụng của bạn có thể 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 thời điểm một vùng chứa đã lưu hoặc vùng chứa mạng đã tải. Xin lưu ý rằng bạn sẽ không thể tải một vùng chứa đã lưu hoặc vùng chứa mạng 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: sẽ 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ị | 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ị | Mô tả |
|---|---|
kTAGContainerCallbackRefreshFailureNoSavedContainer
|
Không có vùng chứa đã lưu nào. |
kTAGContainerCallbackRefreshFailureIoError
|
Đã xảy ra lỗi I/O khiến vùng chứa không làm mới được. |
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 mới và không mặc định
TAGContainerOpener bao bọc openContainerById:callback: và cung cấp 2 phương thức tiện lợi để mở các vùng chứa: openContainerWithId:tagManager:openType:timeout:notifier: và openContainerWithId:tagManager:openType:timeout:.
Mỗi phương thức này lấy một quá trình liệt kê yêu cầu một vùng chứa mới hoặc không mặc định.
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 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ũ, thì nó 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 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ờ đã cho.
Phương thức này trả về một vùng chứa đã lưu nếu không có kết nối mạng và/hoặc thời gian chờ đã hết.
Bạn không nên sử dụng kTAGOpenTypePreferFresh ở những nơi mà thời gian yêu cầu dài 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 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, trong đó phương thức get trả về TAGContainer ngay khi đã tải (nhưng sẽ chặn cho đến lúc đó).
Phương thức openContainerWithId:tagManager:openType:timeout:notifier: lấy 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 tại thời gian chạy bằng cách sử dụng các quy tắc
Các vùng chứa có thể đánh giá các giá trị tại 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ể 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. Bạn có thể định cấu hình thông tin này bằng cách sử dụng quy tắc sau:
Sau đó, bạn có thể tạo macro thu thậ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ữ của thiết bị người dùng trong thời gian chạy.
Xin lưu ý rằng nếu vùng chứa mặc định của bạn cần có các quy tắc, thì bạn phải sử 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 thiết lập quy tắc (Trung tâm trợ giúp).
Tệp vùng chứa nhị phân mặc định
Các vùng chứa mặc định cần có 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 tệp JSON làm vùng chứa mặc định. Các vùng chứa nhị phân hỗ trợ việc xác định các giá trị macro 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 các tệp danh sách thuộc tính hoặc 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 của Trình quản lý thẻ của Google và nên thêm tệp này 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à những macro được đặt thành giá trị trả về của một hàm cụ thể 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 các giá trị thời gian chạy với các quy tắc của Trình quản lý thẻ của Google, chẳng hạn như xác định tại thời gian chạy giá nào 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ị.
Cách định cấu hình macro lệnh gọi hàm:
- 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ác cặp khoá-giá trị.
- Xác định một 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
- Đăng ký trình xử lý bằ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:
// // 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 được đă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 của thẻ đánh giá thành true.
Cách định cấu hình thẻ lệnh gọi hàm:
- 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ác cặp khoá-giá trị.
- 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
- Đăng ký trình xử lý thẻ lệnh gọi hàm bằng tên thẻ được định cấu hình trong giao diện web Trình quản lý thẻ của Google:
// // 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 tuổi của vùng chứa hiện tại 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, Trình quản lý thẻ của Google SDK sẽ in các 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 bằng cách triển khai Logger của riêng bạn, như trong ví dụ này:
// 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ụ này:
// Change the LogLevel to INFO to enable logging at INFO and higher levels. self.tagManager = [TAGManager instance]; [self.tagManager.logger setLogLevel:kTAGLoggerLogLevelInfo];