Objective-C のスタートガイド

このデベロッパー ガイドでは、モバイルアプリに Google タグ マネージャーを実装する方法について説明します。

はじめに

Google タグ マネージャーを使用すると、デベロッパーは、アプリケーション バイナリを再ビルドしてアプリ マーケットプレイスに再送信しなくても、Google タグ マネージャーのインターフェースからモバイルアプリの設定値を変更できます。

これは、アプリ内で変更が必要になる構成値やフラグを管理するのに役立ちます。次に例を示します。

  • さまざまな UI 設定と表示文字列
  • アプリ内で配信される広告のサイズ、場所、タイプ
  • ゲームの設定

構成値はルールを使用してランタイム時に評価され、次のような動的な構成が可能になります。

  • 画面サイズを使用して広告のバナーサイズを決定する
  • 言語と地域を使用して UI 要素を設定する

また、アプリにトラッキング タグとピクセルを動的に実装することも可能です。デベロッパーは重要なイベントをデータレイヤーにプッシュし、後でどのトラッキング タグやピクセルを配信するかを決めることができます。 現在、タグ マネージャーでは以下のタグがサポートされています。

  • Google モバイルアプリ解析
  • カスタムの関数呼び出しタグ

始める前に

このスタートガイドを使用する前に、以下をご用意ください。

Google タグ マネージャーを初めてご利用になる場合は、このガイドに進む前に、 コンテナ、マクロ、ルールの詳細(ヘルプセンター)を確認することをおすすめします。

はじめに

このセクションでは、タグ マネージャーの一般的なワークフローについて説明します。

  1. プロジェクトに Google タグ マネージャー SDK を追加する
  2. コンテナのデフォルトの値を設定する
  3. コンテナを開く
  4. コンテナから設定値を取得する
  5. DataLayer にイベントを push する
  6. コンテナをプレビューして公開する

1. プロジェクトに Google タグ マネージャー SDK を追加する

Google タグ マネージャー SDK を使用する前に、SDK パッケージの Library ディレクトリから libGoogleAnalyticsServices.a と Google タグ マネージャー(GTM)のヘッダー ファイルをプロジェクトに追加する必要があります。

次に、アプリ ターゲットのリンクされたライブラリに以下を追加します(まだ存在しない場合)。

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

また、Google タグ マネージャーの SDK マクロを通じてこのフレームワークで提供される広告主向け識別子(IDFA)とトラッキング フラグに、アプリからアクセスできるようにするには、以下の追加のライブラリをリンクする必要があります。

  • libAdIdAccess.a
  • AdSupport.framework

2. デフォルトのコンテナ ファイルをプロジェクトに追加する

Google タグ マネージャーは、アプリケーションの初回実行時にデフォルトのコンテナを使用します。アプリがネットワーク経由で新しいコンテナを取得できるようになるまで、デフォルトのコンテナが使用されます。

デフォルトのコンテナ バイナリをダウンロードしてアプリケーションに追加する手順は次のとおりです。

  1. Google タグ マネージャーの管理画面にログインします。
  2. ダウンロードするコンテナのバージョンを選択します。
  3. [ダウンロード] ボタンをクリックしてコンテナ バイナリを取得します。
  4. バイナリ ファイルをプロジェクトのルート ディレクトリと、プロジェクトの「Supporting Files」フォルダに追加します。

デフォルトのファイル名はコンテナ ID(GTM-1234 など)にする必要があります。バイナリ ファイルをダウンロードしたら、正しい命名規則に従うために、ファイル名からバージョンのサフィックスを削除してください。

バイナリ ファイルの使用をおすすめしますが、コンテナにルールやタグが含まれていない場合は、代わりにシンプルなプロパティ リストまたは JSON ファイルを使用することもできます。 このファイルはメインバンドル内に配置し、<Container_ID>.<plist|json> という命名規則に従う必要があります。たとえば、コンテナ ID が GTM-1234 の場合、GTM-1234.plist というプロパティ リストファイルにデフォルトのコンテナ値を指定できます。

