이 개발자 가이드에서는 Google 태그 관리자를 사용할 수 있습니다.
소개
Google 태그 관리자를 사용하면 개발자가 구성을 변경할 수 있습니다. Google 태그 관리자를 이용하여 모바일 애플리케이션에서 애플리케이션 바이너리를 다시 빌드하고 앱에 다시 제출할 필요 없이 있습니다.
이는 구성 값을 관리하는 데 유용합니다. 나중에 변경해야 할 수도 있는 플래그 또는 플래그를 포함:
- 다양한 UI 설정 및 표시 문자열
- 애플리케이션에 게재되는 광고의 크기, 위치 또는 유형
- 게임 설정
구성 값은 런타임에 규칙을 사용하여 평가할 수도 있습니다. 동적 구성을 사용할 수 있습니다.
- 화면 크기를 사용하여 광고 배너 크기 결정
- 언어 및 위치를 사용하여 UI 요소 구성
또한 Google 태그 관리자를 이용하면 추적 태그를 동적으로 구현할 수 있습니다. 픽셀 등이 있습니다. 개발자는 중요한 이벤트를 데이터에 푸시하고 나중에 실행할 추적 태그 또는 픽셀을 결정합니다. 태그 관리자에서 현재 지원하는 태그는 다음과 같습니다.
- Google 모바일 앱 애널리틱스
- 맞춤 함수 호출 태그
시작하기 전에
이 시작 가이드를 사용하려면 다음 항목이 필요합니다.
- Google 태그 관리자 계정
- 새로운 태그 관리자 컨테이너 및 값 수집 매크로
- Google 태그 관리자를 구현할 수 있는 Android용 모바일 애플리케이션
- Google 애널리틱스 서비스 SDK를 설치합니다.
Google 태그 관리자를 처음 사용하는 경우에는 컨테이너, 매크로, 규칙에 대해 자세히 알아본 후 (고객센터) 이 가이드를 계속 진행하세요.
시작하기
이 섹션에서는 개발자에게 일반적인 태그 관리자 워크플로를 안내합니다.
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
)여야 합니다. kubectl 명령어
바이너리 파일을 다운로드한 경우에는 파일 이름에서 버전 접미사를 삭제해야 합니다.
올바른 이름 지정 규칙을 따르는지 확인하세요
바이너리 파일을 사용하는 것이 좋지만 컨테이너에 규칙이나 태그가 포함되어 있지 않다면
간단한
JSON
파일을 대신 사용하세요.
파일은 새 /assets/tagmanager
에 있어야 합니다.
Android 프로젝트의 폴더 안에 있으며 다음 이름 지정 규칙을 따라야 합니다.
<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에 값 푸시하기
데이터 레이어는 터치와 같은 앱에 대한 런타임 정보를 활성화하는 지도입니다. 태그 관리자 매크로 및 태그에서 사용할 수 있도록 하기 위해 있습니다
예를 들어 화면 조회수에 대한 정보를 데이터 영역 지도로 푸시하면 전환 픽셀을 실행하도록 태그 관리자 웹 인터페이스에서 태그를 설정할 수 있습니다. 화면 조회수에 대한 응답으로 통화를 추적하거나 앱에 직접 코딩할 수 있습니다.
이벤트는 push()
및
DataLayer.mapOf()
도우미 메서드:
// // 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 }
이제 웹 인터페이스에서 Google 애널리틱스 태그와 같은 태그를 만들 수 있습니다. 다음 규칙을 만들어 각 화면 조회에 대해 실행할 수 있습니다. 이(가) 'openScreen'과 같습니다. 화면 이름을 전달하는 방법 추가하려면 'screenName' 키를 누릅니다. 또한 태그를 만들어 (예: Google Ads 전환 픽셀)를 사용하여 특정 화면 조회에 대해서만 실행되도록 하려면 이(가) 'openScreen'과 같은 규칙 만들기 && 이(가) 'ConfirmationScreen'과 같습니다.
6. 미리보기 및 컨테이너 게시
매크로 값은 항상 현재 게시된 버전과 일치합니다. 최신 버전의 컨테이너를 게시하기 전에 미리 볼 수 있습니다. 임시 컨테이너에 있습니다
컨테이너를 미리 보려면 Google
태그 관리자 웹 인터페이스를 선택합니다.
선택한 다음 Preview
를 선택합니다. 잠시만 기다려 주세요
이 미리보기 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()
및 컨테이너를 여는 편리한 두 가지 메서드를 제공합니다.
ContainerOpener.openContainer(..., Notifier notifier)
및
ContainerOpener.openContainer(..., Long timeoutInMillis)
입니다.
이러한 각 메서드는 기본값이 아닌 값 또는 컨테이너 이미지를 새로 만들 수 있습니다
OpenType.PREFER_NON_DEFAULT
는 대부분의 애플리케이션에 권장되며
주어진 컨테이너 내에서 기본이 아닌 첫 번째 사용 가능한 컨테이너를 반환하려고 시도합니다.
디스크 또는 네트워크의 제한 시간(컨테이너가 더 크더라도)
합니다. 오래된 저장된 컨테이너를 반환하는 경우 최신 컨테이너에 대한 비동기 네트워크 요청도 실행합니다.
OpenType.PREFER_NON_DEFAULT
를 사용하는 경우
사용 가능한 다른 컨테이너가 없거나 제한 시간이
초과되었습니다.
OpenType.PREFER_FRESH
가 다음 위치에서 새 컨테이너를 반환하려고 시도합니다.
디스크 또는 네트워크를 모두
실행할 수 있습니다
네트워크가 외부 IP 주소 없이도
연결할 수 없거나 제한 시간이 초과되었습니다.
UI 플래그나 디스플레이 문자열과 같이 요청 시간이 길어질 경우 사용자 환경에 눈에 띄게 영향을 줄 수 있는 위치에서는 OpenType.PREFER_FRESH
를 사용하지 않는 것이 좋습니다. 또한
Container.refresh()
언제든지
네트워크 컨테이너 요청을 강제할 수 있습니다
이러한 편리한 메서드는 모두 비블로킹입니다.
ContainerOpener.openContainer(..., Long timeoutInMillis)
는
ContainerOpener.ContainerFuture
객체: 이 객체의 get
메서드가
로드되는 즉시 Container
(그때까지 차단됨)
ContainerOpener.openContainer(..., Notifier notifier)
메서드는 단일 콜백을 사용합니다.
컨테이너를 사용할 수 있을 때 호출되며
이는 기본 스레드 차단을 방지하는 데 사용할 수 있습니다.
두 메서드 모두 기본 제한 시간은 다음과 같습니다.
2000
밀리초
규칙을 사용하여 런타임에 매크로 평가하기
컨테이너는 규칙을 사용하여 런타임에 값을 평가할 수 있습니다. 규칙은 다음을 기반으로 합니다. 기기 언어, 플랫폼 또는 기타 매크로 값과 같은 기준을 충족해야 합니다. 대상 예를 들어 규칙을 사용하여 언어를 변경할 수 있습니다 이는 다음 규칙을 따릅니다.
그런 다음 각 언어에 대한 값 수집 매크로를 만들고 각 매크로에 규칙을 추가하여 적절한 언어 코드를 삽입합니다. 이 컨테이너가 게시된 후에는 애플리케이션에서 현지화된 디스플레이 옵션을 문자열에 쓸 수 있습니다.
기본 컨테이너에 규칙이 필요한 경우 바이너리 컨테이너 파일을 있습니다
바이너리 기본 컨테이너 파일
규칙이 필요한 기본 컨테이너는 바이너리 컨테이너 파일을 사용해야 합니다. JSON 대신 파일을 기본 컨테이너로 설정합니다. 바이너리 컨테이너는 컨테이너 이미지를 결정하는 데 매크로 값을 사용하는 대신 JSON 파일은 포함되지 않습니다.
Google 태그 관리자 웹에서 바이너리 컨테이너 파일을 다운로드할 수 있습니다.
인터페이스와
프로젝트의
/assets/tagmanager/
폴더를 열고 다음 패턴을 따릅니다.
/assets/tagmanager/GTM-XXXX
, 여기서 파일 이름은
있습니다.
JSON 파일이 바이너리 컨테이너 파일이 있는 경우 SDK는 바이너리 컨테이너를 사용합니다. 파일을 기본 컨테이너로 설정합니다.
함수 호출 매크로 사용
함수 호출 매크로는 지정할 수도 있습니다 함수 호출 매크로는 다음과 같은 Google 태그 관리자 규칙에 런타임 값을 통합할 수 있습니다. 구성된 기기 언어 및 통화를 지정할 수 있습니다.
함수 호출 매크로를 구성하는 방법은 다음과 같습니다.
- Google 태그 관리자 웹 인터페이스에서 함수 호출 매크로를 정의합니다. 인수는 키-값 쌍으로 구성할 수도 있습니다.
- 다음을 사용하여 애플리케이션에
FunctionCallMacroHandler
를 등록합니다.Container.registerFunctionCallMacroHandler()
및 구성한 함수 이름 Google 태그 관리자 웹 인터페이스에서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 태그 관리자 웹 인터페이스에서 함수 호출 태그를 정의합니다. 인수는 키-값 쌍으로 구성할 수도 있습니다.
- 다음을 사용하여 애플리케이션에 함수 호출 태그 핸들러를 등록합니다.
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. } } });
커스텀 새로고침 기간 설정
Google 태그 관리자 SDK는 현재 컨테이너의 경과 시간이 12시간을 초과하면 새 컨테이너를 가져오려고 시도합니다. 설정
커스텀 컨테이너 새로고침 기간을 늘리기 위해
Timer
가
다음 예를 참고하세요.
timer.scheduleTask(new TimerTask() { @Override public void run() { mContainer.refresh(); } }, delay, <new_period_in milliseconds>);
로거로 디버깅
Google 태그 관리자 SDK는 기본적으로 오류 및 경고를 로그에 출력합니다.
더 자세한 로깅을 사용 설정하면 디버깅에 도움이 될 수 있으며
다음을 사용하여 자체 Logger
구현
TagManager.setLogger
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)
,
예를 들면 다음과 같습니다.
// Change the LogLevel to INFO to enable logging at INFO and higher levels. TagManager tagManager = TagManager.getInstance(this); tagManager.getLogger().setLogLevel(LogLevel.INFO);