마케팅 어트리뷰션(Hive 사용자 추적 툴)은 Adjust, Singular, AppsFlyer를 동시에 적용하기 쉽도록 묶어 놓은 패키지이다. 프로젝트 별로 적용 여부를 따진 후, 각 모듈 별로 키를 발급해 적용한다.
- Adjust: https://www.adjust.com
- Singular: https://app.singular.net
- AppsFlyer: https://hq1.appsflyer.com/
Key 설정을 위해 마케팅 어트리뷰션 툴 가이드를 참고하세요.
기본으로 지원하는 기능은 아래와 같다.
- 게임 내 이벤트 추적
- 과금 추적
Tracking Module Initialize
- 모듈의 키 값과 이벤트 키 값을 설정
- 최초 모듈 초기화 시 발급받은 키 값을 입력하거나 Unity의 경우 키 값을 입력할 인스펙터를 제공함
필수 발급 키 값
- Adjust는 기본 Update와 Purchase, TutorialComplete용 키 값 발급 필요
- Singular는 별도의 키 값을 발급할 필요 없이 코드에 추가해서 사용
TutorialComplete를 제외한 다른 값(Purchase, Install, Open, Update)은 모듈에서 호출하기 때문에 게임 내에서는 호출하지 않아야 한다. 단, Adjust의 경우 Update에 대한 키 값을 발급받아 클라이언트에서 따로 키 값을 추가해주어야 한다.
트래킹 모듈의 키 값 설정 시 Adjust는 발급받은 이벤트 토큰(Token) 값을 입력해야 한다. Singular는 Singular 콘솔 페이지에서 별도 발급 및 추가 없이 코드에서 원하는 키 값을 추가하여 사용하면 해당 키 값이 집계된다.
C2SModuleTracker_SendEvent
이벤트를 전송한다.
argument type | type | desc | platform | 비고 |
---|---|---|---|---|
event | string | 이벤트 이름은 Initialize에서 Matching에 설정한 키로 사용 |
all | 1.5.0 |
revenue | Dictionary (unity) | 설정할 경우 수익 측정 이벤트를 발생 | all | 1.5.0 |
key-value for revenue
argument type | type | desc | platform | 비고 |
---|---|---|---|---|
title | string | (필수) 상품 이름 | all | 1.5.0 |
description | string | (필수) 상품 설명 | all | 1.5.0 |
currency | string | (필수) 통화 코드 (https://en.wikipedia.org/wiki/ISO_4217) 규격에 맞게 입력 (대문자로 사용) |
all | 1.5.0 |
price | string | (필수) 상품 가격 (float 형태) | all | 1.5.0 |
itemCount | int | (필수) 상품 개수 | all | 1.5.0 |
transactionId | string | 중복구매방지 refId 안드로이드 : order Id iOS : (영수증 검증 이후의) transactionId |
all | 1.11.3+ |
Returns
YES일 경우 성공, NO일 경우 실패
C2SModuleTracker_SetEnable
Tracker의 이벤트 전송에 대한 활성화 여부를 설정한다.
argument type | type | desc | platform | 비고 |
---|---|---|---|---|
Adjust | bool | Adjust모듈의 이벤트 전송 활성화 여부 | all | 1.5.0 |
Singular | bool | Singular모듈의 이벤트 전송 활성화 여부 | all | 1.5.0 |
AppsFlyer | bool | AppsFlyer모듈의 이벤트 전송 활성화 여부 | all | 1.19.8+ |
Returns
YES일 경우 성공, NO일 경우 실패
샘플 코드
public static bool C2SModule.Tracker.SendEvent(C2SModule.Parameter arg, out C2SModule.Error error,
C2SModule.CompletionHandler completionHandler);
– 사용자 추적툴 이벤트 발생
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[일반 이벤트 사용시] C2SModule.Error error; C2SModule.Parameter arg; arg["event"] = "TutorialComplete"; if( !C2SModule.Tracker.SendEvent( arg, out error ) ) { // Error 시 처리 } [수익 측정 이벤트 사용시] C2SModule.Error error; Dictionary<string,object> revenueArg = new Dictionary<string,object>(); revenueArg["title"] = "item1"; revenueArg["description"] = "item1 desc"; revenueArg["currency"] = "USD"; revenueArg["price"] = "0.99"; revenueArg["itemCount"] = 1; C2SModule.Parameter arg; arg["event"] = "Purchase"; //< 사전 정의된 이벤트 이름. arg["revenue"] = revenueArg; if( !C2SModule.Tracker.SendEvent( arg, out error ) ) { // Error 시 처리 } |
public static bool C2SModule.Tracker.SetEnable(C2SModule.Parameter arg, out C2SModule.Error error,
C2SModule.CompletionHandler completionHandler);
– 사용자 추적툴 사용여부 설정
1 2 3 4 5 6 7 8 |
C2SModule.Error error; C2SModule.Parameter arg; arg["Adjust"] = true; arg["Singular"] = true; arg["AppsFlyer"] = true; if( !C2SModule.Tracker.SetEnable( arg, out error ) ) { // Error 시 처리 } |
– 사용자 추적툴 이벤트 발생
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[일반 이벤트 보내는 예시] TSharedPtr< FJsonObject> arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("event"), TEXT("TutorialComplete")); FString OutputString; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUETracker_SendEvent(OutputString); [수익 측정 이벤트 예시] TSharedPtr< FJsonObject> arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("event"), TEXT("Purchase")); TSharedPtr< FJsonObject> argRevenueInfo = MakeShareable(new FJsonObject); argRevenueInfo->SetStringField(TEXT("title"), TEXT("potion")); argRevenueInfo->SetStringField(TEXT("description"), TEXT("potion")); argRevenueInfo->SetNumberField(TEXT("itemCount"), 1); argRevenueInfo->SetStringField(TEXT("currency"), TEXT("KRW")); argRevenueInfo->SetStringField(TEXT("price"), TEXT("1000")); arg->SetObjectField(TEXT("revenue"),argRevenueInfo); FString OutputString; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUETracker_SendEvent(OutputString); |
– 사용자 추적툴 사용여부 설정
1 2 3 4 5 6 7 8 9 |
TSharedPtr< FJsonObject> arg = MakeShareable(new FJsonObject); arg->SetBoolField(TEXT("Adjust"), true); // true : 사용, false : 사용 안 함 arg->SetBoolField(TEXT("Singular"), true); FString OutputString; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUETracker_SetEnable(OutputString); |
+(BOOL)SetEnable:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*))
completionHandler;
– 사용자 추적툴 이벤트 발생
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[일반 이벤트 보내는 예시] -(void)tutorialComplete { NSError* error = nil; NSDictionary* arg = @{@"event":@"TutorialComplete"}; [C2STracker SendEvent:arg error:&error completionHandler:^(NSDictionary *, NSError *) { //이벤트 완료. }]; } [수익 측정 이벤트 예시] -(void)revenueEvent { NSError* error = nil; NSDictionary* arg = @{@"event":@"Purchase", @"revenue":@{ @"title"", //아이템이름 @"description":@"item1", //아이템설명 @"currency":@"USD", //커런시코드 @"price":@"0.99", //아이템가격 @"itemCount":@1, //아이템 수량 } }; [C2STracker SendEvent:arg error:&error completionHandler:^(NSDictionary *, NSError *) { //이벤트 완료. }]; } |
+(BOOL)SetEnable:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*))
completionHandler;
– 사용자 추적툴 사용여부 설정
1 2 3 4 5 6 7 8 |
NSError* error = nil; NSDictionary* arg = @{@"Singular":@true, @"Adjust":@true, @"AppsFlyer":@true}; //true false로 사용여부 설정. [C2SModuleTracker SetEnable:arg error:&error completionHandler:^(NSDictionary *, NSError *) { //이벤트 완료. }]; } |
C2SModule_Cocos2dx::C2SModuleCompletionHandler* completionHandler = NULL);
– 사용자 추적툴 이벤트 발생
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[일반 이벤트 보내는 예시] Json::Value arg; arg["event"] = "TutorialComplete"; // initialize때 등록한 이벤트 문자열 Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleTracker_SendEvent( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Tracking SendEvent error (%s)", error.get()->GetMessage() ); } [수익 측정 이벤트 예시] Json::Value arg; arg["event"] = "Purchase"; Json::Value argRevenueInfo; argRevenueInfo["title"] = "healing potion"; argRevenueInfo["description"] = "healing potion desc"; argRevenueInfo["itemCount"] = 1; argRevenueInfo["currency"] = "KRW"; argRevenueInfo["price"] = "1000"; arg["revenue"] = argRevenueInfo; Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleTracker_SendEvent( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Tracking SendEvent error (%s)", error.get()->GetMessage() ); } |
pkError, C2SModule_Cocos2dx::C2SModuleCompletionHandler* completionHandler = NULL);
– 사용자 추적툴 사용여부 설정
1 2 3 4 5 6 7 8 9 10 |
Json::Value arg; arg["Adjust"] = false; // true : 사용, false : 사용 안 함 arg["Singular"] = true; arg["AppsFlyer"] = true; Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( ::C2SModuleTracker_SetEnable( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> Tracking SetEnable error (%s)", error.get()->GetMessage() ); } |