# C
TIP
実装する前にデータアクセスの準備を確認しておいてください。
最新バージョン:v2.0.0
更新時間:2023-11-30
ダウンロード:Source Code (opens new window)
# 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の併用でサーバデータのデータレポートを推奨しております。
# 初期設定
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のモニターアドレスをこのアドレスに設定すれば自動でアップロードされます。
# メイン機能
ゲスト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 ユーザープロパティを設定
一般のユーザープロパティに関しては、user_set
を利用して設定することができますが、 UserSetは元の値を上書きされます。本来該当プロパティに値がない場合は、プロパティが新規作成されます。以下はコード例となります。
//UserName is 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);
//UserName is 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);
# コード例のまとめ
以下のコード例で全ての操作が含まれます、以下の順で利用推奨しております。
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;
}
//Set the user's ip address, and TE will analyze the user's geographical location information according to the IP address
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);
//set user 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);
//Calling the flush API will immediately write the data to the file.
//In the production environment, pay attention to avoid IO or network overhead caused by frequent calls to flush
ta_flush(ta);