tagworks-sdk-v1-react 1.1.19 → 1.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +664 -138
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/tagworkssdkv1/DataBundleModule.kt +364 -365
- package/android/src/main/java/com/tagworkssdkv1/OnCmsBannerViewManager.kt +83 -0
- package/android/src/main/java/com/tagworkssdkv1/TagWorks.kt +37 -0
- package/android/src/main/java/com/tagworkssdkv1/TagWorksDeeplinkModule.kt +117 -0
- package/android/src/main/java/com/tagworkssdkv1/TagWorksModule.kt +402 -373
- package/android/src/main/java/com/tagworkssdkv1/TagWorksPopupModule.kt +56 -0
- package/android/src/main/java/com/tagworkssdkv1/TagworksSdkV1Package.kt +7 -2
- package/ios/OnCMSBannerViewManagerBridge.m +20 -0
- package/ios/OnCmsBannerViewManager.swift +134 -0
- package/ios/TagWorksDeeplinkModule.swift +64 -0
- package/ios/TagWorksDeeplinkModuleBridge.m +53 -0
- package/ios/TagWorksModule.swift +68 -18
- package/ios/TagWorksModuleBridge.m +15 -1
- package/ios/TagWorksPopupModule.swift +47 -0
- package/ios/TagWorksPopupModuleBridge.m +15 -0
- package/lib/commonjs/TagWorksDeeplink.js +48 -0
- package/lib/commonjs/TagWorksDeeplink.js.map +1 -0
- package/lib/commonjs/index.js +21 -7
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/TagWorksDeeplink.js +44 -0
- package/lib/module/TagWorksDeeplink.js.map +1 -0
- package/lib/module/index.js +11 -8
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/commonjs/babel.config.d.ts +2 -0
- package/lib/typescript/commonjs/babel.config.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TagWorksDeeplink.d.ts +23 -0
- package/lib/typescript/commonjs/src/TagWorksDeeplink.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +8 -2
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/module/babel.config.d.ts +2 -0
- package/lib/typescript/module/babel.config.d.ts.map +1 -0
- package/lib/typescript/module/src/TagWorksDeeplink.d.ts +23 -0
- package/lib/typescript/module/src/TagWorksDeeplink.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +8 -2
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/package.json +7 -4
- package/src/TagWorksDeeplink.js +45 -0
- package/src/{index.tsx → index.js} +11 -5
- package/tagworks-sdk-v1-react.podspec +9 -3
package/README.md
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
|
-
<img src="https://capsule-render.vercel.app/api?type=Waving&color=A2A4A2&height=150§ion=header&text=TagWorks-SDK-React-Native&fontSize=45" />
|
|
2
1
|
|
|
3
|
-
|
|
2
|
+
<div>
|
|
3
|
+
|
|
4
|
+
<br><br><br><br><br><br><br><br><br>
|
|
5
|
+
|
|
6
|
+
<p align="center">
|
|
7
|
+
<strong style="font-size: 40px;">TagWorks SDK React-Native</strong><br><br>
|
|
8
|
+
<span style="font-size: 24px;">개발자 메뉴얼</span><br><br>
|
|
9
|
+
<br><br>
|
|
10
|
+
ver. 1.1.21
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
© obzen Inc.<br>
|
|
19
|
+
All rights reserved.
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<br><br><br>
|
|
23
|
+
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<div style="page-break-after: always;"></div>
|
|
27
|
+
|
|
28
|
+

|
|
29
|
+
|
|
30
|
+

|
|
4
31
|

|
|
5
32
|

|
|
6
33
|

