# C
::: 팁
구현하기 전에 데이터 엑세스 준비를 확인하십시오.
:::
최신 버전:v2.0.0
업데이트 시간:2023-11-30
소스 코드:Source Code (opens new window)
# 1. SDK 액세스
- C SDK (opens new window)의 소스 코드를 다운로드하고,
CMakeLists.txt
파일을 변경하여logconsumer
를 컴파일합니다.
cmake_minimum_required(VERSION 3.12)
project(thinking_data_c)
message(STATUS "[ThinkingData] CMAKE_HOST_SYSTEM: ${CMAKE_HOST_SYSTEM} ")
include_directories(include)
#################################################################
# Product Library: logging consumer
if(WIN32)
add_compile_definitions(USE_WIN)
set(CMAKE_C_FLAGS "-std=c89 -pedantic-errors -m64")
else()
add_compile_definitions(USE_POSIX)
set(CMAKE_C_FLAGS "-std=c89")
endif()
SET(TE_LIB_NAME thinkingdata)
add_library(${TE_LIB_NAME} src/thinkingdata.c src/td_json.c src/td_list.c src/td_util.c src/td_logger_consumer.c)
if(WIN32)
include_directories(thirdparty/pcre/include)
link_directories(thirdparty/pcre/lib)
target_link_libraries(${TE_LIB_NAME} pcre_x64)
endif()
프로젝트를 컴파일하고, libthinkingdata.a
파일을 가져옵니다.
- Logbus 설치
TE 시스템을 통해 빠르고 정확한 데이터 전송을 위해, SDK와 LogBus를 함께 사용하여 서버 데이터의 데이터 리포트를 권장합니다.
# 2. 초기 설정
다음은 SDK의 초기 설정 포맷 코드입니다:
struct TDAnalytics* ta = NULL;
struct TDConsumer* consumer = NULL;
TDConfig* config = td_init_config();
char* logPath = "LOG_DIRECTORY";
TD_ASSERT(TD_OK == td_add_string("file_path", logPath, strlen(logPath), config));
if (TD_OK != td_init_consumer(&consumer, config)) {
fprintf(stderr, "Failed to initialize the consumer.");
}
td_free_properties(config);
if (TD_OK != td_init(consumer, &ta)) {
fprintf(stderr, "Failed to initialize the SDK.");
return 1;
}
LOG_DIRECTORY
는 로컬 액세스 파일의 주소가 됩니다. LogBus의 모니터 주소를 이 주소로 설정하면 자동으로 업로드됩니다.
# 3. 주요 기능
게스트 ID와 계정 ID를 정확하게 연동하기 위해, 게임 내에서 게스트 ID와 계정 ID를 모두 사용하는 경우, 이들 ID를 동시에 업로드하는 것을 권장합니다. 동시에 업로드하지 않을 경우, 유저가 중복으로 계산될 수 있습니다.
# 3.1 이벤트 전송
track
을 사용하여 이벤트 전송을 합니다. 사전에 데이터 트래킹 정책을 준비한 후, 전송해 주세요. 다음은 모델 코드입니다.
TAProperties *properties = ta_init_properties();
TA_ASSERT(TA_OK == ta_add_string("#ip", "192.168.1.1", strlen("192.168.1.1"), properties));
TA_ASSERT(TA_OK == ta_add_string("channel", "ta", strlen("ta"), properties));//string
TA_ASSERT(TA_OK == ta_add_int("age", 1, properties)); //number
TA_ASSERT(TA_OK == ta_add_bool("is_success", true, properties));//bool
TA_ASSERT(TA_OK == ta_add_date("birthday", time(NULL), 0, properties));//time
// array
TA_ASSERT(TA_OK == ta_append_array("arr", "value", strlen("value"), properties));
TA_ASSERT(TA_OK == ta_append_array("arr", "value1", strlen("value1"), properties));
// object
TAProperties *object = ta_init_custom_properties("object");
TA_ASSERT(TA_OK == ta_add_string("key", "value", strlen("value"), object));
TA_ASSERT(TA_OK == ta_add_property(object, properties));
// array object
TAProperties *object1 = ta_init_custom_properties("object1");
TA_ASSERT(TA_OK == ta_add_string("key", "value", strlen("value"), object1));
TA_ASSERT(TA_OK == ta_append_properties("object_arr", object1, properties));
TA_ASSERT(TA_OK == ta_track("account_id", "distinct_id", "payment", properties, ta));
ta_free_properties(properties);
- 이벤트 이름은 string 타입으로, 영문자와 숫자, "_"를 포함하며 최대 50자입니다.
- Key는 해당 속성의 이름으로 string 타입이며, 영문자와 숫자, "_"를 포함하여 최대 50자입니다. TE 시스템은 일괄적으로 소문자로 통일됩니다.
- Value는 해당 속성의 값으로, String, Number, Bloon, Time, object, array, list object를 지원합니다.
유저 속성은 이벤트 속성과 일치해야 합니다.
# 3.2 유저 속성 설정
일반적인 유저 속성에 대해서는 userSet
을 사용하여 설정할 수 있으며, UserSet은 기존의 값을 덮어씁니다. 원래 해당 속성에 값이 없는 경우, 속성이 새로 생성됩니다. 다음은 코드 예시입니다.
//유저 이름은 TA입니다
TAProperties *user_properties = ta_init_properties();
TA_ASSERT(TA_OK == ta_add_string("user_name", "TA", strlen("TA"), user_properties));
TA_ASSERT(TA_OK == ta_user_set(account_id, distinct_id, user_properties,ta));
ta_free_properties(user_properties);
//유저 이름은 TE입니다
TAProperties *user_properties2 = ta_init_properties();
TA_ASSERT(TA_OK == ta_add_string("user_name", "TE", strlen("TE"), user_properties2));
TA_ASSERT(TA_OK == ta_user_set(account_id, distinct_id, user_properties2,ta));
ta_free_properties(user_properties2);
# 4. 코드 예시 (Example Code)
아래의 코드 예시에 모든 작업이 포함되어 있으며, 아래 순서대로 사용하는 것을 권장합니다:
struct TDAnalytics* ta = NULL;
struct TDConsumer* consumer = NULL;
TDConfig* config = td_init_config();
char* logPath = "LOG_DIRECTORY";
TD_ASSERT(TD_OK == td_add_string("file_path", logPath, strlen(logPath), config));
if (TD_OK != td_init_consumer(&consumer, config)) {
fprintf(stderr, "Failed to initialize the consumer.");
}
td_free_properties(config);
if (TD_OK != td_init(consumer, &ta)) {
fprintf(stderr, "Failed to initialize the SDK.");
return 1;
}
// 유저의 IP 주소를 설정하고, TE는 IP 주소에 따라 유저의 지리적 위치 정보를 분석합니다.
TA_ASSERT(TA_OK == ta_add_string("#ip", "192.168.1.1", strlen("192.168.1.1"), properties));
TA_ASSERT(TA_OK == ta_add_string("channel", "ta", strlen("ta"), properties));//string
TA_ASSERT(TA_OK == ta_add_int("age", 1, properties)); //number
TA_ASSERT(TA_OK == ta_add_bool("is_success", true, properties));//bool
TA_ASSERT(TA_OK == ta_add_date("birthday", time(NULL), 0, properties));//datetime
//array
TA_ASSERT(TA_OK == ta_append_array("arr", "value", strlen("value"), properties));
TA_ASSERT(TA_OK == ta_append_array("arr", "value1", strlen("value1"), properties));
//object
TAProperties *object = ta_init_custom_properties("object");
TA_ASSERT(TA_OK == ta_add_string("key", "value", strlen("value"), object));
TA_ASSERT(TA_OK == ta_add_property(object, properties));
//array object
TAProperties *object1 = ta_init_custom_properties("object1");
TA_ASSERT(TA_OK == ta_add_string("key", "value", strlen("value"), object1));
TA_ASSERT(TA_OK == ta_append_properties("object_arr", object1, properties));
TA_ASSERT(TA_OK == ta_track("account_id", "distinct_id", "payment", properties, ta));
ta_free_properties(properties);
// 유저 속성 설정
TAProperties *user_properties = ta_init_properties();
TA_ASSERT(TA_OK == ta_add_string("user_name", "TA", strlen("TA"), user_properties));
TA_ASSERT(TA_OK == ta_user_set(account_id, distinct_id, user_properties,ta));
ta_free_properties(user_properties);
// flush API 호출 시 데이터가 즉시 파일에 기록됩니다.
// 프로덕션 환경에서는 flush 호출이 빈번하여 발생할 수 있는 IO 또는 네트워크 오버헤드에 주의하세요.
ta_flush(ta);