このデベロッパー ガイドでは、モバイルアプリに Google タグ マネージャーを実装する方法について説明します。
はじめに
Google タグ マネージャーを使用すると、デベロッパーは Google タグ マネージャーの管理画面を使用して、アプリのバイナリを再ビルドしてアプリ マーケットプレイスに再送信しなくても、モバイルアプリの構成値を変更できます。
これは、今後変更する必要が生じる可能性があるアプリの構成値やフラグを管理する際に便利です。たとえば、次のようなものがあります。
- さまざまな UI 設定と表示文字列
- アプリで配信される広告のサイズ、場所、種類
- ゲームの設定
構成値は、ルールを使用して実行時に評価することもできます。これにより、次のような動的な構成が可能になります。
- 画面サイズを使用して広告バナーのサイズを決定する
- 言語と場所を使用して UI 要素を構成する
Google タグ マネージャーを使用すると、アプリにトラッキング タグ とピクセルを動的に実装することもできます。デベロッパーは、重要なイベントをデータ レイヤーにプッシュし、どのトラッキング タグやピクセルを配信するかを後で決定できます。 タグ マネージャーは次のタグをサポートしています。
- Google モバイルアプリ アナリティクス
- カスタム関数呼び出しタグ
始める前に
このスタートガイドを使用する前に、次のものが必要になります。
- Google タグ マネージャー アカウント
- 新しいタグ マネージャー コンテナと値収集マクロ
- Google タグ マネージャーを実装する iOS 用モバイルアプリ
- タグ マネージャー ライブラリを含む Google アナリティクス開発者サービス SDK
Google タグ マネージャーを初めて使用する場合は、このガイドに進む前に、 コンテナ、マクロ、ルール(ヘルプセンター)について詳しく学習することをおすすめします。
スタートガイド
このセクションでは、一般的なタグ マネージャーのワークフローについて説明します。
- Google タグ マネージャー SDK をプロジェクトに追加する
- デフォルトのコンテナ値を設定する
- コンテナを開く
- コンテナから構成値を取得する
- イベントを DataLayer にプッシュする
- コンテナをプレビューして公開する
1. Google タグ マネージャー SDK をプロジェクトに追加する
Google タグ マネージャー SDK を使用する前に、SDK パッケージの Library ディレクトリから libGoogleAnalyticsServices.a ファイルと Google タグ マネージャー(GTM)ヘッダーファイルをプロジェクトに追加する必要があります。
次に、アプリケーション ターゲットのリンクされたライブラリに、次のファイルを追加します(まだ追加されていない場合)。
CoreData.frameworkSystemConfiguration.frameworklibz.dyliblibsqlite3.dyliblibGoogleAnalyticsServices.a
Google タグ マネージャー SDK マクロを使用して、そのフレームワークから提供される広告主識別子(IDFA)とトラッキング フラグにアプリからアクセスできるようにする場合は、次のライブラリもリンクする必要があります。
libAdIdAccess.aAdSupport.framework
2. デフォルトのコンテナ ファイルをプロジェクトに追加する
Google タグ マネージャーは、アプリの初回実行時にデフォルトのコンテナを使用します。デフォルトの コンテナは、アプリがネットワーク経由で新しいコンテナを取得できるようになるまで 使用されます。
デフォルトのコンテナ バイナリをダウンロードしてアプリに追加する手順は次のとおりです。
- Google タグ マネージャーの管理画面にログインします。
- ダウンロードするコンテナのバージョン を選択します。
- [ダウンロード] ボタンをクリックして、コンテナ バイナリを取得します。
- バイナリ ファイルを プロジェクトのルート ディレクトリと、プロジェクトの [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 にプッシュする
DataLayer は、タッチ イベントや画面ビューなど、アプリに関する実行時情報をコンテナ内のタグ マネージャーのマクロとタグで使用できるようにするマップです。
たとえば、画面ビューに関する情報を DataLayer マップにプッシュすると、タグ マネージャーの管理画面でタグを設定して、アプリにハードコードしなくても、それらの画面ビューに応じてコンバージョン ピクセルとトラッキング呼び出しを配信できます。
イベントは push: を使用して DataLayer にプッシュされます。
// // 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
管理画面で、各スクリーン ビューで配信されるタグ(Google アナリティクス タグなど)を作成するには、次のルールを作成します。 equals "openScreen"。画面名 をこれらのタグのいずれかに渡すには、データレイヤーの「screenName」 キーを参照するデータレイヤー マクロを作成します。 equals "openScreen" && equals "ConfirmationScreen" というルールを作成すると、特定の画面ビューでのみ配信されるタグ (Google 広告のコンバージョン ピクセルなど)を作成することもできます。
6. コンテナをプレビューして公開する
マクロ値は常に現在公開されているバージョンに対応します。 コンテナの最新バージョンを公開する前に、ドラフト コンテナをプレビューできます。
コンテナをプレビューするには、Google タグ マネージャーの管理画面で、プレビューするコンテナのバージョンを選択し、[プレビュー] を選択することにより、プレビュー URL を生成します。Previewこのプレビュー 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
エミュレータまたは実機でリンクを開いて、アプリでドラフト コンテナをプレビューします。
ドラフト構成値をアプリで使用できるようにする準備ができたら、 アプリケーションを 公開します。
詳細設定
モバイル向け 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
|
分類できないエラーが発生しました。 |
デフォルト以外の新しいコンテナを開く方法
TAGContainerOpener は openContainerById: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 秒です。
ルールを使用して実行時にマクロを評価する
コンテナは、ルールを使用して実行時に値を評価できます。ルールは、デバイスの言語、プラットフォーム、その他のマクロ値などの条件に基づいて設定できます。たとえば、ルールを使用して、実行時にデバイスの言語に基づいてローカライズされた表示文字列を選択できます。これは、次のルールを使用して構成できます。
次に、言語ごとに値収集マクロを作成し、このルールを各マクロに追加して、適切な言語コードを挿入します。このコンテナが公開されると、アプリは実行時にユーザーのデバイスの言語に応じてローカライズされた表示文字列を表示できるようになります。
デフォルトのコンテナにルールが必要な場合は、バイナリ コンテナ ファイルをデフォルトのコンテナとして使用する必要があります。
ルールの構成について詳しくは、ヘルプセンターをご覧ください。
バイナリ デフォルト コンテナ ファイル
ルールが必要なデフォルト コンテナでは、バイナリ コンテナ ファイル プロパティ リスト ファイルまたは JSON ファイルではなく、バイナリ コンテナ ファイルをデフォルト コンテナとして使用する必要があります。バイナリ コンテナは、Google タグ マネージャーのルールを使用して実行時にマクロ値を決定できますが、プロパティ リスト ファイルや JSON ファイルではできません。
バイナリ コンテナ ファイルは Google タグ マネージャーの管理画面からダウンロードできます。ファイル名はコンテナ ID を表す GTM-XXXX という命名規則に従って、メインアプリ バンドルに追加する必要があります。
プロパティ リスト ファイルや JSON ファイルとバイナリ コンテナ ファイルの両方が存在する場合、SDK はバイナリ コンテナ ファイルをデフォルト コンテナとして使用します。
関数呼び出しマクロを使用する
関数呼び出しマクロは、アプリ内の指定された関数の戻り値に設定されるマクロです。関数呼び出しマクロを使用すると、Google タグ マネージャーのルールに実行時の値を組み込むことができます。たとえば、デバイスの言語と通貨の設定に基づいて、実行時にユーザーに表示する価格を決定できます。
関数呼び出しマクロを構成する手順は次のとおりです。
- Google タグ マネージャーの管理画面で関数呼び出しマクロを定義します。 必要に応じて、引数を Key-Value ペアとして構成できます。
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
- TAGContainer::registerFunctionCallMacroHandler:forMacro: と 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
関数呼び出しタグを使用する
関数呼び出しタグを使用すると、イベントがデータレイヤーにプッシュされ、タグルール
が true と評価されるたびに、事前登録された関数を実行できます。
関数呼び出しタグを構成する手順は次のとおりです。
- Google タグ マネージャーの管理画面で関数呼び出しタグを定義します。 必要に応じて、引数を Key-Value ペアとして構成できます。
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
- 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
カスタム更新期間を設定する
現在のコンテナの経過時間が 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];
Logger を使用してデバッグする
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];