3. コンテナを開く

コンテナから値を取得する前に、アプリケーションでコンテナを開く必要があります。コンテナを開くと、ディスク(使用可能な場合)からコンテナが読み込まれるか、必要に応じてネットワークからコンテナがリクエストされます。

iOS でコンテナを開く最も簡単な方法は、次の例のように openContainerWithId:tagManager:openType:timeout:notifier: を使用することです。

// 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. コンテナからの設定値の取得

コンテナを開いたら、<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"];

存在しないキーのリクエストに対しては、リクエストされたタイプに適したデフォルト値が返されます。

// 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. DataLayer に値を push する

DataLayer は、アプリに関する実行時情報(タッチイベントやスクリーン ビューなど)を、コンテナ内のタグ マネージャーのマクロやタグで使用できるようにするマップです。

たとえば、スクリーン ビューに関する情報を DataLayer マップにプッシュすることで、タグ マネージャーのウェブ インターフェース内でタグを設定し、コンバージョン ピクセルを配信し、スクリーン ビューに応じて通話をトラッキングできるようになります。アプリにハードコードする必要はありません。

イベントは push: を使用して DataLayer に 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

ウェブ管理画面で、「 が "openScreen" と等しい」というルールを作成して、スクリーン ビューごとに配信されるタグ(Google アナリティクス タグなど)を作成できるようになりました。スクリーン名を上記のタグのいずれかに渡すには、データレイヤーの「screenName」キーを参照するデータレイヤー マクロを作成します。特定のスクリーン ビューに対してのみ配信されるタグ(例: Google 広告コンバージョン ピクセルなど)を作成することもできます。それには、 が「openScreen」と等しい && が「ConfirmationScreen」と等しいルールを作成します。

6. コンテナのプレビューと公開

マクロの値は、現在公開中のバージョンに常に対応しています。 最新バージョンのコンテナを公開する前に、ドラフト コンテナをプレビューできます。

コンテナをプレビューするには、Google タグ マネージャーの管理画面で、プレビューするコンテナのバージョンを選択し、[Preview] を選択することにより、プレビュー URL を生成します。このプレビュー URL は後の手順で必要になるため、控えておきましょう。

プレビュー URL は、タグ マネージャー管理画面のプレビュー ウィンドウで利用できます
図 1: タグ マネージャーの管理画面からプレビュー URL を取得する。

コンテナのプレビューを有効にするには、アプリ デリゲートの実装ファイルにコードを追加し、プロジェクトのプロパティ リストで Google タグ マネージャーのプレビュー URL スキームを定義する必要があります。

まず、次の太字のコード スニペットをアプリ デリゲート ファイルに追加します。

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

次に、次の URL 識別子と URL スキームをアプリケーションのプロパティ リストファイルの URL タイプのキーとして登録します。

URL identifier: your.package_name
URL scheme: tagmanager.c.your.package.name
タグ マネージャーのプレビュー URL スキームをアプリのプロパティ リストファイルに登録します。
図 3: タグ マネージャーのプレビュー URL スキームをアプリのプロパティ リストファイルに追加する。

エミュレータまたは実機でリンクを開き、アプリでドラフト コンテナをプレビューします。

ドラフトの構成値をアプリで使用できるようにする準備ができたら、 コンテナを公開します。

詳細構成

モバイル向け Google タグ マネージャーには高度な設定オプションが数多く用意されており、ルールを使って実行時の条件に基づいて値を選択したり、コンテナを手動で更新したり、コンテナを開くための追加オプションを取得したりすることができます。以下のセクションでは、最も一般的な高度な構成をいくつか概説します。

コンテナを開くための詳細オプション

Google タグ マネージャー SDK には、コンテナを開くためのメソッドがいくつか用意されています。これらのメソッドを使用すると、読み込みプロセスを細かく制御できます。

