C
연동하기 전에 먼저 연동 전 준비를 읽어 주십시오.
최신 버전: v2.0.0
업데이트 시간: 2023-11-30
리소스 다운로드: 소스 코드
이 문서는 v2.0.0 이상 버전에 적용됩니다. 과거 버전은 C SDK 연동 가이드(V1)를 참고하십시오
1. SDK 통합
- C SDK 소스 코드를 다운로드하고
CMakeLists.txt파일을 수정한 후logconsumer방식으로 .a 파일을 컴파일합니다
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 설치
SDK+LogBus 방식으로 서버 측 데이터 수집 및 전송을 완료하는 것을 권장합니다. 다음 문서를 참고하여 Logbus를 설치할 수 있습니다: 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.");
return 1;
}
td_free_properties(config);
if (TD_OK != td_init(consumer, &ta)) {
fprintf(stderr, "Failed to initialize the SDK.");
return 1;
}
LOG_DIRECTORY는 로컬에 기록할 폴더 경로입니다. LogBus의 모니터링 폴더 경로를 이 경로로 설정하기만 하면 LogBus로 데이터를 모니터링하고 업로드할 수 있습니다.
3. 자주 사용하는 기능
게스트 ID와 계정 ID가 정상적으로 바인딩되도록, 게임에서 게스트 ID와 계정 ID를 모두 사용하는 경우 두 ID를 함께 전송할 것을 강력히 권장합니다. 그렇지 않으면 계정을 매칭할 수 없어 유저가 중복 집계될 수 있습니다. 구체적인 ID 바인딩 규칙은 유저 식별 규칙 장을 참고하십시오.
3.1 이벤트 전송
td_track을 호출하여 이벤트를 전송할 수 있습니다. 앞서 정리한 문서에 따라 이벤트 속성과 정보 전송 조건을 설정하는 것을 권장합니다. 다음은 이벤트 전송 예시 코드입니다.
// 커스텀 속성 생성
TDProperties *properties = td_init_properties();
// 유저의 ip 주소 설정(AE 시스템은 IP 주소를 해석하여 유저의 지리적 위치 정보를 얻음)
TD_ASSERT(TD_OK == td_add_string("#ip", "192.168.1.1", strlen("192.168.1.1"), properties));
// 커스텀 속성 추가
TD_ASSERT(TD_OK == td_add_string("channel", "ta", strlen("ta"), properties));//문자열
TD_ASSERT(TD_OK == td_add_int("age", 1, properties)); //숫자
TD_ASSERT(TD_OK == td_add_bool("is_success", TD_TRUE, properties));//불리언
TD_ASSERT(TD_OK == td_add_date("birthday", time(NULL), 0, properties));//시간
// 배열
TD_ASSERT(TD_OK == td_append_array("arr", "value", strlen("value"), properties));
TD_ASSERT(TD_OK == td_append_array("arr", "value1", strlen("value1"), properties));
// 객체
TDProperties *object = td_init_custom_properties("object");
TD_ASSERT(TD_OK == td_add_string("key", "value", strlen("value"), object));
TD_ASSERT(TD_OK == td_add_property(object, properties));
// 객체 그룹
TDProperties *object1 = td_init_custom_properties("object1");
TD_ASSERT(TD_OK == td_add_string("key", "value", strlen("value"), object1));
TD_ASSERT(TD_OK == td_append_properties("object_arr", object1, properties));
// 커스텀 속성을 포함한 이벤트 데이터 전송(마찬가지로 account_id와 distinct_id 중 하나 이상을 반드시 설정해야 함)
TD_ASSERT(TD_OK == td_track("account_id", "distinct_id", "payment", properties, ta));
td_free_properties(properties);
- 이벤트 이름은 문자열 타입이며, 영문자로 시작해야 하고 숫자, 영문자, 밑줄 "_"을 포함할 수 있으며, 최대 길이는 50자입니다.
- Key는 해당 속성의 이름으로 문자열 타입입니다. 영문자로 시작해야 하며 숫자, 영문자, 밑줄 "_"을 포함할 수 있고, 최대 길이는 50자입니다. 대소문자를 구분하지 않으며 AE에서 모두 소문자로 변환합니다
- Value는 해당 속성의 값으로 문자열, 숫자, 불리언, 시간, 객체, 객체 그룹, 배열을 지원합니다
유저 속성의 요구 사항은 이벤트 속성과 같습니다
3.2 유저 속성 설정
일반적인 유저 속성은 td_user_set을 호출하여 설정할 수 있습니다. 이 인터페이스로 전송한 속성은 원래 속성 값을 덮어쓰며, 이전에 해당 유저 속성이 없었다면 새로 생성하고 타입은 전달된 속성의 타입과 같습니다. 여기서는 사용자 이름 설정을 예로 듭니다.
// 이때 user_name은 TA
// account_id와 distinct_id 중 하나 이상을 반드시 설정해야 함
TDProperties *user_properties = td_init_properties();
TD_ASSERT(TD_OK == td_add_string("user_name", "TA", strlen("TA"), user_properties));
TD_ASSERT(TD_OK == td_user_set(account_id, distinct_id, user_properties,ta));
td_free_properties(user_properties);
// 이때 user_name은 AE
TDProperties *user_properties2 = td_init_properties();
TD_ASSERT(TD_OK == td_add_string("user_name", "AE", strlen("AE"), user_properties2));
TD_ASSERT(TD_OK == td_user_set(account_id, distinct_id, user_properties2,ta));
td_free_properties(user_properties2);
3.3 데이터 전송
td_init_consumer() 방식으로 SDK를 초기화하면 SDK는 수집한 데이터를 실시간으로 디스크에 기록합니다.
td_flush() 함수는 내부적으로 파일 시스템의 기본 메모리 캐시를 디스크에 실시간으로 동기화합니다. 일반적으로 수동으로 호출할 필요는 없습니다.
td_flush(ta);
3.4 SDK 종료
td_free(ta);
td_consumer_free(consumer);
SDK를 종료하고 빠져나옵니다. 캐시 안의 데이터가 유실되지 않도록 서버를 종료하기 전에 이 인터페이스를 호출하십시오
4. 모범 사례
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.");
return 1;
}
td_free_properties(config);
if (TD_OK != td_init(consumer, &ta)) {
fprintf(stderr, "Failed to initialize the SDK.");
return 1;
}
// 커스텀 속성 생성
TDProperties *properties = td_init_properties();
// 유저의 ip 주소 설정(AE 시스템은 IP 주소를 해석하여 유저의 지리적 위치 정보를 얻음)
TD_ASSERT(TD_OK == td_add_string("#ip", "192.168.1.1", strlen("192.168.1.1"), properties));
// 커스텀 속성 추가
TD_ASSERT(TD_OK == td_add_string("channel", "ta", strlen("ta"), properties));//문자열
TD_ASSERT(TD_OK == td_add_int("age", 1, properties)); //숫자
TD_ASSERT(TD_OK == td_add_bool("is_success", TD_TRUE, properties));//불리언
TD_ASSERT(TD_OK == td_add_date("birthday", time(NULL), 0, properties));//시간
// 배열
TD_ASSERT(TD_OK == td_append_array("arr", "value", strlen("value"), properties));
TD_ASSERT(TD_OK == td_append_array("arr", "value1", strlen("value1"), properties));
// 객체
TDProperties *object = td_init_custom_properties("object");
TD_ASSERT(TD_OK == td_add_string("key", "value", strlen("value"), object));
TD_ASSERT(TD_OK == td_add_property(object, properties));
// 객체 그룹
TDProperties *object1 = td_init_custom_properties("object1");
TD_ASSERT(TD_OK == td_add_string("key", "value", strlen("value"), object1));
TD_ASSERT(TD_OK == td_append_properties("object_arr", object1, properties));
// 커스텀 속성을 포함한 이벤트 데이터 전송(마찬가지로 account_id와 distinct_id 중 하나 이상을 반드시 설정해야 함)
TD_ASSERT(TD_OK == td_track("account_id", "distinct_id", "payment", properties, ta));
td_free_properties(properties);
// 이때 user_name은 TA
// account_id와 distinct_id 중 하나 이상을 반드시 설정해야 함
TDProperties *user_properties = td_init_properties();
TD_ASSERT(TD_OK == td_add_string("user_name", "TA", strlen("TA"), user_properties));
TD_ASSERT(TD_OK == td_user_set("account_id", "distinct_id", user_properties,ta));
td_free_properties(user_properties);
// 이때 user_name은 AE
TDProperties *user_properties2 = td_init_properties();
TD_ASSERT(TD_OK == td_add_string("user_name", "AE", strlen("AE"), user_properties2));
TD_ASSERT(TD_OK == td_user_set("account_id", "distinct_id", user_properties2,ta));
td_free_properties(user_properties2);