|
|
@@ -9,47 +36,89 @@
|
|
|
9
36
|
TagWorks SDK React Native Library
|
|
10
37
|
|
|
11
38
|
## 목차
|
|
12
|
-
- [
|
|
13
|
-
- [
|
|
14
|
-
- [
|
|
15
|
-
- [
|
|
16
|
-
|
|
17
|
-
- [초기화](
|
|
18
|
-
|
|
19
|
-
- [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- [Dimension
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
- [DataBundleModule
|
|
30
|
-
|
|
31
|
-
- [
|
|
32
|
-
- [
|
|
33
|
-
- [
|
|
39
|
+
- [Mobile Tag 수집](#mobile-tag-수집)
|
|
40
|
+
- [Requirements](#requirements)
|
|
41
|
+
- [Installation](#installation)
|
|
42
|
+
- [1. npm을 통한 설치](#1-npm을-통한-설치)
|
|
43
|
+
- [2. 직접 설치](#2-직접-설치)
|
|
44
|
+
- [SDK 초기화](#sdk-초기화)
|
|
45
|
+
- [🔹 OS별 초기화 방법 (iOS, Android)](#-os별-초기화-방법-ios-android)
|
|
46
|
+
- [iOS](#ios)
|
|
47
|
+
- [Android](#android)
|
|
48
|
+
- [🔹 사용자 설정](#-사용자-설정)
|
|
49
|
+
- [SDK 클래스 선언](#sdk-클래스-선언)
|
|
50
|
+
- [데이터 구성](#데이터-구성)
|
|
51
|
+
- [🔹 Dimension](#-dimension)
|
|
52
|
+
- [🔹 공용 Dimension](#-공용-dimension)
|
|
53
|
+
- [🔸 Dimension 추가](#-dimension-추가)
|
|
54
|
+
- [🔸 Dimension 가져오기](#-dimension-가져오기)
|
|
55
|
+
- [🔸 Dimension 삭제](#-dimension-삭제)
|
|
56
|
+
- [🔹 DataBundleModule](#-databundlemodule)
|
|
57
|
+
- [🔸 DataBundleModule 클래스의 key 값으로 사용 가능한 파라미터](#-databundlemodule-클래스의-key-값으로-사용-가능한-파라미터)
|
|
58
|
+
- [🔸 EVENT\_TAG\_NAME 에 대응하는 값으로 사용할 수 있는 Standard 태그](#-event_tag_name-에-대응하는-값으로-사용할-수-있는-standard-태그)
|
|
59
|
+
- [🔸 DataBundleModule 초기화](#-databundlemodule-초기화)
|
|
60
|
+
- [🔸 DataBundleModule 파라미터 설정](#-databundlemodule-파라미터-설정)
|
|
61
|
+
- [🔸 DataBundleModule 개별 디멘젼 설정](#-databundlemodule-개별-디멘젼-설정)
|
|
62
|
+
- [로그 전송](#로그-전송)
|
|
63
|
+
- [Web View 연동](#web-view-연동)
|
|
64
|
+
- [유입 경로 설정 (단순 URL 저장)](#유입-경로-설정-단순-url-저장)
|
|
65
|
+
- [Crash Error Report (앱 크래시 발생 시 크래시 로그 저장 및 발송)](#crash-error-report-앱-크래시-발생-시-크래시-로그-저장-및-발송)
|
|
66
|
+
- [메소드 파라미터 설명](#메소드-파라미터-설명)
|
|
67
|
+
- [InAppMessage](#inappmessage)
|
|
68
|
+
- [onCMS Popup](#oncms-popup)
|
|
69
|
+
- [onCMS Popup을 노출하기 위해 필요한 파라미터](#oncms-popup을-노출하기-위해-필요한-파라미터)
|
|
70
|
+
- [onCMS Banner](#oncms-banner)
|
|
71
|
+
- [onCMS Banner를 노출하기 위해 필요한 파라미터](#oncms-banner를-노출하기-위해-필요한-파라미터)
|
|
72
|
+
- [변수 선언](#변수-선언)
|
|
73
|
+
- [Banner View 영역 할당](#banner-view-영역-할당)
|
|
74
|
+
- [변수 값 할당](#변수-값-할당)
|
|
75
|
+
- [딥링크 서비스](#딥링크-서비스)
|
|
76
|
+
- [✅ TagWorks Deeplink Service는 다음과 같은 기능을 제공합니다.](#-tagworks-deeplink-service는-다음과-같은-기능을-제공합니다)
|
|
77
|
+
- [딥링크(Deferred 딥링크)](#딥링크deferred-딥링크)
|
|
78
|
+
- [딥링크 설정](#딥링크-설정)
|
|
79
|
+
- [🔹 iOS](#-ios)
|
|
80
|
+
- [1. 앱 내 스키마 등록 (App 프로젝트 설정)](#1-앱-내-스키마-등록-app-프로젝트-설정)
|
|
81
|
+
- [2. TagWorks SDK 초기화 설정 및 딥링크를 통해 앱이 실행 될 때 딥링크 URL 처리](#2-tagworks-sdk-초기화-설정-및-딥링크를-통해-앱이-실행-될-때-딥링크-url-처리)
|
|
82
|
+
- [3. 앱이 실행 중인 상태에서 딥링크 URL 처리](#3-앱이-실행-중인-상태에서-딥링크-url-처리)
|
|
83
|
+
- [🔹 Android](#-android)
|
|
84
|
+
- [1. 앱 내 스키마 등록 (App - AndroidManifest 설정)](#1-앱-내-스키마-등록-app---androidmanifest-설정)
|
|
85
|
+
- [2. TagWorksConfig 설정](#2-tagworksconfig-설정)
|
|
86
|
+
- [딥링크 처리 방법](#딥링크-처리-방법)
|
|
87
|
+
- [딥링크 처리 (handleDeeplinkUrl)](#딥링크-처리-handledeeplinkurl)
|
|
34
88
|
- [License](#license)
|
|
35
89
|
|
|
90
|
+
<br>
|
|
91
|
+
<div style="page-break-after: always;"></div>
|
|
92
|
+
|
|
93
|
+
# Mobile Tag 수집
|
|
94
|
+
|
|
95
|
+
- Mobile Platform에서 OBZEN TagManager의 로그 수집을 하기 위한 용도의 SDK
|
|
96
|
+
- Native 영역에서의 발생 로그 뿐만 아니라 Webview Interface 연결을 통한 웹뷰 로그도 함께 수집 가능합니다.
|
|
97
|
+
- 화면 전환 및 앱 상태 (백그라운드/포어그라운드) 전환 시 로그를 자동 수집하는 기능을 지원합니다.
|
|
98
|
+
- 앱 내에서 발생하는 크래시 로그도 자동으로 수집하는 기능을 지원합니다.
|
|
99
|
+
- onCMS 와의 연동을 통한 개별화 팝업 기능도 지원합니다.
|
|
100
|
+
|
|
36
101
|
<br>
|
|
37
102
|
<br>
|
|
38
103
|
|
|
39
104
|
## Requirements
|
|
40
105
|
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
- 최소
|
|
106
|
+
- react : 18.3.1
|
|
107
|
+
- react-native : 0.76.5
|
|
108
|
+
- 최소 iOS 지원 버전 : 9.0
|
|
109
|
+
- 최소 Android Sdk 버전 : API 16
|
|
110
|
+
- 최소 Jdk 버전 : 1.8
|
|
44
111
|
- Kotlin 버전 : 1.7.0
|
|
45
|
-
- Build Gradle 버전 : 7.
|
|
112
|
+
- Build Gradle 버전 : 7.2
|
|
46
113
|
|
|
47
114
|
<br>
|
|
48
115
|
<br>
|
|
49
116
|
|
|
50
|
-
|
|
117
|
+
## Installation
|
|
118
|
+
- React-Native에서 기본적으로 지원하는 npm을 이용한 package 설치를 지원합니다.
|
|
119
|
+
- https://www.npmjs.com 사이트에 접속 후 **tagworks-sdk-v1-react** 패키지를 검색하면 해당 패키지를 확인하실 수 있습니다.
|
|
51
120
|
|
|
52
|
-
|
|
121
|
+
### 1. npm을 통한 설치
|
|
53
122
|
|
|
54
123
|
- 해당 프로젝트의 루트 디렉토리에 설치
|
|
55
124
|
|
|
@@ -59,13 +128,18 @@ npm i tagworks-sdk-v1-react
|
|
|
59
128
|
|
|
60
129
|
- iOS Dependency 설치
|
|
61
130
|
|
|
62
|
-
|
|
131
|
+
- iOS 폴더로 이동 후 podfile을 통해 Dependency 설치
|
|
132
|
+
- 신규 버전 설치 시 Podfile.lock 파일 삭제 후 재설치 권장
|
|
133
|
+
- 혹시라도 pod install 시 오류가 발생한다면 podfile 파일을 열어서 target 설정 구문 위에 다음 문장을 추가합니다.<br>
|
|
134
|
+
<mark>use_frameworks! :linkage => :static</mark> <br>
|
|
135
|
+
- React-Native는 기본 설정이 정적 라이브러리로 설치가 되는데, TagWorks iOS SDK 라이브러리는 동적 프레임워크로 설치를 해야 하기 때문에 문법에 오류가 발생할 수 있음.
|
|
63
136
|
|
|
64
137
|
```sh
|
|
65
138
|
cd ios
|
|
66
|
-
pod install
|
|
139
|
+
pod install --repo-update
|
|
67
140
|
```
|
|
68
141
|
|
|
142
|
+
|
|
69
143
|
- Android Dependency 설치
|
|
70
144
|
|
|
71
145
|
Android Dependency는 Gradle을 통해 자동으로 설치되나, Dependency 연결을 위해 android 폴더 내부의 app/build.gradle 파일 내부 repositories에 maven 경로 추가
|
|
@@ -80,43 +154,37 @@ repositories {
|
|
|
80
154
|
|
|
81
155
|
<br>
|
|
82
156
|
|
|
83
|
-
|
|
157
|
+
### 2. 직접 설치
|
|
84
158
|
|
|
85
|
-
|
|
159
|
+
- 직접 파일로 설치하는 방식은 지원하지 않습니다.
|
|
160
|
+
- 각각의 iOS/Android OS별 Native SDK만을 설치하여 사용하고자 할 경우, 각 OS별 가이드 문서 참조 (개발팀 문의)
|
|
86
161
|
|
|
87
162
|
<br>
|
|
88
163
|
<br>
|
|
89
164
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
165
|
+
## SDK 초기화
|
|
166
|
+
- TagWorks SDK를 통해 로그 수집 및 기타 기능들을 이용하기 위해서는 SDK 초기화가 우선적으로 필요합니다.
|
|
167
|
+
- 필수 설정들이 이루어지지 않은 경우, 기능이 정상적으로 동작하지 않을 수 있습니다.
|
|
168
|
+
- SDK 초기화 시점은 앱이 실행될 때 처음으로 호출되는 메서드 최상단에서 이루어져야 합니다.
|
|
169
|
+
- TagWorks SDK 초기화 하기 위해 다음과 같은 SDK 설정값들을 지정합니다.
|
|
170
|
+
- TagWorks SDK 초기화 방법은 아래의 OS별 초기화 방법을 참고하세요.
|
|
171
|
+
- TagWorks SDK는 **싱글톤 클래스**로 유지 되기 때문에 최초 초기화 한번으로 전역에서 호출 가능합니다.
|
|
94
172
|
|
|
95
|
-
> **JavaScript**
|
|
96
|
-
```js
|
|
97
|
-
import { NativeModules } from 'react-native';
|
|
98
|
-
...
|
|
99
|
-
const { TagWorksModule, DataBundleModule, StandardEventModule } = NativeModules;
|
|
100
|
-
```
|
|
101
173
|
<br>
|
|
102
174
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
|
|
|
114
|
-
|
|
|
115
|
-
|
|
|
116
|
-
| appVersion | string | null | Application 버전 정보, 설정하지 않을 경우 내부 Application 버전 정보 전송 |
|
|
117
|
-
| appName | string | null | Application 이름, 설정하지 않을 경우 내부 Application 이름 전송 |
|
|
118
|
-
| isUseDynamicParameter | boolean | false | Dimension 동적 파라미터 사용 여부 (기본값 : false) |
|
|
119
|
-
|
|
|
175
|
+
| 옵션 | 타입 | 기본값 | 설명 |
|
|
176
|
+
| ------------------ | ------- | ----- | -------------------------------------------------------- |
|
|
177
|
+
| siteId | string | null | 행동 정보 수집 대상 사이트 식별자 |
|
|
178
|
+
| baseUrl | string | null | 행동 정보 데이터 수집 서버 url 주소 |
|
|
179
|
+
| isUseIntervals | boolean | false | interval 사용 여부, false 일 경우 dispatchInterval 값이 무시되고 항상 즉시 발송된다. |
|
|
180
|
+
| dispatchInterval | long | 3 | 행동 정보 데이터 발송 주기 (초단위, <b>최소 3초, 최대 10초 설정) |
|
|
181
|
+
| sessionTimeOut | long | 5 | 행동 정보 데이터 수집 서버의 연결 대기 시간 (초단위, <b>최소 3초, 최대 60초 설정) |
|
|
182
|
+
| isManualDispatch | boolean | false | 행동 정보 데이터 수동 발송 여부 |
|
|
183
|
+
| appVersion | string | null | Application 버전 정보, 설정하지 않을 경우 내부 Application 버전 정보 전송 |
|
|
184
|
+
| appName | string | null | Application 이름, 설정하지 않을 경우 내부 Application 이름 전송 |
|
|
185
|
+
| isUseDynamicParameter | boolean | false | Dimension 동적 파라미터 사용 여부 (기본값 : false) |
|
|
186
|
+
| deeplinkServerUrl | string | null | 딥링크 서비스를 사용하기 위한 Bridge 서버 URL |
|
|
187
|
+
| |
|
|
120
188
|
|
|
121
189
|
- **siteId** 및 **baseUrl** 을 설정하지 않는 경우 SDK 초기화 과정에서 오류가 발생합니다.
|
|
122
190
|
- **isUseIntervals** 값을 false로 설정할 경우에는 dispatchInterval 값이 무시되고 항상 즉시 발송됩니다. <br>true로 설정할 경우에는 dispatchInterval 값에 지정된 초를 주기로 데이터를 발송합니다.
|
|
@@ -124,42 +192,147 @@ const { TagWorksModule, DataBundleModule, StandardEventModule } = NativeModules;
|
|
|
124
192
|
- isManualDispatch 값을 true 로 설정한 경우에는, 명시적으로 dispatch() 함수를 호출해야만 태깅 로그가 발송됩니다.
|
|
125
193
|
- **isUseDynamicParameter** 값을 true로 설정할 경우 Dimension의 key값을 문자형으로 사용하고, false로 설정할 경우 key값을 정수형으로 사용해야 합니다.
|
|
126
194
|
- **isUseDynamicParameter** 에 <span style="color:rgb(223, 95, 56)">설정한 값에 따른 해당 메소드와는 다른 Dimension 메소드를 사용 시 데이터가 올바르게 전송되지 않을 수 있습니다.</span>
|
|
127
|
-
-
|
|
128
|
-
|
|
129
|
-
|
|
195
|
+
- **deeplinkServerUrl** 은 딥링크 서비스 이용 시 디퍼드 딥링크 사용을 하기 위해 설정한 서버 URL 입니다.
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
<br>
|
|
130
199
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
200
|
+
### 🔹 OS별 초기화 방법 (iOS, Android)
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
### iOS
|
|
204
|
+
- 딥링크 및 자동 수집 기능을 사용하기 위해 **AppDelegate**의 **application(_:,didFinishLaunchingWithOptions:)** 메서드 최상단에서 초기화 메서드를 호출합니다.
|
|
205
|
+
- WebView Interface 설정이 포함되어 있기 때문에 WebKit.h 헤더의 import 구문이 필요합니다.
|
|
206
|
+
|
|
207
|
+
<br>
|
|
208
|
+
|
|
209
|
+
> Objective-C
|
|
210
|
+
|
|
211
|
+
```objc
|
|
212
|
+
#import <WebKit/WebKit.h>
|
|
213
|
+
#import "TagWorks_SDK_iOS-Swift.h"
|
|
214
|
+
|
|
215
|
+
@implementation AppDelegate
|
|
216
|
+
|
|
217
|
+
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
|
218
|
+
{
|
|
219
|
+
...
|
|
220
|
+
// #.TagWorks instance 설정
|
|
221
|
+
TagWorks *sharedInstance = [TagWorks sharedInstance];
|
|
222
|
+
[sharedInstance setInstanceConfigWithSiteId:@"00,XXXXXXXX"
|
|
223
|
+
baseUrl:[NSURL URLWithString:@"로그 수집 Proxy 서버 URL"]
|
|
224
|
+
isUseIntervals:YES
|
|
225
|
+
dispatchIntervalWithSeconds:1
|
|
226
|
+
sessionTimeOutWithSeconds:5
|
|
227
|
+
isManualDispatch:NO
|
|
228
|
+
appVersion:nil
|
|
229
|
+
appName:nil
|
|
230
|
+
isUseDynamicParameter:YES
|
|
231
|
+
isEnabledAdId:NO
|
|
232
|
+
deeplinkServerUrl:[NSURL URLWithString:@"딥링크 Bridge 서버 URL"]];
|
|
233
|
+
|
|
234
|
+
// #.딥링크로 앱이 실행될 때 실행 파라미터 전달
|
|
235
|
+
NSURL *launchUrl = launchOptions[UIApplicationLaunchOptionsURLKey];
|
|
236
|
+
if (launchUrl != nil) {
|
|
237
|
+
[[TagWorks sharedInstance] launchWithOptionsWithUrl:launchUrl userInfo:nil];
|
|
238
|
+
}
|
|
239
|
+
...
|
|
240
|
+
}
|
|
144
241
|
```
|
|
145
242
|
|
|
146
|
-
|
|
243
|
+
### Android
|
|
244
|
+
|
|
245
|
+
- 딥링크 및 자동 수집 기능을 사용하기 위해 **MainApplication**의 **onCreat()** 메서드 최상단에서 초기화 메서드를 호출합니다.
|
|
246
|
+
|
|
247
|
+
<br>
|
|
248
|
+
|
|
249
|
+
> JAVA
|
|
250
|
+
|
|
251
|
+
```java
|
|
252
|
+
import com.tagworkssdkv1.TagWorks;
|
|
147
253
|
|
|
148
|
-
|
|
254
|
+
public class MainApplication extends Application implements ReactApplication {
|
|
149
255
|
|
|
256
|
+
@Override
|
|
257
|
+
public void onCreate() {
|
|
258
|
+
super.onCreate();
|
|
259
|
+
...
|
|
260
|
+
|
|
261
|
+
TagWorks.initializeTagWorks(
|
|
262
|
+
this, // ApplicationContext 전달
|
|
263
|
+
"00,XXXXXXXX",
|
|
264
|
+
"로그 수집 Proxy 서버 URL",
|
|
265
|
+
true,
|
|
266
|
+
1,
|
|
267
|
+
5,
|
|
268
|
+
false,
|
|
269
|
+
null,
|
|
270
|
+
null,
|
|
271
|
+
true,
|
|
272
|
+
"딥링크 Bridge 서버 URL"
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
...
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
> Kotlin
|
|
281
|
+
|
|
282
|
+
```kotlin
|
|
283
|
+
import com.tagworkssdkv1.TagWorks
|
|
284
|
+
|
|
285
|
+
class MainApplication : Application(), ReactApplication {
|
|
286
|
+
|
|
287
|
+
override fun onCreate() {
|
|
288
|
+
super.onCreate()
|
|
289
|
+
...
|
|
290
|
+
|
|
291
|
+
TagWorks.initializeTagWorks(
|
|
292
|
+
context = this, // ApplicationContext 전달
|
|
293
|
+
siteId = "00,XXXXXXXX",
|
|
294
|
+
baseUrl = "로그 수집 Proxy 서버 URL",
|
|
295
|
+
isUseIntervals = true,
|
|
296
|
+
dispatchInterval = 1,
|
|
297
|
+
sessionTimeout = 5,
|
|
298
|
+
isManualDispatch = false,
|
|
299
|
+
appVersion = null,
|
|
300
|
+
appName = null,
|
|
301
|
+
isUseDynamicParameter = true,
|
|
302
|
+
deeplinkServerUrl = "딥링크 Bridge 서버 URL"
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
...
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
<br>
|
|
310
|
+
|
|
311
|
+
### 🔹 사용자 설정
|
|
150
312
|
- TagWorks SDK 초기화 이후 TagWorksModule 클래스를 통해 행동 데이터 수집 대상이 되는 사용자를 설정하고 수집 여부를 지정합니다.
|
|
313
|
+
- **⚠️ userId 설정 시 주의 사항**
|
|
314
|
+
- <span style="color: #ff0000">SDK 초기화 시점에 TagWorksModule.setUserId(null) 로 초기화 합니다. </span>
|
|
315
|
+
- <span style="color: #ff0000">사용자가 로그인 시점에 userId를 설정 후 로그 아웃 시점에 setUserId(null) 로 초기화 합니다. </span>
|
|
316
|
+
- <span style="color: #ff0000">앱이 백그라운드로 진입 후 앱이 다시 활성화가 된 경우, 로그인 세션 체크 후 로그아웃 상태라면 setUserId(null) 로 초기화 합니다. </span>
|
|
151
317
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
|
155
|
-
|
|
|
156
|
-
|
|
|
157
|
-
|
|
|
318
|
+
<br>
|
|
319
|
+
|
|
320
|
+
| 옵션 | 타입 | 기본값 | 설명 |
|
|
321
|
+
| ---------------- | ------- | -------- | -------------------------------------------------------- |
|
|
322
|
+
| userId | string | null | 수집 대상 고객 식별자 (사용자 계정) |
|
|
323
|
+
| adId | string | null | 수집 대상 광고 식별자 |
|
|
324
|
+
| optOut | boolean | false | 행동 정보 데이터 수집 여부 (true로 지정하면 수집하지 않음) |
|
|
325
|
+
| autoTrackingPage | boolean | true | 화면 전환 시 페이지뷰 로그 자동 수집 여부 (true - 자동 수집, false - 자동 수집 안함) |
|
|
326
|
+
| logLevel | int | 4 | 출력할 SDK 로그 레벨 설정 (2: VERBOSE, 3: DEBUG, 4: INFO, 5: WARN, 6: ERROR) |
|
|
158
327
|
|
|
159
328
|
<br/>
|
|
160
329
|
|
|
161
330
|
> **JavaScript**
|
|
162
331
|
```js
|
|
332
|
+
// 수집 대상자 고객 식별자 지정
|
|
333
|
+
// 고객 로그인 완료에 따라 수집 대상자 고객 식별자를 지정합니다.
|
|
334
|
+
TagWorksModule.setUserId(loginId);
|
|
335
|
+
|
|
163
336
|
// SDK 디버그 용도 로그 출력
|
|
164
337
|
TagWorksModule.setLogLevel(3);
|
|
165
338
|
|
|
@@ -168,21 +341,36 @@ TagWorksModule.setLogLevel(3);
|
|
|
168
341
|
// 태깅 로그 전송 제어 용도로도 사용 가능합니다.
|
|
169
342
|
TagWorksModule.setOptOut(false);
|
|
170
343
|
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
TagWorksModule.setUserId(loginId);
|
|
344
|
+
// 화면 이동시 로그 자동 수집 여부 설정
|
|
345
|
+
TagWorksModule.setAutoTrackingPage(true);
|
|
174
346
|
|
|
175
|
-
// 수집 대상자 광고 식별자 지정
|
|
347
|
+
// 수집 대상자 광고 식별자 지정 (기본적으로 가져오도록 설정됨.)
|
|
176
348
|
TagWorksModule.setAdId("광고식별자 UUID");
|
|
177
349
|
```
|
|
178
350
|
|
|
179
351
|
<br>
|
|
352
|
+
|
|
353
|
+
## SDK 클래스 선언
|
|
354
|
+
- TagWorks SDK 사용을 위해 다음과 같이 import 및 클래스를 선언합니다.
|
|
355
|
+
- SDK 모듈들과 딥링크, omCMS 연동 팝업/배너를 사용하기 위한 클래스들을 import 합니다. (`OnCmsBannerView` 포함)
|
|
356
|
+
- NativeModules를 이용하여 SDK 모듈들의 클래스들을 선언해줍니다.
|
|
357
|
+
|
|
180
358
|
<br>
|
|
181
359
|
|
|
182
|
-
|
|
183
|
-
|
|
360
|
+
> **JavaScript**
|
|
361
|
+
```js
|
|
362
|
+
import { NativeModules, Linking, NativeEventEmitter } from 'react-native';
|
|
363
|
+
import { OnCmsBannerView, TagWorksDeeplink } from 'tagworks-sdk-v1-react';
|
|
364
|
+
...
|
|
365
|
+
const { TagWorksModule, DataBundleModule, StandardEventModule, TagWorksPopupModule, TagWorksDeeplinkModule } = NativeModules;
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
<br>
|
|
184
369
|
|
|
185
|
-
##
|
|
370
|
+
## 데이터 구성
|
|
371
|
+
- 서버로 전송할 태그 정의 데이터를 구성합니다.
|
|
372
|
+
|
|
373
|
+
### 🔹 Dimension
|
|
186
374
|
|
|
187
375
|
- 디멘젼은 Tagworks SDK를 통해 로그 발송 시 사용자 행동 정보를 수집하는 데이터 정보입니다.
|
|
188
376
|
- <span style="color: #6ba455">공용 디멘젼</span>은 한번 설정하면 일반 디멘젼과 함께 로그 발송 시 전달이 되며, TagWorks SDK 인스턴스에 할당이 되어 삭제를 하지 않는 한 계속 정보를 가지고 있습니다.
|
|
@@ -196,7 +384,7 @@ TagWorksModule.setAdId("광고식별자 UUID");
|
|
|
196
384
|
|
|
197
385
|
<br/>
|
|
198
386
|
|
|
199
|
-
|
|
387
|
+
### 🔹 공용 Dimension
|
|
200
388
|
|
|
201
389
|
- 공용 Dimension은 수집 로그 전송 시 공통적으로 전송해야 할 데이터를 설정하는 용도로 사용합니다.
|
|
202
390
|
- 공용 Dimension에서 사용된 index에 다른 Dimension을 덮어쓰지 않는 이상 한 번 설정된 공용 Dimension은 계속 유지됩니다.
|
|
@@ -205,9 +393,9 @@ TagWorksModule.setAdId("광고식별자 UUID");
|
|
|
205
393
|
|
|
206
394
|
<br/>
|
|
207
395
|
|
|
208
|
-
|
|
396
|
+
#### 🔸 Dimension 추가
|
|
209
397
|
|
|
210
|
-
> **
|
|
398
|
+
> **JavaScript**
|
|
211
399
|
```js
|
|
212
400
|
//
|
|
213
401
|
// # Set
|
|
@@ -232,7 +420,7 @@ TagWorksModule.setDynamicCommonDimensionWithString("사용자행동01", '설정
|
|
|
232
420
|
TagWorksModule.setDynamicCommonDimensionWithDouble("사용자행동02", 10000.0);
|
|
233
421
|
```
|
|
234
422
|
|
|
235
|
-
|
|
423
|
+
#### 🔸 Dimension 가져오기
|
|
236
424
|
|
|
237
425
|
```js
|
|
238
426
|
//
|
|
@@ -241,22 +429,22 @@ TagWorksModule.setDynamicCommonDimensionWithDouble("사용자행동02", 10000.0)
|
|
|
241
429
|
|
|
242
430
|
// 타입별로 index 키를 가지고 해당 값을 리턴
|
|
243
431
|
// - return : String or Double
|
|
244
|
-
TagWorksModule.getCommonDimensionWithString(1, (value
|
|
432
|
+
TagWorksModule.getCommonDimensionWithString(1, (value) => {
|
|
245
433
|
console.log(value);
|
|
246
434
|
});
|
|
247
|
-
TagWorksModule.getCommonDimensionWithDouble(2, (value
|
|
435
|
+
TagWorksModule.getCommonDimensionWithDouble(2, (value) => {
|
|
248
436
|
console.log(value);
|
|
249
437
|
});
|
|
250
438
|
|
|
251
439
|
// GeneralType(String)과 FactType(Double) 별로 리턴
|
|
252
440
|
// - return : JSONString
|
|
253
|
-
TagWorksModule.getCommonDimensions((jsonString
|
|
441
|
+
TagWorksModule.getCommonDimensions((jsonString) => {
|
|
254
442
|
console.log('Received CommonDimensions String:', jsonString);
|
|
255
443
|
});
|
|
256
444
|
|
|
257
445
|
// 공용 Dimension 정보를 가지고 있는 Array의 Index 순으로 리턴
|
|
258
446
|
// - return : JSONString
|
|
259
|
-
TagWorksModule.getCommonDimensionsOfArrayIndex((jsonString
|
|
447
|
+
TagWorksModule.getCommonDimensionsOfArrayIndex((jsonString) => {
|
|
260
448
|
// JSON 문자열을 객체로 파싱
|
|
261
449
|
const parsedData = JSON.parse(jsonString);
|
|
262
450
|
console.log('Received Dimensions ArrayIndex String:', parsedData);
|
|
@@ -270,26 +458,26 @@ TagWorksModule.getCommonDimensionsOfArrayIndex((jsonString: any) => {
|
|
|
270
458
|
|
|
271
459
|
// key 값을 가지고 해당 값을 리턴
|
|
272
460
|
// - return : String or Double
|
|
273
|
-
TagWorksModule.getDynamicCommonDimension("사용자행동01", (value
|
|
461
|
+
TagWorksModule.getDynamicCommonDimension("사용자행동01", (value) => {
|
|
274
462
|
console.log(value);
|
|
275
463
|
});
|
|
276
464
|
|
|
277
465
|
// key 값 별로 리턴
|
|
278
466
|
// - return : JSONString
|
|
279
|
-
TagWorksModule.getDynamicCommonDimensions((jsonString
|
|
467
|
+
TagWorksModule.getDynamicCommonDimensions((jsonString) => {
|
|
280
468
|
console.log('Received CommonDimensions String:', jsonString);
|
|
281
469
|
});
|
|
282
470
|
|
|
283
471
|
// 공용 Dimension 정보를 가지고 있는 Array의 Index 순으로 리턴
|
|
284
472
|
// - return : JSONString
|
|
285
|
-
TagWorksModule.getDynamicCommonDimensionsOfArrayIndex((jsonString
|
|
473
|
+
TagWorksModule.getDynamicCommonDimensionsOfArrayIndex((jsonString) => {
|
|
286
474
|
// JSON 문자열을 객체로 파싱
|
|
287
475
|
const parsedData = JSON.parse(jsonString);
|
|
288
476
|
console.log('Received Dimensions ArrayIndex String:', parsedData);
|
|
289
477
|
});
|
|
290
478
|
```
|
|
291
479
|
|
|
292
|
-
|
|
480
|
+
#### 🔸 Dimension 삭제
|
|
293
481
|
|
|
294
482
|
```js
|
|
295
483
|
//
|
|
@@ -324,7 +512,7 @@ TagWorksModule.removeAllDynamicCommonDimension();
|
|
|
324
512
|
|
|
325
513
|
<br/>
|
|
326
514
|
|
|
327
|
-
|
|
515
|
+
### 🔹 DataBundleModule
|
|
328
516
|
- 수집 로그 전송을 하기 위해 필요한 정보들을 담는 클래스로 기본 파라미터 및 Dimension 정보를 쉽게 관리할 수 있습니다.
|
|
329
517
|
- DataBundleModule 클래스는 key와 value의 집합으로 구성된 컨테이너입니다.
|
|
330
518
|
- 태그명 Key에 대응하는 값으로는 DataBundle 클래스가 제공하는 기본 태그 값을 사용하거나, 사용자 정의 String 값을 직접 입력할 수 있습니다.
|
|
@@ -333,7 +521,7 @@ TagWorksModule.removeAllDynamicCommonDimension();
|
|
|
333
521
|
|
|
334
522
|
<br/>
|
|
335
523
|
|
|
336
|
-
|
|
524
|
+
#### 🔸 DataBundleModule 클래스의 key 값으로 사용 가능한 파라미터
|
|
337
525
|
|
|
338
526
|
| 파라미터 (키) | 타입 | 설명 |
|
|
339
527
|
| -------------------------------| ------ | ---------------------------------------- |
|
|
@@ -346,7 +534,7 @@ TagWorksModule.removeAllDynamicCommonDimension();
|
|
|
346
534
|
|
|
347
535
|
<br/>
|
|
348
536
|
|
|
349
|
-
|
|
537
|
+
#### 🔸 <span style="color: #6ba455">EVENT_TAG_NAME</span> 에 대응하는 값으로 사용할 수 있는 Standard 태그
|
|
350
538
|
|
|
351
539
|
| EVENT_TAG_NAME | 설명 |
|
|
352
540
|
| -------------- | -------------------- |
|
|
@@ -362,7 +550,7 @@ TagWorksModule.removeAllDynamicCommonDimension();
|
|
|
362
550
|
|
|
363
551
|
<br/>
|
|
364
552
|
|
|
365
|
-
|
|
553
|
+
#### 🔸 DataBundleModule 초기화
|
|
366
554
|
|
|
367
555
|
> **JavaScript**
|
|
368
556
|
|
|
@@ -377,7 +565,7 @@ DataBundleModule.initDataBundle(bundleString);
|
|
|
377
565
|
|
|
378
566
|
<br>
|
|
379
567
|
|
|
380
|
-
|
|
568
|
+
#### 🔸 DataBundleModule 파라미터 설정
|
|
381
569
|
|
|
382
570
|
> **JavaScript**
|
|
383
571
|
|
|
@@ -396,9 +584,9 @@ DataBundleModule.putString(DataBundleModule.EVENT_TAG_PARAM_CUSTOM_PATH, "/사
|
|
|
396
584
|
|
|
397
585
|
<br>
|
|
398
586
|
|
|
399
|
-
|
|
587
|
+
#### 🔸 DataBundleModule 개별 디멘젼 설정
|
|
400
588
|
|
|
401
|
-
> **
|
|
589
|
+
> **JavaScript**
|
|
402
590
|
```js
|
|
403
591
|
//
|
|
404
592
|
// # Set
|
|
@@ -430,22 +618,22 @@ DataBundleModule.putDynamicDimensionWithDouble("사용자행동02", 10000.0);
|
|
|
430
618
|
|
|
431
619
|
// 타입별로 index 키를 가지고 해당 값을 리턴
|
|
432
620
|
// - return : String or Double
|
|
433
|
-
DataBundleModule.getDimensionWithString(1, (value
|
|
621
|
+
DataBundleModule.getDimensionWithString(1, (value) => {
|
|
434
622
|
console.log(value);
|
|
435
623
|
});
|
|
436
|
-
DataBundleModule.getDimensionWithDouble(2, (value
|
|
624
|
+
DataBundleModule.getDimensionWithDouble(2, (value) => {
|
|
437
625
|
console.log(value);
|
|
438
626
|
});
|
|
439
627
|
|
|
440
628
|
// GeneralType(String)과 FactType(Double) 별로 리턴
|
|
441
629
|
// - return : JSONString
|
|
442
|
-
DataBundleModule.getDimensions((jsonString
|
|
630
|
+
DataBundleModule.getDimensions((jsonString) => {
|
|
443
631
|
console.log('Received DataBundle Dimensions String:', jsonString);
|
|
444
632
|
});
|
|
445
633
|
|
|
446
634
|
// 개별 Dimension 정보를 가지고 있는 Array의 Index 순으로 리턴
|
|
447
635
|
// - return : JSONString
|
|
448
|
-
DataBundleModule.getDimensionsOfArrayIndex((jsonString
|
|
636
|
+
DataBundleModule.getDimensionsOfArrayIndex((jsonString) => {
|
|
449
637
|
// JSON 문자열을 객체로 파싱
|
|
450
638
|
const parsedData = JSON.parse(jsonString);
|
|
451
639
|
console.log('Received DataBundle Dimensions ArrayIndex String:', parsedData);
|
|
@@ -459,19 +647,19 @@ DataBundleModule.getDimensionsOfArrayIndex((jsonString: any) => {
|
|
|
459
647
|
|
|
460
648
|
// key 값을 가지고 해당 값을 리턴
|
|
461
649
|
// - return : String or Double
|
|
462
|
-
DataBundleModule.getDynamicDimension("사용자행동01", (value
|
|
650
|
+
DataBundleModule.getDynamicDimension("사용자행동01", (value) => {
|
|
463
651
|
console.log(value);
|
|
464
652
|
});
|
|
465
653
|
|
|
466
654
|
// key 값 별로 리턴
|
|
467
655
|
// - return : JSONString
|
|
468
|
-
DataBundleModule.getDynamicDimensions((jsonString
|
|
656
|
+
DataBundleModule.getDynamicDimensions((jsonString) => {
|
|
469
657
|
console.log('Received DataBundle Dimensions String:', jsonString);
|
|
470
658
|
});
|
|
471
659
|
|
|
472
660
|
// 개별 Dimension 정보를 가지고 있는 Array의 Index 순으로 리턴
|
|
473
661
|
// - return : JSONString
|
|
474
|
-
DataBundleModule.getDynamicDimensionsOfArrayIndex((jsonString
|
|
662
|
+
DataBundleModule.getDynamicDimensionsOfArrayIndex((jsonString) => {
|
|
475
663
|
// JSON 문자열을 객체로 파싱
|
|
476
664
|
const parsedData = JSON.parse(jsonString);
|
|
477
665
|
console.log('Received DataBundle Dimensions ArrayIndex String:', parsedData);
|
|
@@ -511,7 +699,7 @@ DataBundleModule.removeAllDynamicDimension();
|
|
|
511
699
|
<br>
|
|
512
700
|
<br>
|
|
513
701
|
|
|
514
|
-
|
|
702
|
+
## 로그 전송
|
|
515
703
|
|
|
516
704
|
- logEvent() 함수를 호출하여 로그를 전송합니다.
|
|
517
705
|
- 로그 타입에는 페이지뷰 태그, 사용자 태그 두 가지 타입이 존재합니다.
|
|
@@ -523,12 +711,12 @@ DataBundleModule.removeAllDynamicDimension();
|
|
|
523
711
|
|
|
524
712
|
<br>
|
|
525
713
|
|
|
526
|
-
>**
|
|
714
|
+
>**JavaScript**
|
|
527
715
|
```js
|
|
528
|
-
DataBundleModule.getDataBundle((bundleString
|
|
716
|
+
DataBundleModule.getDataBundle((bundleString) => {
|
|
529
717
|
console.log('Received Dictionary String:', bundleString);
|
|
530
718
|
|
|
531
|
-
TagWorksModule.logEvent(TagWorksModule.EVENT_TYPE_PAGE, bundleString, (result
|
|
719
|
+
TagWorksModule.logEvent(TagWorksModule.EVENT_TYPE_PAGE, bundleString, (result) => {
|
|
532
720
|
console.log(result)
|
|
533
721
|
});
|
|
534
722
|
});
|
|
@@ -537,7 +725,7 @@ DataBundleModule.getDataBundle((bundleString: any) => {
|
|
|
537
725
|
<br>
|
|
538
726
|
<br>
|
|
539
727
|
|
|
540
|
-
|
|
728
|
+
## Web View 연동
|
|
541
729
|
|
|
542
730
|
- Web / App 연동을 위한 interface 를 제공합니다.
|
|
543
731
|
- 앱에서 Tag Manager Code Snippet 이 포함된 웹뷰를 실행하면, 웹뷰에서 발생된 태깅 로그는 SDK를 통하여 앱으로 전송됩니다.
|
|
@@ -545,33 +733,371 @@ DataBundleModule.getDataBundle((bundleString: any) => {
|
|
|
545
733
|
- 로그인 시 사용자 맵핑을 위해 로그인 시점에 userId 설정하는 부분과 App에서 설정한 Dimension 값을 WebView에서 사용하기 위해 쿠키를<br>
|
|
546
734
|
설정하는 부분에 있어 부분적인 대응 개발이 필요할 수 있습니다.
|
|
547
735
|
|
|
548
|
-
|
|
736
|
+
> **JavaScript**
|
|
549
737
|
```js
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
738
|
+
<WebView
|
|
739
|
+
...
|
|
740
|
+
injectedJavaScript={`
|
|
741
|
+
window.__TAGWORKS_SDK_READY = true;
|
|
742
|
+
true; // <- 이건 iOS에서 필요 (스크립트가 유효한 값을 반환해야 주입 성공으로 인식됨)
|
|
743
|
+
`}
|
|
744
|
+
javaScriptEnabled={true} // JavaScript 활성화
|
|
745
|
+
onMessage={(event) => {
|
|
746
|
+
const message = event.nativeEvent.data;
|
|
747
|
+
console.log("Received message: ", message);
|
|
748
|
+
TagWorksModule.webInterfaceDidReceive(message);
|
|
749
|
+
}}
|
|
750
|
+
/>
|
|
558
751
|
```
|
|
559
752
|
|
|
560
753
|
<br>
|
|
754
|
+
|
|
755
|
+
## 유입 경로 설정 (단순 URL 저장)
|
|
756
|
+
|
|
757
|
+
- Referrer 정보가 포함되어 있는 스키마 URL로 부터 앱이 실행이 된 경우, 해당 스키마 URL 정보를 서버로 수집이 가능합니다.
|
|
758
|
+
- 앱에서 해당 URL 정보를 받아오는 메서드 내부에 다음과 같은 TagWorks SDK 인터페이스를 호출합니다.
|
|
759
|
+
|
|
760
|
+
> **JavaScript**
|
|
761
|
+
|
|
762
|
+
```js
|
|
763
|
+
TagWorksModule.sendReferrerEventWithOpenUrlString("<referrer url>");
|
|
764
|
+
```
|
|
765
|
+
|
|
561
766
|
<br>
|
|
562
767
|
|
|
563
|
-
|
|
768
|
+
## Crash Error Report (앱 크래시 발생 시 크래시 로그 저장 및 발송)
|
|
769
|
+
|
|
770
|
+
- <mark>SDK에서는 기본적으로 Native 앱 크래시 로그를 수집합니다.**(React-Native는 RSoD 상태로 수집 불가)**</mark>
|
|
771
|
+
- 수동으로 앱 크래시 로그를 수집 서버로 전송하고 싶은 경우에 해당 인터페이스를 사용합니다.
|
|
772
|
+
- 앱에서 크래시(비정상종료) 발생 시 앱 내 catch() 구문이 실행 된 경우, 해당 메소드를 통해 크래시 로그를 로컬에 저장합니다.
|
|
773
|
+
- 앱이 재실행되면서 SDK 초기화 메소드가 호출되는 시점에 로컬에 저장되어 있는 크래시 로그를 SDK에서 자동으로 수집 서버로 전송합니다.
|
|
774
|
+
- 현재 해당 기능은 DataBundle의 커스텀 디멘젼을 이용해 발송하기 때문에 동적 파라미터를 설정해서 사용을 하는 경우, <mark>TagManager -> 수집 항목 -> SDK 에서 항목 추가</mark>를 통해 다음 세가지 컬럼을 추가하여야만 해당 로그를 확인할 수 있습니다.
|
|
775
|
+
- obz_err_type (에러 구분 코드)
|
|
776
|
+
- obz_err_data (에러 메세지)
|
|
777
|
+
- obz_err_time (에러 발생 시간 (KST))
|
|
778
|
+
|
|
779
|
+
### 메소드 파라미터 설명
|
|
564
780
|
|
|
565
|
-
|
|
566
|
-
|
|
781
|
+
| 파라미터 | 타입 | 설명 |
|
|
782
|
+
| --------------- | ------ | --------------------------------------------------------- |
|
|
783
|
+
| errorType | String | 에러 구분 코드 (exception / signal / fatalerror 등등) |
|
|
784
|
+
| errorMessage | String | stack track 스트링 또는 크래시 발생 시 해당 조건값/로그 등등 |
|
|
785
|
+
| |
|
|
567
786
|
|
|
568
|
-
|
|
787
|
+
> **JavaScript**
|
|
569
788
|
|
|
570
|
-
>**TypeScript**
|
|
571
789
|
```js
|
|
572
|
-
|
|
790
|
+
const stack = e.stack || e.toString();
|
|
791
|
+
TagWorksModule.saveErrorReport('에러 타입', stack); // 에러 메세지는 임의로 작성 가능
|
|
573
792
|
```
|
|
793
|
+
|
|
794
|
+
<br>
|
|
795
|
+
<br>
|
|
796
|
+
|
|
797
|
+
# InAppMessage
|
|
798
|
+
|
|
799
|
+
## onCMS Popup
|
|
800
|
+
|
|
801
|
+
- onCMS 연동을 통해 앱 내 팝업을 노출할 수 있습니다.
|
|
802
|
+
- onCMS 추천 영역 설정을 통해 가운데 팝업, 하단 슬라이드 팝업, 전체 페이지 팝업 형태로 노출 가능합니다.
|
|
803
|
+
|
|
804
|
+
> [!NOTE]
|
|
805
|
+
> SDK Version 21 (Android LOLLIPOP) 이상에서 원활하게 동작
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
### onCMS Popup을 노출하기 위해 필요한 파라미터
|
|
809
|
+
|
|
810
|
+
| 파라미터 | 타입 | 설명 |
|
|
811
|
+
| ------------ | ------- | ---------------------------------------------------------------- |
|
|
812
|
+
| onCmsUrl | String | 고객사에 설치된 onCMS 서버 URL (예: "https://lab.obzen.com/oncms") |
|
|
813
|
+
| cust_id | String | 고객 번호 |
|
|
814
|
+
| rcmd_area_cd | String | 추천 영역 코드 |
|
|
815
|
+
| |
|
|
816
|
+
|
|
817
|
+
> **JavaScript**
|
|
818
|
+
|
|
819
|
+
```js
|
|
820
|
+
TagWorksPopupModule.onCMSPopup(
|
|
821
|
+
"https://onCMSUrl",
|
|
822
|
+
"고객번호",
|
|
823
|
+
"추천영역코드"
|
|
824
|
+
);
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
<br>
|
|
828
|
+
|
|
829
|
+
## onCMS Banner
|
|
830
|
+
|
|
831
|
+
- onCMS 연동을 통해 앱 내 설정한 네이티브 영역에 배너를 노출할 수 있습니다.
|
|
832
|
+
- onCMS 추천 영역 설정을 통해 단일 배너, 롤링 배너, 리스트 배너 형태로 노출 가능합니다.
|
|
833
|
+
- `onCmsBannerView` 네이티브 커스텀 뷰의 Property 설정을 이용합니다. (useState 이용)
|
|
834
|
+
- 호출 시 마다 뷰의 렌더링을 갱신하기 위해 해당 View 의 `key` 설정을 이용합니다.
|
|
835
|
+
- <span style="color: #ff0000">defaultImage 리소스는 React-Native 프로젝트가 아닌 각각의 네이티브 프로젝트 내 리소스로 추가하여야 합니다. </span>
|
|
836
|
+
- <span style="color: #ff0000">iOS는 Images 내부가 아닌 프로젝트 루트에 파일로 추가, Android는 res/drawable 폴더 내 추가</span>
|
|
837
|
+
|
|
838
|
+
### onCMS Banner를 노출하기 위해 필요한 파라미터
|
|
839
|
+
|
|
840
|
+
| 파라미터 | 타입 | 설명 |
|
|
841
|
+
| ------------ | -------------------------------- | ----------------------------------------------- |
|
|
842
|
+
| onCmsUrl | String | 고객사에 설치된 onCMS 서버 URL (예: "https://lab.obzen.com/oncms") |
|
|
843
|
+
| cust_id | String | 고객 번호 |
|
|
844
|
+
| rcmd_area_cd | String | 추천 영역 코드 |
|
|
845
|
+
| defaultImage | String | 로딩되기 전에 보여줄 디폴트 이미지 이름 (확장자 제외) |
|
|
846
|
+
|
|
847
|
+
<br>
|
|
848
|
+
|
|
849
|
+
#### 변수 선언
|
|
574
850
|
|
|
851
|
+
> **JavaScript**
|
|
852
|
+
|
|
853
|
+
```js
|
|
854
|
+
const [onCmsUrl, setOnCmsUrl] = useState('');
|
|
855
|
+
const [custId, setCustId] = useState('');
|
|
856
|
+
const [areaCode, setAreaCode] = useState('');
|
|
857
|
+
const [imageName, setImageName] = useState('default_image');
|
|
858
|
+
const [bannerKey, setBannerKey] = useState(0);
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
#### Banner View 영역 할당
|
|
862
|
+
|
|
863
|
+
- 해당 배너 노출 View 영역 노출
|
|
864
|
+
- style은 onCMS 에서 설정된 추천영역 배너 크기에 맞게 설정
|
|
865
|
+
|
|
866
|
+
> **JavaScript**
|
|
867
|
+
|
|
868
|
+
```jsx
|
|
869
|
+
<OnCmsBannerView
|
|
870
|
+
key={`banner-${bannerKey}`}
|
|
871
|
+
style={{ width: '100%', height: 200 }}
|
|
872
|
+
onCmsUrl={onCmsUrl}
|
|
873
|
+
cust_id={custId}
|
|
874
|
+
rcmd_area_cd={areaCode}
|
|
875
|
+
defaultImage={imageName}
|
|
876
|
+
/>
|
|
877
|
+
```
|
|
878
|
+
|
|
879
|
+
#### 변수 값 할당
|
|
880
|
+
|
|
881
|
+
- 필요한 파라미터 값들이 준비되면 내부적으로 함수 호출을 통해 값들을 설정
|
|
882
|
+
|
|
883
|
+
> **JavaScript**
|
|
884
|
+
|
|
885
|
+
```jsx
|
|
886
|
+
const callBannerView = () => {
|
|
887
|
+
setOnCmsUrl('https://onCMSUrl');
|
|
888
|
+
setCustId('고객번호');
|
|
889
|
+
setAreaCode('추천영역배너');
|
|
890
|
+
setImageName('default_image');
|
|
891
|
+
setBannerKey((prev) => prev + 1);
|
|
892
|
+
};
|
|
893
|
+
```
|
|
894
|
+
<br>
|
|
895
|
+
<br>
|
|
896
|
+
|
|
897
|
+
# 딥링크 서비스
|
|
898
|
+
- TagWorks Deeplink Service는 앱 설치 및 실행 시 딥링크를 처리하고, 지연된 딥링크(Deferred Deeplink)를 지원하는 고급 딥링크 처리 시스템입니다.
|
|
899
|
+
- 딥링크 서비스를 이용하여 유입 분석 및 성과 측정이 가능합니다.
|
|
900
|
+
- <mark>유니버셜 링크, 앱 링크는 지원하지 않습니다.</mark>
|
|
901
|
+
|
|
902
|
+
### ✅ TagWorks Deeplink Service는 다음과 같은 기능을 제공합니다.
|
|
903
|
+
- **즉시 딥링크 처리** : 앱이 실행될 때 딥링크 URL을 즉시 처리
|
|
904
|
+
- **지연된 딥링크 처리** : 앱 설치 후 첫 실행 시 딥링크 정보를 서버에서 조회하여 처리
|
|
905
|
+
- **자동 이벤트 로깅** : 딥링크 관련 이벤트를 자동으로 수집 서버에 전송
|
|
906
|
+
- **설치 시간 기반 필터링** : 앱 설치 후 3일 이내에만 지연된 딥링크 처리
|
|
907
|
+
|
|
908
|
+
## 딥링크(Deferred 딥링크)
|
|
909
|
+
- TagManager로부터 생성한 마케팅 URL로부터 앱으로의 유입 경로 및 설치 정보를 분석할 수 있습니다.
|
|
910
|
+
- 딥링크를 처리하기 위해서는 <mark>SDK 초기화 메서드 호출이 필히 선행되어야 하며,</mark> SDK 초기화 시 `deeplinkServerUrl` 파라미터에 올바른 딥링크 Bridge 서버 URL이 필요합니다.
|
|
911
|
+
- 앱이 실행되는 진입점 메서드 최상단에서 SDK 초기화 메서드를 호출해야 합니다.
|
|
912
|
+
- iOS: **AppDelegate**의 **application(_:,didFinishLaunchingWithOptions:)**
|
|
913
|
+
- Android: **Application**의 **onCreate()**
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
### 딥링크 설정
|
|
917
|
+
---
|
|
918
|
+
- 딥링크 설정은 각각의 Native에서 다음과 같은 설정이 필요합니다.
|
|
919
|
+
|
|
920
|
+
### 🔹 iOS
|
|
921
|
+
- 앱이 종료 상태에서 딥링크를 통해 앱이 실행이 될 때, 실행되는 진입점인 **AppDelegate**의 **application(_:,didFinishLaunchingWithOptions:)** 메서드 최상단에서 SDK 초기화 메서드를 호출 후 바로 **launchWithOptions(url:userInfo:)** 메서드를 호출해야 합니다.
|
|
922
|
+
- 앱이 실행 중인 상태에서 딥링크를 처리하기 위해서는 application(_:openurl:options:) 또는 scene(_:openURLContexts:) 메서드 구현이 <mark>필수</mark>로 필요합니다. 해당 메서드가 구현이 되어 있어야 SDK에서 자동으로 딥링크를 처리할 수 있습니다.
|
|
923
|
+
|
|
924
|
+
#### 1. 앱 내 스키마 등록 (App 프로젝트 설정)
|
|
925
|
+
- 앱 타겟의 Info.plist 항목에 URL types 항목을 추가합니다.
|
|
926
|
+
|
|
927
|
+
> **Info.plist**
|
|
928
|
+
|
|
929
|
+
```xml
|
|
930
|
+
<key>CFBundleURLTypes</key>
|
|
931
|
+
<array>
|
|
932
|
+
<dict>
|
|
933
|
+
<key>CFBundleURLName</key>
|
|
934
|
+
<string>com.example.myapp</string>
|
|
935
|
+
<key>CFBundleURLSchemes</key>
|
|
936
|
+
<array>
|
|
937
|
+
<string>myappscheme</string>
|
|
938
|
+
</array>
|
|
939
|
+
</dict>
|
|
940
|
+
</array>
|
|
941
|
+
```
|
|
942
|
+
|
|
943
|
+
| 파라미터 | 설명 | 필수 여부 |
|
|
944
|
+
|-----------------------|---------------------------------------------------|-----------|
|
|
945
|
+
| `CFBundleURLName` | 스키마를 구분할 수 있는 식별자. 보통 BundleId에 식별자를 추가 | 필수 |
|
|
946
|
+
| `CFBundleURLSchemes` | 딥링크에 사용할 스키마 (커스텀 스키마) | 필수 |
|
|
947
|
+
| |
|
|
948
|
+
|
|
949
|
+
#### 2. TagWorks SDK 초기화 설정 및 딥링크를 통해 앱이 실행 될 때 딥링크 URL 처리
|
|
950
|
+
|
|
951
|
+
> **Objective-C**
|
|
952
|
+
```obj-c
|
|
953
|
+
// AppDelegate.m
|
|
954
|
+
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
|
955
|
+
// TagWorks instance 초기화 설정
|
|
956
|
+
TagWorks *tagWorksInstance = TagWorks.sharedInstance;
|
|
957
|
+
[tagWorksInstance setInstanceConfigWithSiteId:@"00,XXXXXXXX"
|
|
958
|
+
...
|
|
959
|
+
deeplinkServerUrl:[NSURL URLWithString:@"Deeplink Bridge Server URL"]]; // 딥링크 서버 URL 설정
|
|
960
|
+
|
|
961
|
+
// #.딥링크로 앱이 실행될 때 실행 파라미터 전달
|
|
962
|
+
NSURL *launchUrl = launchOptions[UIApplicationLaunchOptionsURLKey];
|
|
963
|
+
if (launchUrl != nil) {
|
|
964
|
+
[[TagWorks sharedInstance] launchWithOptionsWithUrl:launchUrl userInfo:nil];
|
|
965
|
+
}
|
|
966
|
+
...
|
|
967
|
+
...
|
|
968
|
+
}
|
|
969
|
+
```
|
|
970
|
+
|
|
971
|
+
#### 3. 앱이 실행 중인 상태에서 딥링크 URL 처리
|
|
972
|
+
|
|
973
|
+
> **Objective-C**
|
|
974
|
+
```obj-c
|
|
975
|
+
// AppDelegate.m (iOS 12 이하)
|
|
976
|
+
- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
|
|
977
|
+
return [RCTLinkingManager application:application openURL:url options:options];
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
// 또는
|
|
981
|
+
// SceneDelegate.m (iOS 13 이상)
|
|
982
|
+
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
|
|
983
|
+
if (URLContexts.count > 0) {
|
|
984
|
+
UIOpenURLContext *urlContext = [URLContexts anyObject];
|
|
985
|
+
[RCTLinkingManager application:[UIApplication sharedApplication]
|
|
986
|
+
openURL:urlContext.URL
|
|
987
|
+
options:urlContext.options];
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
```
|
|
991
|
+
|
|
992
|
+
<br>
|
|
993
|
+
|
|
994
|
+
### 🔹 Android
|
|
995
|
+
|
|
996
|
+
#### 1. 앱 내 스키마 등록 (App - AndroidManifest 설정)
|
|
997
|
+
|
|
998
|
+
> **AndroidManifest.xml**
|
|
999
|
+
|
|
1000
|
+
```xml
|
|
1001
|
+
<activity android:name=".MainActivity">
|
|
1002
|
+
<intent-filter>
|
|
1003
|
+
<action android:name="android.intent.action.VIEW" />
|
|
1004
|
+
<category android:name="android.intent.category.DEFAULT" />
|
|
1005
|
+
<category android:name="android.intent.category.BROWSABLE" />
|
|
1006
|
+
<!-- 앱 내 딥링크 커스텀 스키마 설정 -->
|
|
1007
|
+
<data android:scheme="yourappscheme" />
|
|
1008
|
+
</intent-filter>
|
|
1009
|
+
</activity>
|
|
1010
|
+
```
|
|
1011
|
+
| 파라미터 | 설명 | 필수 여부 |
|
|
1012
|
+
|---------|------|-----------|
|
|
1013
|
+
| `android:scheme` | 딥링크로 사용할 스키마 (커스텀 스키마) | 필수 |
|
|
1014
|
+
| `android:host` | 딥링크로 사용할 도메인 | 선택 |
|
|
1015
|
+
|
|
1016
|
+
#### 2. TagWorksConfig 설정
|
|
1017
|
+
|
|
1018
|
+
> **Java**
|
|
1019
|
+
|
|
1020
|
+
```Java
|
|
1021
|
+
TagWorksConfig config = new TagWorksConfig.Builder()
|
|
1022
|
+
.setBaseUrl("서버 URL")
|
|
1023
|
+
.setSiteId("발급받은 사이트 ID")
|
|
1024
|
+
.setDeeplinkServerUrl("https://your-deeplink-server.com") // 딥링크 서버 URL 설정
|
|
1025
|
+
.build();
|
|
1026
|
+
|
|
1027
|
+
TagWorks.initializeSdk(this, config);
|
|
1028
|
+
```
|
|
1029
|
+
|
|
1030
|
+
> **Kotlin**
|
|
1031
|
+
|
|
1032
|
+
```kotlin
|
|
1033
|
+
val config = TagWorksConfig.Builder()
|
|
1034
|
+
.setSiteId("서버 URL")
|
|
1035
|
+
.setBaseUrl("발급받은 사이트 ID")
|
|
1036
|
+
.setDeeplinkServerUrl("https://your-deeplink-server.com") // 딥링크 서버 URL 설정
|
|
1037
|
+
.build()
|
|
1038
|
+
|
|
1039
|
+
TagWorks.getInstance().initialize(context, config)
|
|
1040
|
+
```
|
|
1041
|
+
|
|
1042
|
+
<br>
|
|
1043
|
+
|
|
1044
|
+
### 딥링크 처리 방법
|
|
1045
|
+
---
|
|
1046
|
+
|
|
1047
|
+
#### 딥링크 처리 (handleDeeplinkUrl)
|
|
1048
|
+
- 앱이 실행되거나 앱이 실행중일 때 딥링크 정보를 처리하는 방법입니다.
|
|
1049
|
+
- React-Native에서는 Linking 모듈을 이용해 딥링크 URL을 수집합니다.
|
|
1050
|
+
- iOS에서는 딥링크 설정 시 Native에서 딥링크 URL을 전달하기에, React-Native 앱 내에서는 Android OS인 경우에만 handleDeferredDeeplink(), handleDeeplinkUrl() 메서드를 호출하여 SDK에 딥링크 URL을 전달합니다.
|
|
1051
|
+
- 앱 내에서는 NativeEventEmitter를 이용한 addLandingListener()를 통해 딥링크 URI를 콜백으로 전달받아 유저를 설정한 목적지로 보낼 수 있습니다.
|
|
1052
|
+
- addLandingListener() 콜백으로 전달받는 파라미터에는 TagManager를 이용해 만들어진 딥링크 URL인지 여부를 판단하여 해당 파라미터에 같이 전달이 되며, TagManager 딥링크 여부 판별 후 딥링크 처리를 하실 수 있습니다.
|
|
1053
|
+
|
|
1054
|
+
> **JavaScript**
|
|
1055
|
+
```jsx
|
|
1056
|
+
useEffect(() => {
|
|
1057
|
+
// 1) 실행 중 유입 이벤트 리스너(먼저 등록!)
|
|
1058
|
+
// 리스너가 늦게 붙으면 sdk가 보낸 결과 이벤트를 받지 못함.
|
|
1059
|
+
const deeplinkLanding = TagWorksDeeplink.addLandingListener((e) => {
|
|
1060
|
+
console.log('[TagWorks] 딥링크 처리 후 콜백 호출됨.', e);
|
|
1061
|
+
|
|
1062
|
+
if (e.isTagWorksDeeplink) {
|
|
1063
|
+
console.log('isTagWorks deeplink Listener: ', e.deeplinkURL);
|
|
1064
|
+
// navigateByUri(e.deeplinkURL);
|
|
1065
|
+
} else {
|
|
1066
|
+
console.log('Not isTagWorks deeplink Listener: ', e.deeplinkURL);
|
|
1067
|
+
}
|
|
1068
|
+
});
|
|
1069
|
+
|
|
1070
|
+
// 앱이 실행 중일 때 딥링크 감지
|
|
1071
|
+
const subscription = Linking.addEventListener('url', ({ url }) => {
|
|
1072
|
+
console.log('[TagWorks] 앱 실행 중 딥링크 감지.');
|
|
1073
|
+
|
|
1074
|
+
if (Platform.OS === 'android') {
|
|
1075
|
+
TagWorksDeeplink.handleDeeplinkUrl(url);
|
|
1076
|
+
}
|
|
1077
|
+
});
|
|
1078
|
+
|
|
1079
|
+
// 앱이 cold start 된 경우 링크 가져오기
|
|
1080
|
+
Linking.getInitialURL().then((url) => {
|
|
1081
|
+
// console.log('cold start Deeplink received.');
|
|
1082
|
+
if (url) {
|
|
1083
|
+
console.log('Deeplink initialUrl', url);
|
|
1084
|
+
if (Platform.OS === 'android') {
|
|
1085
|
+
TagWorksDeeplink.handleDeeplinkUrl(url);
|
|
1086
|
+
}
|
|
1087
|
+
} else
|
|
1088
|
+
if (Platform.OS === 'android') {
|
|
1089
|
+
console.log('안드로이드 Deferred Deeplink 체크');
|
|
1090
|
+
TagWorksDeeplink.handleDeferredDeeplink();
|
|
1091
|
+
}
|
|
1092
|
+
});
|
|
1093
|
+
|
|
1094
|
+
return () => {
|
|
1095
|
+
deeplinkLanding();
|
|
1096
|
+
subscription.remove();
|
|
1097
|
+
};
|
|
1098
|
+
}, []);
|
|
1099
|
+
```
|
|
1100
|
+
|
|
575
1101
|
<br>
|
|
576
1102
|
<br>
|
|
577
1103
|
|