openContainerById:callback:

openContainerById:callback: は、コンテナを開くための最低レベルで最も柔軟な API です。デフォルトのコンテナとともにすぐに返されます。保存されたコンテナが存在しない場合、または保存されたコンテナが最新でない(12 時間以上経過)場合は、ディスクまたはネットワークからコンテナを非同期で読み込みます。

@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

読み込みプロセスの間、openContainerById:callback: は複数のライフサイクル コールバックを発行します。これによりコードは、読み込みリクエストがいつ開始されたか、失敗したか成功したかとその理由、コンテナが最終的にディスクまたはネットワークから読み込まれたかどうかを確認します。

アプリケーションでデフォルト値を使用することが許容される場合を除き、これらのコールバックを使用して、保存済みコンテナまたはネットワーク コンテナが読み込まれたタイミングを把握する必要があります。アプリを初めて実行し、ネットワーク接続がない場合は、保存済みコンテナまたはネットワーク コンテナを読み込むことはできません。

openContainerById:callback: は、次の enum 値をこれらのコールバックに引数として渡します。

RefreshType

説明
kTAGContainerCallbackRefreshTypeSaved 更新リクエストは、ローカルに保存されたコンテナを読み込んでいます。
kTAGContainerCallbackRefreshTypeNetwork 更新リクエストは、ネットワーク経由でコンテナを読み込みます。

RefreshFailure

説明
kTAGContainerCallbackRefreshFailureNoSavedContainer 使用できる保存済みのコンテナはありません。
kTAGContainerCallbackRefreshFailureIoError I/O エラーによりコンテナを更新できませんでした。
kTAGContainerCallbackRefreshFailureNoNetwork ネットワークに接続できません。
kTAGContainerCallbackRefreshFailureNetworkError ネットワークエラーが発生しました。
kTAGContainerCallbackRefreshFailureServerError サーバーでエラーが発生しました。
kTAGContainerCallbackRefreshFailureUnknownError 分類できないエラーが発生しました。

デフォルト以外の最新のコンテナを開く方法

TAGContainerOpeneropenContainerById:callback: をラップし、コンテナを開くための 2 つの便利なメソッド(openContainerWithId:tagManager:openType:timeout:notifier:openContainerWithId:tagManager:openType:timeout:)を提供します。

これらのメソッドはそれぞれ、デフォルト以外のコンテナまたは新しいコンテナをリクエストする列挙型を取ります。

ほとんどのアプリケーションでは、kTAGOpenTypePreferNonDefault を指定することをおすすめします。デフォルト以外のコンテナは、作成から 12 時間以上経過していても、ディスクまたはネットワークから特定のタイムアウト時間内に最初のものを返します。古い保存済みコンテナが返された場合は、新しいコンテナに対する非同期ネットワーク リクエストも行われます。kTAGOpenTypePreferNonDefault を使用すると、他のコンテナが使用できない場合、またはタイムアウト時間を超えた場合に、デフォルトのコンテナが返されます。

kTAGOpenTypePreferFresh は、指定されたタイムアウト期間内にディスクまたはネットワークから新しいコンテナを返そうとします。ネットワーク接続が利用できない場合、またはタイムアウト期間を超えた場合、保存済みコンテナを返します。

UI フラグや表示文字列など、リクエスト時間が長いとユーザー エクスペリエンスに明らかな影響が出る可能性がある場所では、kTAGOpenTypePreferFresh を使用しないことをおすすめします。また、TAGContainer::refresh を使用すると、いつでもネットワーク コンテナ リクエストを強制できます。

これらの便利なメソッドはどちらも非ブロックです。openContainerWithId:tagManager:openType:timeout:TAGContainerFuture オブジェクトを返します。その get メソッドは、読み込みが完了するとすぐに TAGContainer を返します(それまではブロックされます)。openContainerWithId:tagManager:openType:timeout:notifier: メソッドは、コンテナが利用可能なときに呼び出される単一のコールバックを受け取ります。どちらの方法でも、デフォルトのタイムアウト時間は 2.0 秒に設定されています。

