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.
Files changed (29) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/src/cli/init.js +1 -1
  3. package/package.json +1 -1
  4. package/skills/data-integration-helper/SKILL.md +198 -0
  5. package/skills/data-integration-helper/references/android_sdk_faq.md +179 -0
  6. package/skills/data-integration-helper/references/c_sdk_compilation.md +83 -0
  7. package/skills/data-integration-helper/references/c_sdk_faq.md +416 -0
  8. package/skills/data-integration-helper/references/cocoscreator_sdk_faq.md +123 -0
  9. package/skills/data-integration-helper/references/cpp_server_sdk_faq.md +365 -0
  10. package/skills/data-integration-helper/references/index.md +56 -0
  11. package/skills/data-integration-helper/references/ios_sdk_faq.md +118 -0
  12. package/skills/data-integration-helper/references/java_sdk_faq.md +406 -0
  13. package/skills/data-integration-helper/references/javascript_sdk_faq.md +129 -0
  14. package/skills/data-integration-helper/references/logbus2_guide.md +307 -0
  15. package/skills/data-integration-helper/references/logbus2_parser_plugin.md +346 -0
  16. package/skills/data-integration-helper/references/minigame_sdk_faq.md +115 -0
  17. package/skills/data-integration-helper/references/miniprogram_sdk_faq.md +118 -0
  18. package/skills/data-integration-helper/references/python_sdk_faq.md +232 -0
  19. package/skills/data-integration-helper/references/restful_api_notes.md +72 -0
  20. package/skills/data-integration-helper/references/sdk_log_guide.md +314 -0
  21. package/skills/data-integration-helper/references/sdk_usage_notes.md +105 -0
  22. package/skills/data-integration-helper/references/unity_sdk_faq.md +115 -0
  23. package/skills/generate-tracking-code/SKILL.md +33 -10
  24. package/skills/generate-tracking-code/references/client-sdk-insert.md +33 -0
  25. package/skills/generate-tracking-code/references/server-sdk-insert.md +29 -0
  26. package/skills/generate-tracking-code/references/snippet-delivery.md +14 -7
  27. package/skills/generate-tracking-plan/SKILL.md +2 -2
  28. 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
  29. 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,416 @@
