ae-tracking 0.1.0 → 0.2.0
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/CHANGELOG.md +24 -0
- package/dist/src/cli/init.js +1 -1
- package/package.json +1 -1
- package/skills/data-integration-helper/SKILL.md +198 -0
- package/skills/data-integration-helper/references/android_sdk_faq.md +179 -0
- package/skills/data-integration-helper/references/c_sdk_compilation.md +83 -0
- package/skills/data-integration-helper/references/c_sdk_faq.md +416 -0
- package/skills/data-integration-helper/references/cocoscreator_sdk_faq.md +123 -0
- package/skills/data-integration-helper/references/cpp_server_sdk_faq.md +365 -0
- package/skills/data-integration-helper/references/index.md +56 -0
- package/skills/data-integration-helper/references/ios_sdk_faq.md +118 -0
- package/skills/data-integration-helper/references/java_sdk_faq.md +406 -0
- package/skills/data-integration-helper/references/javascript_sdk_faq.md +129 -0
- package/skills/data-integration-helper/references/logbus2_guide.md +307 -0
- package/skills/data-integration-helper/references/logbus2_parser_plugin.md +346 -0
- package/skills/data-integration-helper/references/minigame_sdk_faq.md +115 -0
- package/skills/data-integration-helper/references/miniprogram_sdk_faq.md +118 -0
- package/skills/data-integration-helper/references/python_sdk_faq.md +232 -0
- package/skills/data-integration-helper/references/restful_api_notes.md +72 -0
- package/skills/data-integration-helper/references/sdk_log_guide.md +314 -0
- package/skills/data-integration-helper/references/sdk_usage_notes.md +105 -0
- package/skills/data-integration-helper/references/unity_sdk_faq.md +115 -0
- package/skills/generate-tracking-code/SKILL.md +33 -10
- package/skills/generate-tracking-code/references/client-sdk-insert.md +33 -0
- package/skills/generate-tracking-code/references/server-sdk-insert.md +29 -0
- package/skills/generate-tracking-code/references/snippet-delivery.md +14 -7
- package/skills/generate-tracking-plan/SKILL.md +2 -2
- package/wiki/te-docs/raw//346/216/245/345/205/245/346/214/207/345/215/227//345/256/242/346/210/267/347/253/257-sdk/ios.md +2 -2
- package/wiki/te-docs/raw//346/216/245/345/205/245/346/214/207/345/215/227//345/256/242/346/210/267/347/253/257-sdk/macos.md +1 -1
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# 查看客户端 SDK 日志
|
|
2
|
+
|
|
3
|
+
# 一、背景
|
|
4
|
+
|
|
5
|
+
在客户端 SDK 集成调试以及排查问题时,可以借助日志分析数据的采集和上报是否符合预期。本文介绍如何开启SDK日志,以及日志中的关键词和对应含义。
|
|
6
|
+
|
|
7
|
+
### 原生客户端 SDK 上报机制
|
|
8
|
+
|
|
9
|
+
首先我们简要介绍原生客户端 SDK 的上报机制,Android 和 iOS SDK 都会在本地数据库缓存数据并批量上报。本地缓存数据为了避免网络异常情况下丢失数据,批量上报为了避免频繁上报产生的系统和网络开销。当符合以下任一条件时,均会触发数据上报:
|
|
10
|
+
|
|
11
|
+
- APP 切换到后台
|
|
12
|
+
- 距上次数据上报时间间隔达到上报时间间隔(默认时间间隔为30秒,可以在 TE 修改)
|
|
13
|
+
- 本地缓存数量达到上报的数量(默认上报的数量达到30条触发上报,可以在 TE 修改)
|
|
14
|
+
|
|
15
|
+
因此,在调试过程中,如果没有满足触发数据上报的条件,数据仍然缓存在本地。
|
|
16
|
+
|
|
17
|
+
### 数据日志打印
|
|
18
|
+
|
|
19
|
+
对于一条数据,数据在本地存储时会打印一条日志,数据上报时又会打印一条日志,因此需要根据日志中的关键词区分日志的含义,不要误以为产生了重复数据。
|
|
20
|
+
|
|
21
|
+
# 二、开启日志打印
|
|
22
|
+
|
|
23
|
+
### iOS 3.0之前版本
|
|
24
|
+
|
|
25
|
+
日志筛选字段"[THINKING]"
|
|
26
|
+
|
|
27
|
+
**开启日志打印**
|
|
28
|
+
|
|
29
|
+
```objectivec
|
|
30
|
+
[ThinkingAnalyticsSDK setLogLevel:TDLoggingLevelDebug];
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**初始化SDK**
|
|
34
|
+
|
|
35
|
+
mode:表示SDK使用的模式
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
2024-02-01 11:36:47.862929+0800 TATest_iOS[32287:14658471] [THINKING] Thinking Analytics iOS SDK 2.8.4 instance initialized successfully with mode: NORMAL, APP ID: af6861d085e14b5c948662e1fcdce6ef, server url: https://receiver-ta-demo.thinkingdata.cn, device ID: 15F96974-CE32-44F5-9AD0-F259349FDAF2
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**数据存储本地**(关键词:`[THINKING] queueing data`)
|
|
42
|
+
|
|
43
|
+
```objectivec
|
|
44
|
+
2022-10-25 17:30:29.270504+0800 TATest_iOS[85710:698131] [THINKING] queueing data:{
|
|
45
|
+
"properties" : {
|
|
46
|
+
"#os" : "iOS",
|
|
47
|
+
"#device_model" : "arm64",
|
|
48
|
+
...
|
|
49
|
+
},
|
|
50
|
+
"#type" : "track",
|
|
51
|
+
"#uuid" : "DB2B97A5-183A-439E-B8B2-FE9AF77D7421",
|
|
52
|
+
"#distinct_id" : "E5ABB02F-EA10-47AC-AB6C-A8E47E55B4E9",
|
|
53
|
+
"#event_name" : "testA",
|
|
54
|
+
"#time" : "2022-10-25 14:30:29.256"
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**数据上报TA**(关键词:`[THINKING] flush success sendContent`)
|
|
59
|
+
|
|
60
|
+
```objectivec
|
|
61
|
+
2022-10-25 17:30:32.551796+0800 TATest_iOS[85710:698131] [THINKING] flush success sendContent---->:{
|
|
62
|
+
"#app_id" : "af6861d085e14b5c948662e1fcdce6ef",
|
|
63
|
+
"data" : [...],
|
|
64
|
+
"#flush_time" : 1666690232351
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**上报TA结果**(关键词:`flush success responseData`)
|
|
69
|
+
|
|
70
|
+
code为0代表上传成功
|
|
71
|
+
|
|
72
|
+
```objectivec
|
|
73
|
+
2022-10-25 17:30:32.552237+0800 TATest_iOS[85710:698131] [THINKING] flush success responseData---->{
|
|
74
|
+
"code" : 0
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### iOS 3.0及之后版本
|
|
79
|
+
|
|
80
|
+
日志筛选字段"[ThinkingData]"
|
|
81
|
+
|
|
82
|
+
**开启日志打印**
|
|
83
|
+
|
|
84
|
+
```objectivec
|
|
85
|
+
[TDAnalytics enableLog:YES];
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**初始化SDK**
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
2024-02-01 12:07:05.077926+0800 TATest_iOS[32411:14665745] [ThinkingData] [ThinkingData][Info] initialized successfully!
|
|
92
|
+
AppID: af6861d085e14b5c948662e1fcdce6ef
|
|
93
|
+
ServerUrl: https://receiver-ta-demo.thinkingdata.cn
|
|
94
|
+
Mode: Debug
|
|
95
|
+
TimeZone: Local Time Zone (Asia/Shanghai (GMT+8) offset 28800)
|
|
96
|
+
DeviceID: 15F96974-CE32-44F5-9AD0-F259349FDAF2
|
|
97
|
+
Lib: iOS
|
|
98
|
+
LibVersion: 3.0.0
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**数据存储本地**(关键词:`[ThinkingData] [Info] Enqueue data`)
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
2023-09-05 14:27:44.721461+0800 TestTAiOS[41411:3781875] [ThinkingData] [Info] Enqueue data: {
|
|
105
|
+
"properties" : {...},
|
|
106
|
+
"#type" : "track",
|
|
107
|
+
"#uuid" : "0ECCD33B-8076-42A5-BA2B-89DE0773B84B",
|
|
108
|
+
"#distinct_id" : "51C6265F-8F03-461E-91D3-D0FFB11DFCFD_2",
|
|
109
|
+
"#event_name" : "iOS_001",
|
|
110
|
+
"#time" : "2023-09-05 14:27:44.719"
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**数据上报TA**(关键词:`[ThinkingData] [Debug] flush success sendContent`)
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
2023-09-05 14:28:14.834448+0800 TestTAiOS[41411:3782015] [ThinkingData] [Debug] flush success sendContent---->:{...}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**上报TA结果**
|
|
121
|
+
|
|
122
|
+
- code为0代表上传成功
|
|
123
|
+
- 打印了flush success responseData,就可以认为上报成功。只看response的状态码为200,不看返回内容中的code
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
2023-09-05 14:28:14.835774+0800 TestTAiOS[41411:3782015] [ThinkingData] [Debug] flush success responseData---->{
|
|
127
|
+
"code" : 0
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Android 3.0之前版本
|
|
132
|
+
|
|
133
|
+
日志筛选字段"ThinkingAnalytics"
|
|
134
|
+
|
|
135
|
+
**开启日志打印**
|
|
136
|
+
|
|
137
|
+
```java
|
|
138
|
+
ThinkingAnalyticsSDK.enableTrackLog(true);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**初始化SDK**
|
|
142
|
+
|
|
143
|
+
mode:表示SDK使用的模式
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
2024-04-09 13:39:23.458 12219-12219 ThinkingAnalyticsSDK cn.thinkingdata.android.demo I Thinking Analytics SDK 2.8.3 instance initialized successfully with mode: NORMAL, APP ID ends with: 3356, server url: https://receiver.ta.thinkingdata.cn/sync, device ID: d4d6419233102942
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**数据存储本地**(关键词:`Data enqueued`)
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
2022-10-26 10:56:54.416 6445-6528/cn.thinkingdata.android.demo I/ThinkingAnalytics.DataHandle: Data enqueued(e6ef):
|
|
153
|
+
{
|
|
154
|
+
"#type": "track",
|
|
155
|
+
"#time": "2022-10-26 10:56:54.285",
|
|
156
|
+
"#distinct_id": "04af1a3d-56b2-4c8f-a54a-2b6f655b8286",
|
|
157
|
+
"#event_name": "testA",
|
|
158
|
+
...
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**数据上报TA及结果**(关键词:`upload message`)
|
|
163
|
+
|
|
164
|
+
code为0代表上传成功
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
2022-10-26 10:56:54.637 6445-6526/cn.thinkingdata.android.demo I/ThinkingAnalytics.DataHandle: ret code: 0, upload message: {...}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Android 3.0之后版本
|
|
171
|
+
|
|
172
|
+
日志筛选字段"[ThinkingData]"
|
|
173
|
+
|
|
174
|
+
**开启日志打印**
|
|
175
|
+
|
|
176
|
+
```java
|
|
177
|
+
TDAnalytics.enableLog(true);
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**初始化SDK**
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
2024-04-09 13:48:02.088 13974-13974 ThinkingAnalyticsSDK cn.thinkingdata.android.demo I [ThinkingData] Info: ThinkingData SDK 3.0.2 initialize success with mode: NORMAL, APP ID ends with: 3df0, server url: https://receiver-ta-preview.thinkingdata.cn/sync
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**数据存储本地**(关键词:`[ThinkingData] Info: Enqueue data`)
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
2023-09-14 10:09:52.461 15126-15163/com.example.tatest_android I/ThinkingAnalytics.DataHandle: [ThinkingData] Info: Enqueue data(e6ef):
|
|
190
|
+
{
|
|
191
|
+
"#type": "track",
|
|
192
|
+
"#time": "2023-09-14 10:09:52.445",
|
|
193
|
+
"#distinct_id": "b86de4eb-12b8-4ce4-924a-54cd12b5fa25",
|
|
194
|
+
"#event_name": "android_001",
|
|
195
|
+
...
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**数据上报TA**(关键词:`[ThinkingData] Debug: Send event, Request =`)
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
2023-09-14 10:09:52.688 15126-15162/com.example.tatest_android D/ThinkingAnalytics.DataHandle: [ThinkingData] Debug: Send event, Request = {...}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**上报TA结果**(关键词:`[ThinkingData] Debug: Send event, Response =`)
|
|
206
|
+
|
|
207
|
+
code为0代表上传成功
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
2023-09-14 10:09:52.688 15126-15162/com.example.tatest_android D/ThinkingAnalytics.DataHandle: [ThinkingData] Debug: Send event, Response ={
|
|
211
|
+
"code": 0
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Unity 3.0之前版本
|
|
216
|
+
|
|
217
|
+
**开启日志打印**
|
|
218
|
+
|
|
219
|
+
注意:EnableLog 需要放在 StartThinkingAnalytics 之后调用
|
|
220
|
+
|
|
221
|
+
```csharp
|
|
222
|
+
ThinkingAnalyticsAPI.EnableLog(true);
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**数据存储本地**(关键词:`Save event`)
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
[ThinkingEngine] (Unity_V2.6.0-beta.1) Save event: {...}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**数据上报TA**(关键词:`Post event`)
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
[ThinkingEngine] (Unity_V2.6.0-beta.1) Post event: {...}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**上报TA结果**
|
|
238
|
+
|
|
239
|
+
code为0代表上传成功
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
[ThinkingEngine] (Unity_V2.6.0-beta.1) Response: {"code":0}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Unity 3.0之后版本
|
|
246
|
+
|
|
247
|
+
**开启日志打印**
|
|
248
|
+
|
|
249
|
+
注意:EnableLog 需要放在 Init 之后调用。Unity的日志默认是开启的。
|
|
250
|
+
|
|
251
|
+
```csharp
|
|
252
|
+
TDAnalytics.EnableLog(true);
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**数据存储本地**(关键词:`Enqueue data`)
|
|
256
|
+
|
|
257
|
+
```
|
|
258
|
+
[ThinkingData] Info: Enqueue data: {...}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**数据上报TA**(关键词:`Send event Request`)
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
[ThinkingData] Info: Send event Request: {...}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**上报TA结果**(关键词:`Send event Response`)
|
|
268
|
+
|
|
269
|
+
- Normal模式,code为0代表上传成功
|
|
270
|
+
- Debug模式,如果没有加白名单,"errorLevel":-1,提示加白名单
|
|
271
|
+
- Debug模式,如果加了白名单,"errorLevel":0,表示上报成功
|
|
272
|
+
|
|
273
|
+
### OpenHarmony
|
|
274
|
+
|
|
275
|
+
日志筛选字段"[ThinkingData]",但是由于打印字段有限制,所以一般不加筛选条件
|
|
276
|
+
|
|
277
|
+
**开启日志打印**
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
TDAnalytics.enableLog(true);
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**初始化SDK**
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
[ThinkingData] Info: ThinkingData SDK 1.3.3 initialize success with mode: NORMAL, APP ID ends with: e6ef, server url: https://receiver-ta-demo.thinkingdata.cn, device ID: ad6a69cf-3f2c-47ed-a6e9-4808e36cc61f
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**数据存储本地**(关键词:`[ThinkingData] Info: Enqueue data`)
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
[ThinkingData] Info: Enqueue data : {...}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**数据上报TA**(关键词:`[ThinkingData] Info: Send event`)
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
[ThinkingData] Info: Send event, Request = {...}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**上报TA结果**(关键词:`[ThinkingData] Info: Response`)
|
|
302
|
+
|
|
303
|
+
打印了Response,就可以认为上报成功。只看response的状态码为200,不看返回内容中的code
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
[ThinkingData] Info: Response :{"responseCode":200,...}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
# 三、TE系统查询数据
|
|
310
|
+
|
|
311
|
+
使用sql通过#device_id查询数据,这里数据最及时,实时数据也没这里及时
|
|
312
|
+
|
|
313
|
+
1. 分析中选择SQL查询
|
|
314
|
+
2. 解析事件表,where中添加#device_id
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# SDK 使用注意事项
|
|
2
|
+
|
|
3
|
+
# 一、客户端 SDK
|
|
4
|
+
|
|
5
|
+
1. **上报模式**
|
|
6
|
+
- 生产环境请使用 `Normal` 模式;
|
|
7
|
+
- `Debug` 和 `Debug_Only` 模式仅用于测试阶段调试,请勿在生产环境和正式阶段使用;
|
|
8
|
+
|
|
9
|
+
2. **缓存上报策略**
|
|
10
|
+
- Android、iOS 原生 SDK 以及底层调用 Android、iOS SDK 的游戏引擎 SDK 和跨平台 SDK,默认采用数据缓存和批量上报策略,上报时机默认 30条/30秒,即设备本地缓存达到 30 条数据或每隔 30 秒触发数据上报。可以在 TE Web "项目管理"页面调整上报频率,但如果上报过于频繁(比如 1条/1秒)会导致客户端系统 CPU、内存、网络等开销增加,引发设备过热、卡顿等问题。
|
|
11
|
+
- JS、小游戏/小程序 SDK 默认不开启本地缓存,数据会直接上报,也可以在 SDK 设置开启本地缓存和批量上报功能;
|
|
12
|
+
- 对原生SDK,在Normal模式下,调用`track()`方法不会立刻触发数据上报,会根据缓存上报策略上报;如果希望数据立刻上报,可以调用 `flush()` 方法触发。
|
|
13
|
+
|
|
14
|
+
3. **上报失败处理**
|
|
15
|
+
- 对于开启本地缓存情况,上报失败的数据会在本地保存并在下次触发上报条件时重新上报;
|
|
16
|
+
- 如果未开启本地缓存,可以通过callback 对上报失败的情况自定义处理方式,避免数据丢失;
|
|
17
|
+
|
|
18
|
+
4. **属性类型**
|
|
19
|
+
- 对于 TE 预置属性(比如 `#account_id`、`#time` 、`#ip` 等),属性类型是 TE 系统固定设置的,预置属性清单详见预置属性与系统字段。
|
|
20
|
+
- 对于自定义属性(除 TE 预置属性外的属性),属性类型是 TE 系统根据属性值自动识别的,第一条携带该属性的数据中的属性值决定了属性的类型;
|
|
21
|
+
- 如果上报数据中属性值与 TE 系统的属性类型不一致,系统会尝试强制转换,如果转换成功该属性会入库,如果转换失败**该属性会被丢弃**;
|
|
22
|
+
- 建议关注上报管理中的异常入库,及时识别异常数据和修复;如果对数据质量要求较高,也可以上传埋点方案,并参考项目数据处理规则设置数据处理规则,确保属性类型和预期一致;
|
|
23
|
+
- 元数据管理工具支持修改属性类型,需要注意,**修改类型后属性值会被清空置为NULL**。
|
|
24
|
+
|
|
25
|
+
5. **时间校准**
|
|
26
|
+
- 建议开启时间校准功能,避免由于设备系统时间不准确导致数据时间偏差,影响后续分析;
|
|
27
|
+
- 客户端上报,TE 接收前10天至后3天时间范围的数据,超出时间范围的**数据会被丢弃**;
|
|
28
|
+
- 只需要在 SDK 初始化后做一次时间校准,不需要多次校准;
|
|
29
|
+
- 时间校准方式建议优先用服务器时间戳校准,如果失败再用 NTP 校准作为备选,不要同时使用两种方式校准。
|
|
30
|
+
|
|
31
|
+
6. **自动采集事件**
|
|
32
|
+
- SDK 初始化后建议在完成时间校准后立刻开启自动采集,以及时生成 `ta_app_install` `ta_app_start`等自动采集事件,避免自动采集事件生成滞后;
|
|
33
|
+
|
|
34
|
+
7. **敏感信息采集**
|
|
35
|
+
- 由于法律要求,通常需要向用户展示隐私协议并获取许可后才能初始化 TE SDK 开启数据采集,请遵循各国法律和各应用商店要求披露和采集敏感信息;
|
|
36
|
+
- Android SDK 会采集 `Android ID` 等信息,可以在配置文件中设置屏蔽。
|
|
37
|
+
|
|
38
|
+
8. **关键数据上报**
|
|
39
|
+
- 付费、生成订单等关键数据建议从服务端上报,避免客户端上报延迟或丢失;
|
|
40
|
+
- 从客户端上报的重要数据,可以调用 `flush()` 立即触发上报。
|
|
41
|
+
|
|
42
|
+
9. **数据加密**
|
|
43
|
+
- 客户端 SDK 支持开启数据加密
|
|
44
|
+
- 需要在 AE 集群配置密钥,具体配置流程请咨询客户成功人员;
|
|
45
|
+
- 客户端 SDK 示例(Android):
|
|
46
|
+
```kotlin
|
|
47
|
+
val config = TDConfig.getInstance(context, APP_ID, SERVER_URL)
|
|
48
|
+
config.enableEncrypt(1, "publicKey") // 开启加密
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
10. **应用出海**
|
|
52
|
+
- 如果应用投放海外,建议 TE 集群就近部署,避免跨墙等原因影响数据上报;
|
|
53
|
+
- 如果应用全球投放,或数据需要从海外上报至部署在国内的 TE 集群,建议在应用主要投放地区就近部署一组或多组转接点,避免数据丢失和延迟;
|
|
54
|
+
- 对于 SAAS 客户,TE SAAS 已经在全球多地部署转接点,请使用 TE SAAS 的海外上报地址 `https://global-receiver-ta.thinkingdata.cn`。
|
|
55
|
+
|
|
56
|
+
# 二、服务端 SDK
|
|
57
|
+
|
|
58
|
+
1. **上报模式**
|
|
59
|
+
- 服务端SDK建议用LoggerConsumer配合Logbus上报,避免数据丢失;
|
|
60
|
+
- 如果用BatchConsumer需要处理上报失败返回的异常,部分SDK不返回异常,具体可参考[SDK代码](https://github.com/ThinkingDataAnalytics);
|
|
61
|
+
- 正式环境不能使用DebugConsumer;
|
|
62
|
+
|
|
63
|
+
2. **缓存上报策略**
|
|
64
|
+
- 由于性能原因,LoggerConsumer将数据批量写入文件,BatchConsumer将数据批量上报;
|
|
65
|
+
- BatchConsumer 调用 `track()`不会立刻触发上报,对需要立即上报的关键数据可以调用 `flush()` ;
|
|
66
|
+
|
|
67
|
+
3. **上报失败处理**
|
|
68
|
+
- 对于网络波动导致的上报失败,BatchConsumer 会重试上报3次,3次失败后会抛弃数据并返回错误信息,需要自行处理错误,详见各SDK源码;
|
|
69
|
+
- 使用BatchConsumer如果网络长时间中断,当缓存数据数量大于缓存区上限时(batch*max_cache_size),会开始丢弃最早的数据,**导致缓存数据丢失**;
|
|
70
|
+
|
|
71
|
+
4. **关闭SDK**
|
|
72
|
+
- 当程序退出需要关闭SDK,否则会**导致缓存数据丢失**;
|
|
73
|
+
- 服务器非正常重启导致SDK异常退出,会**导致缓存数据丢失**;
|
|
74
|
+
- 不同SDK关闭的方法不同,比如`close()`、`ta_free()`,详见SDK接口文档;
|
|
75
|
+
|
|
76
|
+
5. **公共属性和动态公共属性**
|
|
77
|
+
- 公共属性的功能适合在客户端SDK采集用户级信息,服务端SDK不建议使用公共属性功能;
|
|
78
|
+
|
|
79
|
+
6. **IP、国家、地区信息**
|
|
80
|
+
- TE 数据中的国家地区信息根据数据的ip信息解析,客户端上报 TE 会自动获取和存储IP信息,服务端上报需要在数据中添加"#ip"后 TE 才会处理;
|
|
81
|
+
|
|
82
|
+
7. **多线程和多进程**
|
|
83
|
+
- 服务端SDK基本都支持多线程,`track()`方法中会做加锁处理,可以通过SDK源码确认;
|
|
84
|
+
- 对于多进程情况,如果使用 LoggerConsumer,每个进程的数据要写入独立文件或独立文件夹,如果写入同一个文件会**导致数据错乱**;
|
|
85
|
+
|
|
86
|
+
8. **时区信息**
|
|
87
|
+
- 客户端SDK上报数据中会自动带有设备系统的时区信息,服务端SDK数据需要自行添加"#zone_offset"属性上报时区信息。
|
|
88
|
+
|
|
89
|
+
# 三、多端上报
|
|
90
|
+
|
|
91
|
+
多端上报场景下的常见问题和解决方案详见多端上报最佳实践。
|
|
92
|
+
|
|
93
|
+
1. **用户 ID 一致**
|
|
94
|
+
- 从多端上报时,需要保证同一个用户数据 `#distinct_id`和 `#account_id` 一致,否则可能会**导致用户割裂**;
|
|
95
|
+
- 如果使用单账号多设备分析体系,需要保证数据的`#account_id`相同且数据中带有`#distinct_id`,避免出现用户被割裂为多个 TE 用户的情况;
|
|
96
|
+
|
|
97
|
+
2. **多端时间对齐**
|
|
98
|
+
- 客户端SDK会上报时区偏移"#zone_offset",默认取设备系统时区,部分SDK支持传参指定;
|
|
99
|
+
- 服务端SDK不会自动上报时区偏移"#zone_offset",需要在properties中手动添加上报。
|
|
100
|
+
|
|
101
|
+
3. **避免重复上报**
|
|
102
|
+
- 避免多端上报相同事件,导致数据重复
|
|
103
|
+
|
|
104
|
+
4. **关键数据上报**
|
|
105
|
+
- 付费、生成订单等关键数据建议从服务端上报,避免客户端延迟或丢失。
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Unity SDK FAQ"
|
|
3
|
+
code: "unity_sdk_faq"
|
|
4
|
+
source: "Feishu MCP"
|
|
5
|
+
doc_id: "wikcnZ5YKmQd4b26mJQ2uiF6fvd"
|
|
6
|
+
fetched_at: "2026-04-20T17:29:38Z"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
> 本文主要针对 Unity 打包除 Android / iOS 之外平台的问题。Android / iOS 平台默认使用原生 SDK。
|
|
10
|
+
|
|
11
|
+
# SDK 初始化
|
|
12
|
+
## 推荐初始化 SDK 初始化位置
|
|
13
|
+
- 建议在用户同意隐私协议后再进行 SDK 初始化
|
|
14
|
+
|
|
15
|
+
## 初始化方式
|
|
16
|
+
### 手动初始化
|
|
17
|
+
```csharp
|
|
18
|
+
using ThinkingData.Analytics;
|
|
19
|
+
TDAnalytics.Init("APPID","SERVER");
|
|
20
|
+
// 或通过 TDConfig 初始化
|
|
21
|
+
TDConfig config = new TDConfig("APPID","SERVER");
|
|
22
|
+
TDAnalytics.Init(config);
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 自动初始化
|
|
26
|
+
- 添加 TDAnalytics 预置体,并设置 SDK 配置
|
|
27
|
+
|
|
28
|
+
# 数据缓存机制
|
|
29
|
+
## 存储位置
|
|
30
|
+
- 通过 PlayerPrefs 存储,Mac OS X 上存储在 ~/Library/Preferences
|
|
31
|
+
|
|
32
|
+
## 缓存限制
|
|
33
|
+
- 没有限制缓存数据量上限,缓存数据没有过期删除策略
|
|
34
|
+
|
|
35
|
+
# 数据上报策略
|
|
36
|
+
## 触发数据上报场景
|
|
37
|
+
- APP 切换到后台
|
|
38
|
+
- 产生自动采集事件
|
|
39
|
+
- 调用 flush() 接口
|
|
40
|
+
- 缓存数据量达到阈值(默认 30 条)
|
|
41
|
+
- 上报时间间隔超过阈值(默认 30 秒)
|
|
42
|
+
- DEBUG / DEBUG_ONLY 模式下直接上报
|
|
43
|
+
|
|
44
|
+
# 访客 ID(#distinct_id)
|
|
45
|
+
## 设置访客 ID
|
|
46
|
+
```csharp
|
|
47
|
+
TDAnalytics.SetDistinctId("Thinker");
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 访客 ID 改变场景
|
|
51
|
+
- 用户清除应用数据
|
|
52
|
+
- 用户卸载重装或更换设备
|
|
53
|
+
- 调用 SetDistinctId() 接口
|
|
54
|
+
|
|
55
|
+
# 账号 ID(#account_id)
|
|
56
|
+
## 设置账号 ID
|
|
57
|
+
```csharp
|
|
58
|
+
TDAnalytics.Login("TA");
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
# 设备 ID(#device_id)
|
|
62
|
+
## 生成规则
|
|
63
|
+
- UNITY_WEBGL:取 System.Guid.NewGuid().ToString("N")
|
|
64
|
+
- 其它平台:取 SystemInfo.deviceUniqueIdentifier
|
|
65
|
+
|
|
66
|
+
# Debug 模式
|
|
67
|
+
## Normal,Debug,DebugOnly 模式区别
|
|
68
|
+
|
|
69
|
+
| 模式 | 上报模式 | 数据入库 | 数据严格检查 | 数据加密 |
|
|
70
|
+
|------|----------|----------|--------------|----------|
|
|
71
|
+
| Normal | 批量上报 | 是 | 否 | 支持 |
|
|
72
|
+
| Debug | 逐条上报 | 是 | 是 | 不支持 |
|
|
73
|
+
| DebugOnly | 逐条上报 | 否 | 是 | 不支持 |
|
|
74
|
+
|
|
75
|
+
# 自动采集事件
|
|
76
|
+
## ta_app_install
|
|
77
|
+
- 应用安装或卸载后重装时触发
|
|
78
|
+
|
|
79
|
+
## ta_app_start
|
|
80
|
+
- 应用程序获得焦点
|
|
81
|
+
|
|
82
|
+
## ta_app_end
|
|
83
|
+
- 应用程序失去焦点或退出
|
|
84
|
+
|
|
85
|
+
## ta_app_crash
|
|
86
|
+
- 监听到 UnhandledException 或 LogType.Error 等
|
|
87
|
+
- 2.2.0 以上版本会默认采集 C# 异常
|
|
88
|
+
|
|
89
|
+
## ta_scene_loaded / ta_scene_unloaded
|
|
90
|
+
- 监听 SceneManager 的回调
|
|
91
|
+
|
|
92
|
+
# 公共事件属性
|
|
93
|
+
## 静态公共事件属性
|
|
94
|
+
- setSuperProperties 方法,存在本地
|
|
95
|
+
|
|
96
|
+
## 动态公共事件属性
|
|
97
|
+
- 每次 track() 时调用回调函数获取当前值
|
|
98
|
+
|
|
99
|
+
## 属性优先级
|
|
100
|
+
- 用户自定义事件属性 > 动态公共事件属性 > 静态公共事件属性
|
|
101
|
+
|
|
102
|
+
# 预置属性
|
|
103
|
+
## #ip
|
|
104
|
+
- TE 服务器获取 http 请求 header 中的 ip
|
|
105
|
+
|
|
106
|
+
## #os
|
|
107
|
+
- Unity WebGL 转的微信小游戏 #os 为 "other"
|
|
108
|
+
|
|
109
|
+
# 异常问题
|
|
110
|
+
详见文档完整内容。
|
|
111
|
+
|
|
112
|
+
# 已知问题
|
|
113
|
+
- 打包 iOS & Android 后 #zone_offset 缺失问题
|
|
114
|
+
- 多个版本已知 bug 及修复版本
|
|
115
|
+
详见文档完整内容。
|
|
@@ -19,11 +19,15 @@ description: 交互式将 AE 埋点方案落为用户项目代码、LogBus2 配
|
|
|
19
19
|
|---|---|---|
|
|
20
20
|
| AE projectId | `meta.project_id` | 有值 → 确认;无值 → 询问 |
|
|
21
21
|
| AE web 地址 | `meta.host` | 有值 → 确认;无值 → 询问 |
|
|
22
|
+
| **SERVER_URL** | `meta.server_url` | **必须询问**,数据上报地址,与 web 地址不同 |
|
|
23
|
+
| **APP_ID** | `meta.app_id` | **必须询问**,来自 AE 后台「接入配置」 |
|
|
22
24
|
| SDK 集成模式 | `meta.sdk_integration_mode` | 有值 → 直接使用 |
|
|
23
25
|
| 客户端 SDK 类型 | `meta.client_platforms`(优先)或 `meta.client_sdk_type` | 有值 → 直接使用 |
|
|
24
26
|
| 服务端语言 | `meta.server_language` | 有值 → 直接使用 |
|
|
25
27
|
| 用户体系 | `meta.user_identity` | 有值 → 直接使用 |
|
|
26
28
|
|
|
29
|
+
**注意**:`project_id` ≠ `APP_ID`,`host` ≠ `SERVER_URL`。即使 project_id 和 host 已有值,SERVER_URL 和 APP_ID 仍需单独询问。
|
|
30
|
+
|
|
27
31
|
**多平台支持**:
|
|
28
32
|
- 若 `client_platforms` 存在(数组),则为多平台场景,需为每个平台生成代码
|
|
29
33
|
- 若只有 `client_sdk_type`,则为单平台(向后兼容)
|
|
@@ -43,12 +47,14 @@ description: 交互式将 AE 埋点方案落为用户项目代码、LogBus2 配
|
|
|
43
47
|
- 用户 `yes` → 使用 draft 值
|
|
44
48
|
- 用户输入新值 → 更新 draft.json 并使用新值
|
|
45
49
|
|
|
46
|
-
###
|
|
50
|
+
### 需要询问的配置(必须逐项确认)
|
|
51
|
+
|
|
52
|
+
**⚠️ 关键:SERVER_URL 和 APP_ID 是独立的配置项,即使 draft.json 中已有 project_id 和 host 也必须询问。`project_id` ≠ `APP_ID`,`host` ≠ `SERVER_URL`。**
|
|
47
53
|
|
|
48
54
|
1. **SERVER_URL** — 数据上报地址(**与 web 地址不同**;请前往 AE 系统「项目管理」→「接入配置」→ 填写「公网地址」)
|
|
49
55
|
- ⚠️ 「公网地址」需要填写过才会显示,如果没填过不会显示此字段
|
|
50
56
|
- 解决方案:咨询运维获取地址,或**跳过此步骤**(代码中可暂时用 `SERVER_URL` 或 `PUSH_URL` 替代)
|
|
51
|
-
2. **
|
|
57
|
+
2. **APP_ID** — 请前往 AE 系统「项目管理」→「接入配置」→ 复制「APP_ID」
|
|
52
58
|
|
|
53
59
|
**host 处理**(可选):
|
|
54
60
|
- 如果需要从 AE fetch plan(无本地 draft.json)→ 询问 host
|
|
@@ -56,7 +62,19 @@ description: 交互式将 AE 埋点方案落为用户项目代码、LogBus2 配
|
|
|
56
62
|
|
|
57
63
|
### 如果只有 xlsx 文件(无 draft.json)
|
|
58
64
|
|
|
59
|
-
|
|
65
|
+
首先检查是否同时存在 `.ae-tracking/draft.json` 和 `.ae-tracking/draft.xlsx`:
|
|
66
|
+
|
|
67
|
+
**若两者都不存在** — 说明当前环境尚未生成过埋点方案。此时提醒用户两种选择:
|
|
68
|
+
|
|
69
|
+
1. **是否需要先生成埋点方案?**
|
|
70
|
+
- 是 → 提示用户使用 `generate-tracking-plan` skill 生成埋点方案
|
|
71
|
+
- 附:埋点方案文档路径(飞书:https://www.feishu.cn/docx/Jt0VdhNB6oSJ4TxISs1cq2Ebnmg)
|
|
72
|
+
|
|
73
|
+
2. **如果已有埋点方案**
|
|
74
|
+
- 提供 xlsx 文件路径,使用 `ae-tracking code import-xlsx` 命令导入
|
|
75
|
+
- 或将 xlsx 文件放到 `.ae-tracking/draft.xlsx` 后再执行
|
|
76
|
+
|
|
77
|
+
**若存在 xlsx 文件**(用户通过 `ae-tracking code import-xlsx` 命令提供,或放在 `.ae-tracking/draft.xlsx`),则进入以下流程:
|
|
60
78
|
|
|
61
79
|
**Step 1:解析 xlsx 文件**
|
|
62
80
|
|
|
@@ -259,13 +277,16 @@ ae-tracking plan fetch --project <projectId> --host <host> > .ae-tracking/remote
|
|
|
259
277
|
|
|
260
278
|
提供快捷选项,简化交互:
|
|
261
279
|
|
|
262
|
-
**选项 1
|
|
263
|
-
- 所有端/平台都选择 `snippet
|
|
264
|
-
-
|
|
265
|
-
-
|
|
280
|
+
**选项 1:一键生成(推荐)**
|
|
281
|
+
- 所有端/平台都选择 `snippet`(代码片段)
|
|
282
|
+
- 一次性生成所有代码文件到 `.ae-tracking/output/`
|
|
283
|
+
- **无需指定项目路径**,直接给出可复制的代码
|
|
284
|
+
- 适合快速获取代码参考、复制到项目中使用
|
|
266
285
|
|
|
267
|
-
**选项 2
|
|
268
|
-
-
|
|
286
|
+
**选项 2:插入到项目**
|
|
287
|
+
- 每个端/平台独立选择 `insert`(插入)或 `snippet`(片段)
|
|
288
|
+
- **需要指定项目路径**,代码会写入你的项目目录
|
|
289
|
+
- 适合已有项目、想让代码直接落到对应位置
|
|
269
290
|
|
|
270
291
|
### 2.3 逐个选择流程
|
|
271
292
|
|
|
@@ -510,7 +531,8 @@ TDAnalytics.track("user_login", new HashMap<String, Object>() {{
|
|
|
510
531
|
|
|
511
532
|
## 禁止
|
|
512
533
|
|
|
513
|
-
-
|
|
534
|
+
- **任何 `insert` 执行前未跑 `git status` 检查(重要:必须先检查,有未提交改动则拒绝执行)**
|
|
535
|
+
- 在 Phase 3 跳 reference 直接乱插
|
|
514
536
|
- 在 Phase 3 跳 reference 直接乱插
|
|
515
537
|
- 忽略 `// @tracking <event>` 注释的增量检测
|
|
516
538
|
- 复用 web host 当 SERVER_URL(必须分开)
|
|
@@ -519,6 +541,7 @@ TDAnalytics.track("user_login", new HashMap<String, Object>() {{
|
|
|
519
541
|
- 生成客户端代码时包含 `platform === "server"` 的专属事件
|
|
520
542
|
- 生成服务端代码时包含 `platform === "client"` 的专属事件(除非 `platform === "both"`)
|
|
521
543
|
- **跳过读 SDK 主文档直接凭猜测选集成方式** — 各 SDK 集成方式不同,必须先读 wiki 主文档的「集成 SDK」章节,根据项目特征(有/无构建工具)选择正确方式
|
|
544
|
+
- **Stage 0.5 未完成就进入 Stage 1** — SDK 集成必须在插入代码前确认,否则生成的 track() 调用无法执行
|
|
522
545
|
|
|
523
546
|
---
|
|
524
547
|
|
|
@@ -9,6 +9,39 @@
|
|
|
9
9
|
|
|
10
10
|
**禁止**:跳过 Stage 0 直接写代码、凭猜测选择集成方式、使用不确定的 CDN URL
|
|
11
11
|
|
|
12
|
+
### Stage 0.5: SDK 集成确认(Stage 0 完成后必须执行)
|
|
13
|
+
|
|
14
|
+
根据第 3 步选择的集成方式,向用户确认 SDK 是否已引入:
|
|
15
|
+
|
|
16
|
+
**需要代码改动的集成方式(npm / Gradle / CocoaPods / Maven / pip / go get 等)**:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
检测到项目使用 <集成方式>,需要修改配置文件添加依赖。
|
|
20
|
+
|
|
21
|
+
是否需要我直接修改配置文件添加 SDK 依赖?
|
|
22
|
+
- yes → Edit 修改配置文件(如 package.json / build.gradle / Podfile 等),完成后进入 Stage 1
|
|
23
|
+
- no → 参考以下文档完成 SDK 引入,完成后回答 yes 继续
|
|
24
|
+
|
|
25
|
+
文档:<wiki 文档路径>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- 用户 `yes` → 执行 Edit 修改配置文件,完成后进入 Stage 1
|
|
29
|
+
- 用户 `no` → 显示文档路径,暂停等待用户完成
|
|
30
|
+
|
|
31
|
+
**无需代码改动的集成方式(CDN script 标签 / UnityPackage / 手动放置文件等)**:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
项目使用 <集成方式>,无需修改配置文件。
|
|
35
|
+
|
|
36
|
+
请参考以下文档完成 SDK 引入,完成后回答 yes 继续。
|
|
37
|
+
|
|
38
|
+
文档:<wiki 文档路径>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
等待用户确认完成后,进入 Stage 1。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
12
45
|
## Stage 1: Explore
|
|
13
46
|
1. Grep 入口:`src/main.*`、`src/App.*`、`pages/_app.*`、`index.html`
|
|
14
47
|
2. Grep 现有埋点:`ta\.track|thinkingdata|TA\.init|// @tracking`
|