ルールを使用したランタイムでのマクロの評価

コンテナはルールを使用して実行時に値を評価できます。ルールは、デバイスの言語、プラットフォーム、その他のマクロ値などの条件に基づいて作成できます。たとえば、ルールを使用することで、実行時のデバイスの言語に基づいてローカライズされた表示文字列を選択できます。これは、次のルールを使用して構成できます。

ルールを使用して、実行時のデバイスの言語に基づいて表示文字列を選択します(言語 = es と等しい)。このルールでは、事前定義された言語マクロと 2 文字の ISO 639-1 言語コードを使用します。
図 1: スペイン語を使用するように構成されたデバイスでのみ値収集マクロを有効にするルールを追加する。

次に、言語ごとに値コレクション マクロを作成し、このルールを各マクロに追加して、適切な言語コードを挿入します。このコンテナが公開されると、実行時のユーザーのデバイスの言語に応じて、ローカライズされた表示文字列をアプリで表示できるようになります。

デフォルトのコンテナにルールが必要な場合は、デフォルトのコンテナとしてバイナリ コンテナ ファイルを使用する必要があります。

ルールの設定に関する詳細(ヘルプセンター)

バイナリのデフォルト コンテナ ファイル

ルールが必要なデフォルト コンテナは、デフォルトのコンテナとして、プロパティ リストファイルや JSON ファイルではなく、バイナリ コンテナ ファイルを使用する必要があります。バイナリ コンテナでは、Google タグ マネージャーのルールを使用したランタイム時のマクロ値の決定はサポートされていますが、プロパティ リストや JSON ファイルはサポートされていません。

バイナリ コンテナ ファイルは、Google タグ マネージャーのウェブ インターフェースからダウンロードでき、 命名規則 GTM-XXXX に従ってメイン アプリケーション バンドルに追加する必要があります。ここで、ファイル名はコンテナ ID を表します。

プロパティ リスト ファイルや JSON ファイル、バイナリ コンテナ ファイルが存在する場合、SDK はバイナリ コンテナ ファイルをデフォルトのコンテナとして使用します。

関数呼び出しマクロの使用

関数呼び出しマクロは、アプリ内で指定した関数の戻り値に設定されるマクロです。関数呼び出しマクロを使用すると、ランタイム値を Google タグ マネージャーのルールに組み込めます。たとえば、デバイスに設定されている言語と通貨に基づいて、ユーザーに表示する価格を実行時に決定できます。

関数呼び出しマクロを構成するには:

  1. Google タグ マネージャーの管理画面で、関数呼び出しマクロを定義します。 引数は必要に応じて Key-Value ペアとして設定できます。
  2. 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. TAGContainer::registerFunctionCallMacroHandler:forMacro: と 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
    

関数呼び出しタグの使用

関数呼び出しタグを使用すると、イベントがデータレイヤーにプッシュされ、タグルールが true と評価されるたびに、事前登録された関数を実行できます。

関数呼び出しタグを構成するには:

  1. Google タグ マネージャーの管理画面で、関数呼び出しタグを定義します。 引数は必要に応じて Key-Value ペアとして設定できます。
  2. 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. 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
    

カスタム更新期間の設定

現在のコンテナの経過時間が 12 時間を超えている場合、Google タグ マネージャー SDK は新しいコンテナの取得を試みます。カスタム コンテナの更新期間を設定するには、次の例のように NSTimer を使用します。

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

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

ロガーによるデバッグ

Google タグ マネージャー SDK はデフォルトでエラーと警告をログに出力します。 詳細ログを有効にするとデバッグに役立ちます。次の例に示すように、独自の Logger を実装することで実現できます。

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

または、次の例のように TagManager::logger::setLogLevel を使用して、既存の Logger の LogLevel を設定することもできます。

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