1
+ 本文按 C SDK v2.0.0 正式版整理,示例统一使用 `td_` 前缀 API。旧版 `ta_*` 接口、`ta_user_del()` 等命名仅适用于 1.x 历史项目;新项目请不要继续使用旧接口名。
2
+
3
+ 推荐方案为 `logging_consumer + LogBus`。`batch_consumer` 仍可用于特定场景,但存在内存缓存丢数风险;`debug_consumer` 仅用于接入调试;`async_batch_consumer` 属于历史兼容方案,新项目不再推荐。
4
+
5
+ # 一、环境配置
6
+
7
+ 当前正式版为 `v2.0.0`,源码下载地址:[源代码](https://github.com/ThinkingDataAnalytics/c-sdk)。如需从源码编译,请参考服务端C-SDK编译流程。新建 C 项目后,将 SDK 头文件和编译产物引入工程。
8
+
9
+ ```c
10
+ #include <thinkingdata.h>
11
+ ```
12
+
13
+ #### logging_consumer样例代码
14
+
15
+ ```c
16
+ #include <stdio.h>
17
+ #include <string.h>
18
+ #include <time.h>
19
+
20
+ #include <thinkingdata.h>
21
+
22
+ int main(void) {
23
+ struct TDAnalytics *ta = NULL;
24
+ struct TDConsumer *consumer = NULL;
25
+ TDConfig *config = td_init_config();
26
+ TDProperties *properties = NULL;
27
+ const char *log_directory = "./log";
28
+ const char *account_id = "user_10001";
29
+ const char *distinct_id = "device_10001";
30
+
31
+ if (config == NULL) {
32
+ return 1;
33
+ }
34
+
35
+ TD_ASSERT(TD_OK == td_add_string("file_path", log_directory, strlen(log_directory), config));
36
+ TD_ASSERT(TD_OK == td_add_int("rotate_mode", HOURLY, config));
37
+ TD_ASSERT(TD_OK == td_add_int("file_size", 1024, config));
38
+
39
+ if (TD_OK != td_init_consumer(&consumer, config)) {
40
+ td_free_properties(config);
41
+ fprintf(stderr, "Failed to initialize consumer.\n");
42
+ return 1;
43
+ }
44
+ td_free_properties(config);
45
+
46
+ if (TD_OK != td_init(consumer, &ta)) {
47
+ td_consumer_free(consumer);
48
+ fprintf(stderr, "Failed to initialize SDK.\n");
49
+ return 1;
50
+ }
51
+
52
+ properties = td_init_properties();
53
+ if (properties == NULL) {
54
+ td_free(ta);
55
+ td_consumer_free(consumer);
56
+ return 1;
57
+ }
58
+
59
+ TD_ASSERT(TD_OK == td_add_string("#ip", "192.168.1.1", strlen("192.168.1.1"), properties));
60
+ TD_ASSERT(TD_OK == td_add_string("channel", "logbus", strlen("logbus"), properties));
61
+ TD_ASSERT(TD_OK == td_add_int("amount", 30, properties));
62
+ TD_ASSERT(TD_OK == td_add_bool("is_success", TD_TRUE, properties));
63
+ TD_ASSERT(TD_OK == td_add_date("pay_time", time(NULL), 0, properties));
64
+
65
+ TD_ASSERT(TD_OK == td_track(account_id, distinct_id, "order_paid", properties, ta));
66
+
67
+ td_free_properties(properties);
68
+ td_free(ta);
69
+ td_consumer_free(consumer);
70
+ return 0;
71
+ }
72
+ ```
73
+
74
+ #### batch_consumer样例代码
75
+
76
+ > `batch_consumer` 适用于中小数据量、链路稳定且可以接受内存缓存的场景。新项目仍然优先推荐 `logging_consumer + LogBus`。
77
+
78
+ ```c
79
+ #include <stdio.h>
80
+ #include <string.h>
81
+ #include <time.h>
82
+
83
+ #include <thinkingdata.h>
84
+
85
+ int main(void) {
86
+ struct TDAnalytics *ta = NULL;
87
+ struct TDConsumer *consumer = NULL;
88
+ TDConfig *config = td_init_config();
89
+ TDProperties *properties = NULL;
90
+ const char *appid = "APPID";
91
+ const char *server_url = "https://receiver.example.com";
92
+
93
+ if (config == NULL) {
94
+ return 1;
95
+ }
96
+
97
+ TD_ASSERT(TD_OK == td_add_string("push_url", server_url, strlen(server_url), config));
98
+ TD_ASSERT(TD_OK == td_add_string("appid", appid, strlen(appid), config));
99
+ TD_ASSERT(TD_OK == td_add_int("batch_size", 20, config));
100
+ TD_ASSERT(TD_OK == td_add_int("max_cache_size", 50, config));
101
+
102
+ if (TD_OK != td_init_consumer(&consumer, config)) {
103
+ td_free_properties(config);
104
+ fprintf(stderr, "Failed to initialize consumer.\n");
105
+ return 1;
106
+ }
107
+ td_free_properties(config);
108
+
109
+ if (TD_OK != td_init(consumer, &ta)) {
110
+ td_consumer_free(consumer);
111
+ fprintf(stderr, "Failed to initialize SDK.\n");
112
+ return 1;
113
+ }
114
+
115
+ properties = td_init_properties();
116
+ if (properties == NULL) {
117
+ td_free(ta);
118
+ td_consumer_free(consumer);
119
+ return 1;
120
+ }
121
+
122
+ TD_ASSERT(TD_OK == td_add_int("amount", 30, properties));
123
+ TD_ASSERT(TD_OK == td_add_date("pay_time", time(NULL), 0, properties));
124
+ TD_ASSERT(TD_OK == td_track("account_id", "distinct_id", "order_paid", properties, ta));
125
+
126
+ td_free_properties(properties);
127
+ td_flush(ta);
128
+ td_free(ta);
129
+ td_consumer_free(consumer);
130
+ return 0;
131
+ }
132
+ ```
133
+
134
+ #### debug_consumer样例代码
135
+
136
+ > `debug_consumer` 只用于接入联调。严禁在生产环境使用。
137
+
138
+ ```c
139
+ #include <stdio.h>
140
+ #include <string.h>
141
+
142
+ #include <thinkingdata.h>
143
+
144
+ int main(void) {
145
+ struct TDAnalytics *ta = NULL;
146
+ struct TDConsumer *consumer = NULL;
147
+ TDConfig *config = td_init_config();
148
+ TDProperties *properties = NULL;
149
+ const char *appid = "APPID";
150
+ const char *server_url = "https://receiver.example.com";
151
+
152
+ td_enableLog(1);
153
+
154
+ if (config == NULL) {
155
+ return 1;
156
+ }
157
+
158
+ TD_ASSERT(TD_OK == td_add_int("debug_mode", 0, config));
159
+ TD_ASSERT(TD_OK == td_add_string("device_id", "123456789", strlen("123456789"), config));
160
+ TD_ASSERT(TD_OK == td_add_string("push_url", server_url, strlen(server_url), config));
161
+ TD_ASSERT(TD_OK == td_add_string("appid", appid, strlen(appid), config));
162
+
163
+ if (TD_OK != td_init_consumer(&consumer, config)) {
164
+ td_free_properties(config);
165
+ fprintf(stderr, "Failed to initialize consumer.\n");
166
+ return 1;
167
+ }
168
+ td_free_properties(config);
169
+
170
+ if (TD_OK != td_init(consumer, &ta)) {
171
+ td_consumer_free(consumer);
172
+ fprintf(stderr, "Failed to initialize SDK.\n");
173
+ return 1;
174
+ }
175
+
176
+ properties = td_init_properties();
177
+ if (properties == NULL) {
178
+ td_free(ta);
179
+ td_consumer_free(consumer);
180
+ return 1;
181
+ }
182
+
183
+ TD_ASSERT(TD_OK == td_add_string("#device_id", "123456789", strlen("123456789"), properties));
184
+ TD_ASSERT(TD_OK == td_track("account_id", "distinct_id", "debug_test", properties, ta));
185
+
186
+ td_free_properties(properties);
187
+ td_free(ta);
188
+ td_consumer_free(consumer);
189
+ return 0;
190
+ }
191
+ ```
192
+
193
+ # 二、工作原理
194
+
195
+ #### **C SDK支持几种工作模式?分别适用于什么场景?**
196
+
197
+ 当前面向新项目时,可以按"推荐模式"和"历史兼容模式"理解:
198
+
199
+ 1. `logging_consumer`:正式环境推荐模式。数据先落本地文件,再由 LogBus 传输,可靠性最高。
200
+ 2. `batch_consumer`:受限可用模式。适合中小流量、网络稳定、可接受内存缓存风险的场景。
201
+ 3. `debug_consumer`:调试模式。只用于接入联调,不用于生产环境。
202
+ 4. `async_batch_consumer`:历史兼容模式。仅旧项目维护时参考,新项目不再推荐。
203
+
204
+ #### **如何获取上报地址和APP_ID?**
205
+
206
+ 项目管理者可以在 TE 后台进入"项目管理 > 项目配置 > 接入配置"获取 `APPID` 与上报地址。
207
+
208
+ - 云服务环境:使用平台提供的 HTTPS 上报地址。
209
+ - 私有化环境:建议为数据接入地址绑定域名并配置 HTTPS 证书。
210
+ - 内网联调场景:请直接使用运维确认后的内网地址,不要把公网地址硬编码进生产配置。
211
+
212
+ #### **logging_consumer的工作原理是什么?有哪些配置参数?**
213
+
214
+ `logging_consumer` 在 SDK 侧负责把数据可靠写入本地文件,LogBus 负责监听目录并完成上传。业务线程与网络传输解耦,因此正式环境更稳健。
215
+
216
+ | 参数 | 描述 | 默认值 | 取值范围 | 备注 |
217
+ |------|------|--------|----------|------|
218
+ | `file_path` | 日志文件写入目录 | 无 | 字符串 | 必填,建议映射到持久化磁盘 |
219
+ | `rotate_mode` | 日志切分模式 | `HOURLY` | `HOURLY` / `DAILY` | 配合日志量选择 |
220
+ | `file_prefix` | 日志文件名前缀 | 无 | 字符串 | 用于区分业务或实例 |
221
+ | `file_size` | 按文件大小切分阈值 | `0` | 整数 | 单位 MB,`0` 表示不按大小切分 |
222
+
223
+ #### **batch_consumer的工作原理是什么?有哪些配置参数?**
224
+
225
+ `batch_consumer` 在内存中聚合数据,达到阈值后再发起网络请求。若网络失败,数据会先留在内存缓存中;当缓存超过上限时,最旧批次会被丢弃。
226
+
227
+ | 参数 | 描述 | 默认值 | 取值范围 | 备注 |
228
+ |------|------|--------|----------|------|
229
+ | `batch_size` | 单批次上报条数 | `20` | 整数 | 批次越大,单次请求耗时越高 |
230
+ | `timeout` | 请求超时时长 | `30` | 整数 | 单位秒 |
231
+ | `max_cache_size` | 最大缓存批次数 | `50` | 整数 | 达到上限后会淘汰最旧批次 |
232
+ | `appid` | 项目 APPID | 无 | 字符串 | 必填 |
233
+ | `push_url` | 数据上报地址 | 无 | 字符串 | 必填,建议 HTTPS |
234
+
235
+ #### **debug_consumer的工作原理是什么?有哪些配置参数?**
236
+
237
+ `debug_consumer` 逐条发起请求,并对数据格式做更严格的校验。由于每条数据都会走网络请求,因此只能在联调阶段使用。
238
+
239
+ | 参数 | 描述 | 默认值 | 取值范围 | 备注 |
240
+ |------|------|--------|----------|------|
241
+ | `push_url` | 数据上报地址 | 无 | 字符串 | 必填 |
242
+ | `appid` | 项目 APPID | 无 | 字符串 | 必填 |
243
+ | `timeout` | 请求超时时长 | `30` | 整数 | 单位秒 |
244
+ | `device_id` | Debug 设备标识 | 无 | 字符串 | 需在 TE 后台配置同一设备 ID |
245
+ | `debug_mode` | 是否入库 | `0` | `0` / `1` | `0` 表示入库,`1` 表示仅校验不入库 |
246
+
247
+ # 三、常见问题
248
+
249
+ #### **使用 logging_consumer 有哪些注意事项?**
250
+
251
+ - 推荐和 LogBus 配合使用,这是服务端正式环境的标准方案。
252
+ - `file_path` 应指向具备写权限且可持久化的目录,容器环境建议挂载外部卷。
253
+ - 磁盘容量需要有监控和清理策略,避免写满后无法继续落盘。
254
+ - 不同进程不要写同一个日志文件;多进程场景请拆分目录或文件前缀。
255
+ - 网络文件系统(如 NFS)需要重点评估写入时延和抖动,避免成为瓶颈。
256
+
257
+ #### **logging_consumer 是否支持多线程?是否支持多进程?**
258
+
259
+ 支持多线程。SDK 内部会保证单进程内的线程安全。不支持多个进程同时写入同一个日志文件。多进程场景请为每个进程分配独立文件或目录。
260
+
261
+ #### **logging_consumer 是否存在丢数风险?如何避免?**
262
+
263
+ 存在边界风险,主要来自磁盘写满、宿主机异常退出、容器未挂载持久化卷等情况。建议:
264
+
265
+ 1. 监控日志目录容量并设置归档或清理策略。
266
+ 2. 根据写入量设置合理的切分策略,避免单文件过大。
267
+ 3. 容器部署时把日志目录映射到宿主机或持久化存储。
268
+ 4. 关闭进程前调用 `td_free()` 和 `td_consumer_free()`,确保资源正常释放。
269
+
270
+ #### **batch_consumer 为什么会存在丢数风险?如何避免?**
271
+
272
+ 因为 `batch_consumer` 依赖内存缓存,进程崩溃、宿主机异常退出或持续网络失败都可能导致未发送数据丢失。建议:
273
+
274
+ 1. 正式环境优先使用 `logging_consumer + LogBus`。
275
+ 2. 如果必须使用 `batch_consumer`,适度提高 `max_cache_size`,但要同步评估内存占用。
276
+ 3. 不要把 `batch_size` 调得过大,避免单次发送时间过长。
277
+ 4. 在进程退出前显式调用 `td_flush()`。
278
+
279
+ #### **batch_consumer 适合在什么场景下使用?**
280
+
281
+ 它更适合中小数据量、部署链路简单、网络稳定且可接受少量缓存风险的场景。
282
+
283
+ #### **debug_consumer 为什么在生产环境禁用?**
284
+
285
+ 因为它会逐条发送并做严格校验,连接开销高、吞吐低,还可能放大线上日志噪音,只适合开发联调。
286
+
287
+ #### **什么时候需要调用 `ta_free()` 方法?**
288
+
289
+ `ta_free()` 是 1.x 的旧函数名,v2 对应为 `td_free()`。在程序正常结束前调用 `td_free()`,随后调用 `td_consumer_free()`,确保 SDK 内部资源与缓存被正确释放。
290
+
291
+ #### **在程序中调用了 `ta_track()` 或者 `ta_user_set()` 方法, 为什么在 TE 后台没有看到数据?**
292
+
293
+ `ta_track()` / `ta_user_set()` 为旧版命名,v2 对应 `td_track()` / `td_user_set()`。排查顺序建议如下:
294
+
295
+ - 检查 `push_url` 和 `appid` 是否匹配。
296
+ - 如果使用 `batch_consumer`,确认是否达到 `batch_size`,或是否已经手动调用 `td_flush()`。
297
+ - 检查错误数据和校验日志。
298
+ - 检查事件时间是否超出服务端接收范围。
299
+ - 检查项目是否启用了埋点方案限制、历史通道或 IP 白名单。
300
+
301
+ #### **上报数据中为什么没有 "#ip"?**
302
+
303
+ 服务端 SDK 不会自动采集客户端 IP。若需要地理位置解析,请在事件属性中显式设置 `#ip`:
304
+
305
+ ```c
306
+ TDProperties *properties = td_init_properties();
307
+ TD_ASSERT(TD_OK == td_add_string("#ip", "192.168.1.1", strlen("192.168.1.1"), properties));
308
+ TD_ASSERT(TD_OK == td_track("account_id", "distinct_id", "order_paid", properties, ta));
309
+ ```
310
+
311
+ # 四、预置属性、特殊类型上报
312
+
313
+ 以下预置属性会出现在 C SDK 事件中,其中 `#ip` 需要业务侧手动设置,其余地理信息由平台根据 IP 衍生。
314
+
315
+ | 属性名 | 中文名 | 类型 | 说明 |
316
+ |--------|--------|------|------|
317
+ | `#ip` | IP 地址 | 文本 | 需要业务手动设置 |
318
+ | `#country` | 国家 | 文本 | 根据 IP 解析 |
319
+ | `#country_code` | 国家代码 | 文本 | 根据 IP 解析 |
320
+ | `#province` | 省份 | 文本 | 根据 IP 解析 |
321
+ | `#city` | 城市 | 文本 | 根据 IP 解析 |
322
+ | `#lib` | SDK 类型 | 文本 | 平台自动补充 |
323
+ | `#lib_version` | SDK 版本 | 文本 | 平台自动补充 |
324
+
325
+ #### **C SDK 如何上报对象和对象组类型?**
326
+
327
+ 复杂类型的完整说明可参考服务端 SDK 复杂类型上报。基本示例如下:
328
+
329
+ ```c
330
+ TDProperties *properties = td_init_properties();
331
+ TDProperties *object = td_init_custom_properties("object");
332
+ TDProperties *group_item = td_init_custom_properties("group_item");
333
+
334
+ TD_ASSERT(TD_OK == td_add_string("key", "value", strlen("value"), object));
335
+ TD_ASSERT(TD_OK == td_add_property(object, properties));
336
+
337
+ TD_ASSERT(TD_OK == td_add_string("name", "item_1", strlen("item_1"), group_item));
338
+ TD_ASSERT(TD_OK == td_append_properties("object_arr", group_item, properties));
339
+ ```
340
+
341
+ #### **某属性首次上报为空值,应该如何上报?**
342
+
343
+ 对象组可以通过"空对象"方式上报,数组可以通过"空数组"方式上报:
344
+
345
+ 对象组:
346
+
347
+ ```c
348
+ TDProperties *properties = td_init_properties();
349
+ TDProperties *obj = td_init_custom_properties("obj");
350
+ TD_ASSERT(TD_OK == td_append_properties("obj_array", obj, properties));
351
+ ```
352
+
353
+ 列表:
354
+
355
+ ```c
356
+ TDProperties *properties = td_init_properties();
357
+ TD_ASSERT(TD_OK == td_append_array("array", NULL, 0, properties));
358
+ ```
359
+
360
+ 对象、数值、文本、时间、布尔类型不支持直接上报 `NULL`。如需表达空值,请不要传该属性,让数据表中保持空值状态。
361
+
362
+ #### **公共属性**
363
+
364
+ 服务端公共属性不适合承载用户级强变更字段。多线程或多用户并发场景下,建议只在公共属性中放置区服、渠道、部署环境等相对稳定的信息,其余内容放入事件属性或用户属性。
365
+
366
+ #### **时区**
367
+
368
+ 如事件时间不是 UTC+8 且需要显式携带时区偏移,可在属性中增加 `#zone_offset`,其值为数值类型的小时偏移量。例如 UTC+0 可传 `0`。
369
+
370
+ #### **可更新事件**
371
+
372
+ 集群环境下,可更新事件可能出现近时间戳乱序。若业务强依赖顺序,建议在属性中增加一个数值型顺序字段,例如 `order`,并结合事务属性做幂等控制:
373
+
374
+ ```c
375
+ TDProperties *properties = td_init_properties();
376
+ TD_ASSERT(TD_OK == td_add_int("order", 2, properties));
377
+ TD_ASSERT(TD_OK == td_add_int("status", 5, properties));
378
+ TD_ASSERT(TD_OK == td_track_update("account_id", "distinct_id", "UPDATABLE_EVENT", "event_id", properties, ta));
379
+ ```
380
+
381
+ # 五、异常报错
382
+
383
+ #### **batch_consumer 能否获取上报失败的数据?**
384
+
385
+ SDK 不直接暴露失败缓存队列。失败数据会先留在内存缓存中,达到上限后最旧批次会被淘汰。因此更稳妥的做法仍然是使用 `logging_consumer + LogBus`,把持久化和传输解耦。
386
+
387
+ #### **由于客户服务器环境不一致,C SDK工程中的 curl 和 pcre 两个库文件编译报错,如何处理?**
388
+
389
+ `curl` 和 `pcre` 都是独立的开源依赖。遇到平台兼容问题时,建议按目标环境重新下载源码并编译:
390
+
391
+ - `curl`:https://curl.se
392
+ - `pcre`:http://www.pcre.org
393
+
394
+ #### **sdk编译windows版本也依赖pthread库吗?**
395
+
396
+ 如果当前工程要求兼容 `c89` / `c90`,请避免继续依赖需要更高线程支持的历史方案,优先改用 `logging_consumer`;如果必须保留直传能力,再评估 `batch_consumer` 的兼容性。
397
+
398
+ #### **C SDK 中使用的 libcurl 库是否会导致死锁或崩溃?**
399
+
400
+ 在网络较差的环境下,`libcurl` 超时配置不当可能引发异常信号问题。建议显式设置超时并关闭超时信号:
401
+
402
+ ```c
403
+ if (timeout_seconds > 0) {
404
+ curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout_seconds);
405
+ curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
406
+ }
407
+ ```
408
+
409
+ #### **CentOS 上报https地址报错:curl_easy_perform() failed: SSL connect error,如何处理?**
410
+
411
+ 这通常是 `curl` 侧的 SSL 环境问题,常见处理方式包括:
412
+
413
+ 1. 升级系统中的 `nss` / OpenSSL 相关依赖。
414
+ 2. 更新 CA 证书链。
415
+ 3. 确认服务端证书与域名绑定是否正确。
416
+ 4. 在内网排障阶段,可先用 `curl` 单独验证目标地址的 TLS 握手是否正常。
@@ -0,0 +1,123 @@
1
+ ---
2
+ title: "Cocos Creator SDK FAQ"
3
+ code: "cocoscreator_sdk_faq"
4
+ source: "Feishu MCP"
5
+ doc_id: "IeC9wKCp7i2edwkVQ9Oc3YrJnYf"
6
+ fetched_at: "2026-04-20T17:29:40Z"
7
+ ---
8
+
9
+ > CocosCreator SDK 支持多平台,本文主要介绍除 Android/iOS 外其他平台的常见问题。
10
+
11
+ # 初始化 SDK
12
+ ## 推荐 SDK 初始化位置
13
+ - 建议在用户同意隐私协议后再进行 SDK 初始化
14
+
15
+ ## 常见问题
16
+ ### 延迟初始化会导致自动采集事件时间延迟
17
+ ### 设备无网络 SDK 初始化不会失败
18
+
19
+ # SDK 数据上报策略
20
+ ## 实时上报
21
+ - 默认采集后立即上报,失败重试 3 次
22
+
23
+ ## 定时批量上报
24
+ ```javascript
25
+ var config = {
26
+ appId: "APP_ID",
27
+ serverUrl: "SERVER_URL",
28
+ enableBatch: true,
29
+ batchConfig: {
30
+ size: 20,
31
+ interval: 10000,
32
+ storageLimit: 100
33
+ }
34
+ };
35
+ TDAnalytics.init(config);
36
+ ```
37
+
38
+ # SDK 缓存机制
39
+ ## 存储位置
40
+ - 小游戏:调用 setStorage 接口存储在 Storage 中
41
+ - Web/H5:使用 localStorage 存储
42
+
43
+ ## 缓存数量限制
44
+ - 默认最大缓存 200 条
45
+
46
+ # 访客 ID(#distinct_id)
47
+ ## 默认格式
48
+ - 随机数-当前时间戳
49
+
50
+ ## 长度限制
51
+ - 最大长度 128 位
52
+
53
+ # Debug 模式
54
+ ## debugMode 三种取值
55
+ - none:Normal 模式
56
+ - debug:数据在 TE Debug 模式中看到
57
+ - debugOnly:只校验,不入库
58
+
59
+ # 自动采集事件
60
+ ## ta_mg_show(小游戏)
61
+ - 小游戏启动、后台回到前台时触发
62
+
63
+ ## ta_page_show(Web/H5)
64
+ - 页面打开、刷新、标签切换时触发
65
+ - 监听 visibilitychange 事件
66
+
67
+ ## ta_mg_hide(小游戏)
68
+ - 前台切换到后台时触发
69
+ - #duration 为时差
70
+
71
+ ## ta_page_hide(Web/H5)
72
+ - 标签页关闭、刷新、切换时触发
73
+ - #duration 为时差
74
+
75
+ # 公共事件属性
76
+ ## 静态公共事件属性
77
+ ```javascript
78
+ TDAnalytics.setSuperProperties({ channel: "渠道名" });
79
+ ```
80
+
81
+ ## 动态公共事件属性
82
+ ```javascript
83
+ TDAnalytics.setDynamicSuperProperties(function() {
84
+ return { date: new Date() };
85
+ });
86
+ ```
87
+
88
+ ## 属性优先级
89
+ - 用户自定义 > 动态公共 > 静态公共
90
+
91
+ # 预置属性
92
+ ## 设备 ID(#device_id)
93
+ - 默认和访客 ID 一致
94
+
95
+ ## IP 地址(#ip)
96
+ - 服务端从请求头解析
97
+ - 可手动上报 #ip
98
+
99
+ # 其他
100
+ ## 设置时区
101
+ ```javascript
102
+ var config = {
103
+ appId: "APP_ID",
104
+ serverUrl: "SERVER_URL",
105
+ zoneOffset: 6
106
+ };
107
+ ```
108
+
109
+ ## 暂停数据上报
110
+ - setTrackStatus 方法传 PAUSE、STOP、SAVE_ONLY、NORMAL
111
+
112
+ # 常见问题
113
+ ## 报错 Uncaught ReferenceError: module is not defined
114
+ - 删除 thinkingdata.mg.cocoscreator.min.js 中的 module.exports
115
+
116
+ ## 打包 Android/iOS 有 ta_page_show 但没有 ta_page_hide
117
+ - 需要开启原生支持才能使自动采集生效
118
+
119
+ ## 报错 TDAnalytics is not defined
120
+ - 取消 SDK 脚本的"插件"选项勾选
121
+
122
+ # 已知问题
123
+ 详见文档完整内容。