menu
Is this helpful?

# C

TIP

実装する前にデータアクセスの準備を確認しておいてください。

最新バージョン:v2.0.0

更新時間:2023-11-30

ダウンロードSource Code (opens new window)

# SDK実装

  1. 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ファイルを取得します。

  1. 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);