このデベロッパー ガイドでは、モバイル アプリケーションに Google タグ マネージャーを実装する方法について説明します。
はじめに
Google タグ マネージャーを使用すると、デベロッパーは Google タグ マネージャー管理画面を使用して、アプリのバイナリを再構築してアプリ マーケットプレイスに再送信しなくても、モバイルアプリの設定値を変更できます。
これは、アプリケーション内の構成値やフラグを管理するうえで役立ちます。たとえば、次のような値やフラグを管理できます。
- さまざまな UI 設定と表示文字列
- アプリで配信される広告のサイズ、配置、種類
- ゲームの設定
構成値は、ルールを使用して実行時に評価することもできます。これにより、次のような動的構成が可能になります。
- 画面サイズを使用して広告バナーのサイズを決定する
- 言語と地域を使用して UI 要素を構成する
Google タグ マネージャーでは、アプリ内のトラッキング タグやピクセルの動的な実装も可能です。デベロッパーは、重要なイベントをデータレイヤーにプッシュし、どのトラッキング タグやピクセルを配信するかを後で決定できます。TagManager は次のタグをサポートしています。
- Google モバイルアプリ解析
- カスタム関数呼び出しタグ
始める前に
このスタートガイドを使用する前に、次のものが必要になります。
- Google タグ マネージャー アカウント
- 新しいタグ マネージャーの コンテナと値コレクション マクロ
- Google タグ マネージャーを実装する Android モバイル アプリケーション
- タグ マネージャー ライブラリを含む Google アナリティクス開発者サービス SDK。
Google タグ マネージャーを初めてお使いの場合は、このガイドに進む前に、 コンテナ、マクロ、ルールについて(ヘルプセンター)をご確認ください。
スタートガイド
このセクションでは、一般的なタグ マネージャーのワークフローについて説明します。
- Google タグ マネージャー SDK をプロジェクトに追加する
- デフォルトのコンテナ値を設定する
- コンテナを開く
- コンテナから構成値を取得する
- データレイヤにイベントを push する
- コンテナをプレビューして公開する
1. Google タグ マネージャー SDK をプロジェクトに追加する
Google タグ マネージャー SDK を使用する前に、SDK パッケージを抽出して、プロジェクトのビルドパスにライブラリを追加し、AndroidManifest.xml ファイルに権限を追加する必要があります。
まず、Google タグ マネージャー ライブラリをプロジェクトの /libs フォルダに追加します。
次に、次の権限を使用するように AndroidManifest.xml ファイルを更新します。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
2. プロジェクトにデフォルトのコンテナ ファイルを追加する
Google タグ マネージャーは、アプリケーションの初回実行時にデフォルトのコンテナを使用します。アプリがネットワーク経由で新しいコンテナを取得できるようになるまで、デフォルトのコンテナが使用されます。
デフォルトのコンテナ バイナリをダウンロードしてアプリケーションに追加する手順は次のとおりです。
- Google タグ マネージャーのウェブ インターフェースにログインします。
- ダウンロードするコンテナのバージョンを選択します。
- [ダウンロード] ボタンをクリックして、コンテナ バイナリを取得します。
- バイナリ ファイルを次のパスに追加します。
<project-root>/assets/tagmanager/
デフォルトのファイル名はコンテナ ID(例: GTM-1234)です。バイナリ ファイルをダウンロードしたら、正しい命名規則に従うため、ファイル名からバージョン サフィックスを削除してください。
バイナリ ファイルの使用をおすすめしますが、コンテナにルールやタグが含まれていない場合は、代わりに JSON ファイルを使用することもできます。このファイルは、Android プロジェクトの新しい /assets/tagmanager フォルダに配置し、<Container_ID>.json という命名規則に従う必要があります。たとえば、コンテナ ID が GTM-1234 の場合は、デフォルトのコンテナ値を /assets/tagmanager/GTM-1234.json に追加する必要があります。
3. コンテナを開く
コンテナから値を取得する前に、アプリケーションでコンテナを開く必要があります。コンテナを開くと、ディスクから読み込まれるか(利用可能な場合)、ネットワークからリクエストされます(必要な場合)。
Android でコンテナを開く最も簡単な方法は、次の例のように ContainerOpener.openContainer(..., Notifier notifier) を使用することです。
import com.google.tagmanager.Container; import com.google.tagmanager.ContainerOpener; import com.google.tagmanager.ContainerOpener.OpenType; import com.google.tagmanager.TagManager; import android.app.Activity; import android.os.Bundle; public class RacingGame { // Add your public container ID. private static final String CONTAINER_ID = "GTM-YYYY"; volatile private Container mContainer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TagManager mTagManager = TagManager.getInstance(this); // The container is returned to containerFuture when available. ContainerOpener.openContainer( mTagManager, // TagManager instance. CONTAINER_ID, // Tag Manager Container ID. OpenType.PREFER_NON_DEFAULT, // Prefer not to get the default container, but stale is OK. null, // Time to wait for saved container to load (ms). Default is 2000ms. new ContainerOpener.Notifier() { // Called when container loads. @Override public void containerAvailable(Container container) { // Handle assignment in callback to avoid blocking main thread. mContainer = container; } } ); // Rest of your onCreate code. } }
この例では、ContainerOpener.openContainer(..., Notifier notifier) を使用してローカル ストレージから保存されたコンテナをリクエストします。containerAvailable コールバックで mContainer の割り当てを処理することで、メインスレッドがブロックされないようにします。保存されたコンテナが 12 時間以上経過している場合、この呼び出しは、ネットワーク経由で新しいコンテナを非同期で取得するリクエストもスケジュールします。
このサンプル実装は、ContainerOpener コンビニエンス クラスを使用してコンテナを開き、値を取得する最も簡単な方法を表しています。より高度な実装オプションについては、高度な構成をご覧ください。
4. コンテナから構成値を取得する
コンテナが開くと、get<type>Value() メソッドを使用して構成値を取得できます。
// Retrieving a configuration value from a Tag Manager Container. // Get the configuration value by key. String title = mContainer.getStringValue("title_string");
存在しないキーでリクエストを行うと、リクエストされた型に適したデフォルト値が返されます。
// Empty keys will return a default value depending on the type requested. // Key does not exist. An empty string is returned. string subtitle = container.getStringValue("Non-existent-key"); subtitle.equals(""); // Evaluates to true.
5. 値を dataLayer にプッシュする
データレイヤーは、タッチイベントやスクリーン ビューなどのアプリの実行時情報をコンテナ内のタグ マネージャーのマクロやタグで使用できるようにするマップです。
たとえば、スクリーン ビューに関する情報を DataLayer マップにプッシュすることで、アプリにハードコードすることなく、それらのスクリーン ビューに応じてコンバージョン ピクセルとトラッキング呼び出しを発信するタグをタグ マネージャーのウェブ インターフェースで設定できます。
イベントは、push() と DataLayer.mapOf() ヘルパー メソッドを使用して DataLayer にプッシュされます。
// // MainActivity.java // Pushing an openScreen event with a screen name into the data layer. // import com.google.tagmanager.TagManager; import com.google.tagmanager.DataLayer; import android.app.Activity; import android.os.Bundle; public MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // This screen becomes visible when Activity.onStart() is called. public void onStart() { super.onStart(); // The container should have already been opened, otherwise events pushed to // the DataLayer will not fire tags in that container. DataLayer dataLayer = TagManager.getInstance(this).getDataLayer(); dataLayer.push(DataLayer.mapOf("event", "openScreen", // The event type. This value should be used consistently for similar event types. "screenName", // Writes a key "screenName" to the dataLayer map. "Home Screen") // Writes a value "Home Screen" for the "screenName" key. ); } // Rest of the Activity implementation }
ウェブ インターフェースで、 が「openScreen」に等しいというルールを作成することで、各スクリーン ビューで発火するタグ(Google アナリティクス タグなど)を作成できるようになりました。画面名をこれらのタグのいずれかに渡すには、データレイヤーの「screenName」キーを参照するデータレイヤー マクロを作成します。 が「openScreen」に等しく、 が「ConfirmationScreen」に等しいというルールを作成することで、特定のスクリーン ビューでのみ実行されるタグ(Google 広告のコンバージョン ピクセルなど)を作成することもできます。
6. コンテナのプレビューと公開
マクロの値は常に現在の公開バージョンに対応します。コンテナの最新バージョンを公開する前に、ドラフト コンテナをプレビューできます。
コンテナをプレビューするには、Google タグ マネージャーの管理画面で、プレビューするコンテナのバージョンを選択し、Preview を選択することにより、プレビュー URL を生成します。このプレビュー URL は後の手順で必要になるため、保存しておきます。
次に、アプリケーションの AndroidManifest.xml ファイルに次のアクティビティを追加します。
<!-- Google Tag Manager Preview Activity --> <activity android:name="com.google.tagmanager.PreviewActivity" android:label="@string/app_name" android:noHistory="true" > <!-- Optional, removes the PreviewActivity from activity stack. --> <intent-filter> <data android:scheme="tagmanager.c.application_package_name" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter> </activity>
エミュレータまたは実機上でリンクを開いて、アプリでドラフト コンテナをプレビューします。
下書きの構成値をアプリケーションで使用できるようにする準備ができたら、 コンテナを公開します。
詳細設定
モバイル向け Google タグ マネージャーには、ルールを使用して実行時の条件に基づいて値を選択したり、コンテナを手動で更新したり、コンテナを開くための追加オプションを取得したりできる、高度な設定オプションがいくつか用意されています。以下のセクションでは、最も一般的な詳細設定について説明します。
コンテナを開くための詳細オプション
Google タグ マネージャー SDK には、コンテナを開くためのメソッドがいくつか用意されています。これらのメソッドを使用すると、読み込みプロセスをより詳細に制御できます。
TagManager.openContainer()
TagManager.openContainer() は、コンテナを開くための最も低いレベルで最も柔軟な API です。デフォルトのコンテナですぐに返され、保存されたコンテナが存在しない場合、または保存されたコンテナが最新でない場合(12 時間以上経過している場合)は、ディスクまたはネットワークからコンテナが非同期で読み込まれます。
mContainer = tagManager.openContainer(CONTAINER_ID, new Container.Callback() { // Called when a refresh is about to begin for the given refresh type. @Override public void containerRefreshBegin(Container container, RefreshType refreshType) { // Notify UI that the Container refresh is beginning. } // Called when a successful refresh occurred for the given refresh type. @Override public void containerRefreshSuccess(Container container, RefreshType refreshType]) { // Notify UI that Container is ready. } // Called when a refresh failed for the given refresh type. @Override public void containerRefreshFailure(Container container, RefreshType refreshType, RefreshFailure refreshFailure) { // Notify UI that the Container refresh has failed. }
読み込みプロセス全体を通して、TagManager.openContainer() はいくつかのライフサイクル コールバックを発行します。これにより、読み込みリクエストがいつ開始されたか、失敗または成功したかどうかとその理由、コンテナが最終的にディスクまたはネットワークから読み込まれたかどうかをコードで確認できます。
アプリケーションでデフォルト値を使用しても問題ない場合を除き、これらのコールバックを使用して、保存されたコンテナまたはネットワーク コンテナが読み込まれたタイミングを把握する必要があります。アプリの初回実行時にネットワーク接続がない場合、保存済みコンテナやネットワーク コンテナを読み込むことはできません。
TagManager.openContainer() は、次の enum 値を引数としてこれらのコールバックに渡します。
RefreshType
| 値 | 説明 |
|---|---|
Container.Callback.SAVED
|
更新リクエストでローカルに保存されたコンテナが読み込まれています。 |
Container.Callback.NETWORK
|
更新リクエストは、ネットワーク経由でコンテナを読み込んでいます。 |
RefreshFailure
| 値 | 説明 |
|---|---|
Container.Callback.NO_SAVED_CONTAINER
|
保存済みのコンテナはありません。 |
Container.Callback.IO_ERROR
|
I/O エラーが発生したため、コンテナを更新できませんでした。 |
Container.Callback.NO_NETWORK
|
ネットワークに接続されていません。 |
Container.Callback.NETWORK_ERROR
|
ネットワーク エラーが発生しました。 |
Container.Callback.SERVER_ERROR
|
サーバーでエラーが発生しました。 |
Container.Callback.UNKNOWN_ERROR
|
分類できないエラーが発生しました。 |
デフォルト以外のコンテナと新しいコンテナを開く方法
ContainerOpener は TagManager.openContainer() をラップし、コンテナを開くための 2 つのコンビニエンス メソッド(ContainerOpener.openContainer(..., Notifier notifier) と ContainerOpener.openContainer(..., Long timeoutInMillis))を提供します。
これらの各メソッドは、デフォルト以外のコンテナまたは新しいコンテナをリクエストする列挙型を受け取ります。
OpenType.PREFER_NON_DEFAULT はほとんどのアプリケーションで推奨されます。このコマンドは、指定されたタイムアウト期間内に、ディスクまたはネットワークから、使用可能な最初の非デフォルト コンテナを返そうとします。そのコンテナが 12 時間以上経過している場合でも同様です。古い保存済みコンテナが返された場合は、新しいコンテナの非同期ネットワーク リクエストも行われます。OpenType.PREFER_NON_DEFAULT を使用する場合、他のコンテナが使用できない場合や、タイムアウト期間を超過した場合は、デフォルトのコンテナが返されます。
OpenType.PREFER_FRESH は、指定されたタイムアウト期間内にディスクまたはネットワークから新しいコンテナを返そうとします。ネットワーク接続が利用できない場合や、タイムアウト期間を超過した場合は、保存されたコンテナを返します。
UI フラグや表示文字列など、リクエスト時間が長くなるとユーザー エクスペリエンスに大きな影響を与える可能性がある場所で OpenType.PREFER_FRESH を使用することはおすすめしません。また、Container.refresh() をいつでも使用して、ネットワーク コンテナ リクエストを強制的に実行することもできます。
これらのコンビニエンス メソッドはどちらもノンブロッキングです。ContainerOpener.openContainer(..., Long timeoutInMillis) は ContainerOpener.ContainerFuture オブジェクトを返します。その get メソッドは、読み込みが完了するとすぐに Container を返します(ただし、それまではブロックされます)。ContainerOpener.openContainer(..., Notifier notifier) メソッドは、コンテナが使用可能になったときに呼び出される単一のコールバックを受け取ります。このコールバックは、メインスレッドのブロックを防ぐために使用できます。どちらのメソッドも、デフォルトのタイムアウト期間は 2000 ミリ秒です。
ルールを使用したランタイムでのマクロの評価
コンテナは、ルールを使用して実行時に値を評価できます。ルールは、デバイスの言語、プラットフォーム、その他のマクロ値などの条件に基づいて設定できます。たとえば、ルールを使用して、実行時にデバイスの言語に基づいてローカライズされた表示文字列を選択できます。これは、次のルールを使用して構成できます。
次に、言語ごとに値収集マクロを作成し、各マクロにこのルールを追加して、適切な言語コードを挿入します。このコンテナを公開すると、実行時にユーザーのデバイスの言語に応じて、アプリでローカライズされた表示文字列を表示できるようになります。
デフォルトのコンテナにルールが必要な場合は、デフォルトのコンテナとしてバイナリ コンテナ ファイルを使用する必要があります。
ルールの設定について詳しくは、ヘルプセンター記事をご覧ください。
バイナリのデフォルト コンテナ ファイル
ルールが必要なデフォルト コンテナは、デフォルト コンテナとして JSON ファイルではなくバイナリ コンテナ ファイルを使用する必要があります。バイナリ コンテナは、Google タグ マネージャーのルールを使用して実行時にマクロ値を決定する機能をサポートしていますが、JSON ファイルはサポートしていません。
バイナリ コンテナ ファイルは Google タグ マネージャーのウェブ インターフェースからダウンロードできます。プロジェクトの /assets/tagmanager/ フォルダに追加し、/assets/tagmanager/GTM-XXXX というパターンに従う必要があります。ここで、ファイル名はコンテナ ID を表します。
JSON ファイルとバイナリ コンテナ ファイルの両方が存在する場合、SDK はバイナリ コンテナ ファイルをデフォルトのコンテナとして使用します。
関数呼び出しマクロの使用
関数呼び出しマクロは、アプリ内の指定された関数の戻り値に設定されるマクロです。関数呼び出しマクロを使用すると、Google タグ マネージャーのルールに実行時の値を組み込むことができます。たとえば、デバイスの言語と通貨の設定に基づいて、実行時にユーザーに表示する価格を決定できます。
関数呼び出しマクロを構成する手順は次のとおりです。
- Google タグ マネージャーのウェブ インターフェースで関数呼び出しマクロを定義します。引数は、必要に応じて Key-Value ペアとして構成できます。
Container.registerFunctionCallMacroHandler()と Google タグ マネージャーのウェブ管理画面で設定した関数名を使用して、アプリケーションでFunctionCallMacroHandlerを登録し、そのgetValue()メソッドをオーバーライドします。/** * Registers a function call macro handler. * * @param functionName The function name field, as defined in the Google Tag * Manager web interface. */ mContainer.registerFunctionCallMacroHandler(functionName, new FunctionCallMacroHandler() { /** * This code will execute when any custom macro's rule(s) evaluate to true. * The code should check the functionName and process accordingly. * * @param functionName Corresponds to the function 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. */ @Override public Object getValue(String functionName, Map<String, Object> parameters)) { if (functionName.equals("myConfiguredFunctionName")) { // Process and return the calculated value of this macro accordingly. return macro_value } return null; } });
関数呼び出しタグの使用
関数呼び出しタグを使用すると、イベントがデータレイヤにプッシュされ、タグルールの評価が true になったときに、事前に登録された関数を実行できます。
関数呼び出しタグを設定するには:
- Google タグ マネージャーのウェブ インターフェースで関数呼び出しタグを定義します。引数は、必要に応じて Key-Value ペアとして構成できます。
Container.registerFunctionCallTagHandler()を使用して、アプリケーションで関数呼び出しタグ ハンドラを登録します。/** * Register a function call tag handler. * * @param functionName The function name, which corresponds to the function name field * Google Tag Manager web interface. */ mContainer.registerFunctionCallTagHandler(functionName, new FunctionCallTagHandler() { /** * This method will be called when any custom tag's rule(s) evaluates to true. * The code should check the functionName and process accordingly. * * @param functionName The functionName passed to the functionCallTagHandler. * @param parameters An optional map of parameters as defined in the Google * Tag Manager web interface. */ @Override public void execute(String functionName, Map<String, Object> parameters) { if (functionName.equals("myConfiguredFunctionName")) { // Process accordingly. } } });
カスタム更新期間の設定
現在のコンテナの経過時間が 12 時間を超えると、Google タグ マネージャー SDK は新しいコンテナの取得を試みます。カスタム コンテナ更新期間を設定するには、次の例のように Timer を使用します。
timer.scheduleTask(new TimerTask() { @Override public void run() { mContainer.refresh(); } }, delay, <new_period_in milliseconds>);
Logger によるデバッグ
Google タグマネージャ SDK は、デフォルトでエラーと警告をログに出力します。詳細なロギングを有効にすると、デバッグに役立ちます。この例のように、TagManager.setLogger を使用して独自の Logger を実装することで、詳細なロギングを有効にできます。
TagManager tagManager = TagManager.getInstance(this); tagManager.setLogger(new Logger() { final String TAG = "myGtmLogger"; // Log output with verbosity level of DEBUG. @Override public void d(String arg0) { Log.d(TAG, arg0); } // Log exceptions when provided. @Override public void d(String arg0, Throwable arg1) { Log.d(TAG, arg0); arg1.printStackTrace(); } // Rest of the unimplemented Logger methods. });
または、次の例のように、TagManager.getLogger().setLogLevel(LogLevel) を使用して既存の Logger の LogLevel を設定することもできます。
// Change the LogLevel to INFO to enable logging at INFO and higher levels. TagManager tagManager = TagManager.getInstance(this); tagManager.getLogger().setLogLevel(LogLevel.INFO);