이벤트 수동 추적¶
Hive SDK에서는 자동으로 추적하는 이벤트(Install, Open, Update, Purchase) 외에도 필요한 이벤트를 각 어트리뷰션 대시보드에 등록하여 수동으로 추적할 수 있습니다. 예를 들어 게임 튜토리얼 완료 시(TutorialComplete) 또는 특정 미션 달성 시(MissionClear)와 같이 특정한 상황을 추적할 수 있습니다. 이벤트 수동 추적은 이벤트 자동 추적 설정을 완료한 다음에 진행해야 합니다.
Adjust로 이벤트 수동으로 추적하기¶
- 원하는 커스텀 이벤트를 Adjust 대시보드에 등록하고 앱 토큰과 이벤트 토큰을 얻어야 합니다. 앱 토큰은 대시보드 메인에서, 이벤트 토큰은 대시보드 > All Settings > Events에서 확인합니다. 토큰 발급 방법에 대해서는 Adjust에서 제공하는 대시보드 안내를 참고하세요.
- 앱 토큰과 이벤트 토큰을 hive_config.xml에 추가합니다. 아래 예제 코드를 참고하세요.
- Adjust 대시보드에서는 앱 스푸핑 방지를 위한 SDK Signature 기능을 제공합니다. 관련 기능을 사용하려면 Adjust와의 계약 사항을 확인해야 합니다. 관련 기능을 사용하려면 키를 발급받아 hive_config.xml의
secretId
,info1
,info2
,info3
,info4
에 추가하세요.
<providers>
<!-- (코드 생략) -->
<!-- Adjust 노드 id 필드는 설정하지 않습니다. -->
<!-- Adjust 노드 name 필드는 "Adjust" 고정값입니다. -->
<!-- event 노드 name 필드는 게임사에서 임의로 설정합니다. 단, sendEvent() 호출을 위해 다른 어트리뷰션에서도 동일한 값을 사용해야 합니다.-->
<Adjust name="Adjust" id="unused" key="APP_TOKEN" secretId="1" info1="5432112345" info2="334123" info3="555333" info4="111333">
<events>
<event name="TutorialComplete" value="TutorialComplete_EVENT_TOKEN" />
<event name="MissionClear" value="MissionClear_EVENT_TOKEN" />
</events>
<!-- (코드 생략) -->
</Adjust>
</providers>
event name
을 사용합니다. name
은 API 호출 시 파라미터로 사용하며 value
는 각 어트리뷰션의 대시보드에서 확인할 수 있습니다. Analytics.sendEvent("TutorialComplete");
Analytics.sendEvent("MissionClear");
Airbridge로 이벤트 수동으로 추적하기¶
- 필요한 토큰을 발급받습니다. 토큰 발급 방법에 대해서는 Airbridge에서 제공하는 대시보드 안내를 참고하세요.
- 대시보드 > 설정 > 토큰 관리에서 App SDK Token과 App Name을 받습니다.
- hive_config.xml에 토큰과 앱 이름 및 이벤트 설정을 추가합니다. 아래의 hive_config.xml 예제 코드를 참고하세요. Windows 에서는 토큰과 앱 이름 설정은 필요하지 않고 Hive 콘솔 설정이 필요합니다.
- Airbridge에서는 앱 스푸핑 방지를 위한 SDK Signature를 제공합니다. 관련 기능을 사용하려면 우선 Airbridge와의 계약 사항을 확인해야 합니다. 키를 발급받아 hive_config.xml의
secretId
,secret
값으로 추가하세요. SDK 시그니처 보안 정보에 대한 자세한 내용은 에어브릿지 가이드를 참고하세요. Android, iOS에서만 지원하며 Windows에서는 지원하지 않습니다. - Windows와 Android, iOS를 함께 적용하는 경우, 사전 설정과 관련해 Airbridge에 문의하세요.
- Analytics API sendEvent()를 호출하여 이벤트를 전송합니다. 이벤트 전송 시 hive_config.xml에 추가한
event<
태그의name
과value
를 사용합니다.name
은 API 호출 시 파라미터로 사용하며value
는 각 어트리뷰션의 대시보드에서 확인할 수 있습니다.Analytics.sendEvent("TutorialComplete");
Analytics.sendEvent("MissionClear");
hive_config.xml 예제 코드¶
<providers>
<!-- (코드 생략) -->
<!-- Airbridge 설정하기 -->
<!--Airbridge 노드 name 필드는 "Airbridge" 고정값입니다. -->
<!--Airbridge 노드 id 필드는 설정하지 않습니다. -->
<!-- event 노드 name, value 필드는 게임사에서 임의로 설정합니다. -->
<Airbridge name="Airbridge" key="APP_SDK_TOKEN" appName="APP_NAME" secretId="SECRET_ID" secret="SECRET">
<events>
<event name="TutorialComplete" value="Tutorial Complete" />
<event name="MissionClear" value="Mission Clear" />
</events>
</Airbridge>
<!-- (코드 생략) -->
</providers>
Airbridge로 추가 어트리뷰트 전송하기¶
Airbridge로 인앱 이벤트를 전송할 때 Analytics.sendEventWithAttributes
를 사용하여 추가 어트리뷰트를 전송할 수 있습니다.
추가로 전송할 수 있는 어트리뷰트 정보는 아래와 같습니다.
- 액션(Action), 라벨(Label): 에어브릿지 리포트에서 그룹바이로 활용할 수 있는 정보를 수집합니다.
- 밸류(Value): 매출 분석에 활용하는 정보를 수집합니다.
- 시맨틱 어트리뷰트(Semantic Attribute): 에어브릿지가 미리 정의한 어트리뷰트입니다.
- 미리 정의한 어트리뷰트 이외의 어트리뷰트 문자열을 입력하는 경우 수집되지 않을 수 있습니다.
- 시맨틱 어트리뷰트의 데이터 형식에 맞지 않는 데이터가 있는 이벤트는 수집되지 않습니다. 시맨틱 어트리뷰트마다 데이터 형식이 다르기 때문에 주의해야 합니다.
- 데이터 형식이 string인 시맨틱 어트리뷰트는 최대 1024자까지 허용합니다. 데이터 형식이 int, float인 시맨틱 어트리뷰트는 최대 64비트까지 허용합니다.
- 커스텀 어트리뷰트(Custom Attribute): 사용자가 정의한 어트리뷰트입니다.
API Reference: hive.Analytics.sendEventWithAttributes
using hive;
// Create AnalyticsAttributes
var analyticsAttributes = new AnalyticsAttributes();
// Specific Attribute for Airbridge
var airbridgeSpecific = new AirbridgeSpecific();
// Action
airbridgeSpecific.SetSemanticAction("Tool");
// Label
airbridgeSpecific.SetSemanticLabel("Hammer");
// Value
airbridgeSpecific.SetSemanticValue(10);
// Semantic Attribute
airbridgeSpecific.AddSemanticAttribute("type", "Warrior");
airbridgeSpecific.AddSemanticAttribute("score", 20);
// Add Airbridge Specific Attribute
analyticsAttributes.AddModuleSpecificAttributes(airbridgeSpecific);
// Add Custom Attribute
analyticsAttributes.AddCustomAttribute("key1", "value1");
analyticsAttributes.AddCustomAttribute("key2", "value2");
Analytics.sendEventWithAttributes("Quest Complete", analyticsAttributes);
API Reference: Analytics::sendEventWithAttributes
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
// Create AnalyticsAttributes
AnalyticsAttributes* analyticsAttributes = new AnalyticsAttributes();
// Specific Attribute for Airbridge
AirbridgeSpecific* airbridgeSpecific = new AirbridgeSpecific();
std::string semanticAction = "Tool";
std::string semanticLabel = "Hammer";
float semanticValue = 10.0f;
// Action
airbridgeSpecific->setSemanticAction(semanticAction);
// Label
airbridgeSpecific->setSemanticLabel(semanticLabel);
// Value
airbridgeSpecific->setSemanticValue(semanticValue);
// Semantic Attribute
airbridgeSpecific->addSemanticAttribute("type", picojson::value("Warrior"));
airbridgeSpecific->addSemanticAttribute("score", picojson::value(20.0f));
// Add Airbridge Specific Attribute
analyticsAttributes->addModuleSpecificAttributes(airbridgeSpecific);
// Add Custom Attribute
analyticsAttributes->addCustomAttribute("key1", picojson::value("value1"));
analyticsAttributes->addCustomAttribute("key2", picojson::value("value2"));
std::string eventName = "Quest Complete";
Analytics::sendEventWithAttributes(eventName, *analyticsAttributes);
API Reference: Analytics.sendEventWithAttributes
import com.hive.Analytics
import com.hive.analytics.provider.attributes.AirbridgeSpecific
import com.hive.analytics.provider.attributes.AnalyticsAttributes
// Create AnalyticsAttributes
val analyticsAttributes = AnalyticsAttributes()
// Specific Attribute for Airbridge
val airbridgeSpecific = AirbridgeSpecific().apply {
setSemanticAction("Tool") // Action
setSemanticLabel("Hammer") // Label
setSemanticValue(10.0f) // Value
addSemanticAttribute("type", "Warrior") // Semantic Attribute
addSemanticAttribute("score", 20.0f) // Semantic Attribute
}
// Add Airbridge Specific Attribute
analyticsAttributes.addModuleSpecificAttribute(airbridgeSpecific)
// Add Custom Attribute
analyticsAttributes.addCustomAttribute("key1", "value1")
analyticsAttributes.addCustomAttribute("key2", "value2")
Analytics.sendEventWithAttributes("Quest Complete", analyticsAttributes)
API Reference: Analytics.sendEventWithAttributes
import com.hive.Analytics;
import com.hive.analytics.provider.attributes.AirbridgeSpecific;
import com.hive.analytics.provider.attributes.AnalyticsAttributes;
// Create AnalyticsAttributes
AnalyticsAttributes analyticsAttributes = new AnalyticsAttributes();
// Specific Attribute for Airbridge
AirbridgeSpecific airbridgeSpecific = new AirbridgeSpecific();
airbridgeSpecific.setSemanticAction("Tool"); // Action
airbridgeSpecific.setSemanticLabel("Hammer"); // Label
airbridgeSpecific.setSemanticValue(10.0f); // Value
airbridgeSpecific.addSemanticAttribute("type", "Warrior"); // Semantic Attribute
airbridgeSpecific.addSemanticAttribute("score", 20.0f); // Semantic Attribute
// Add Airbridge Specific Attribute
analyticsAttributes.addModuleSpecificAttribute(airbridgeSpecific);
// Add Custom Attribute
analyticsAttributes.addCustomAttribute("key1", "value1");
analyticsAttributes.addCustomAttribute("key2", "value2");
Analytics.sendEventWithAttributes("Quest Complete", analyticsAttributes);
API Reference: HIVEAnalytics:sendEventWithAttributes
#import <HIVEService/HIVEService-Swift.h>
HiveAnalyticsAttributes* analyticsAttributes = [[HiveAnalyticsAttributes alloc] init];
HiveAirbridgeSpecific* airbridgeSpecific = [[HiveAirbridgeSpecific alloc] init];
[airbridgeSpecific setSemanticAction: @"Tool"];
[airbridgeSpecific setSemanticAction: @"Hammer"];
[airbridgeSpecific setSemanticValue: 10.0f];
[airbridgeSpecific addSemanticAttribute: @"type" value: @"Warrior"];
[airbridgeSpecific addSemanticAttribute: @"score" value: @20.0f];
[analyticsAttributes addModuleSpecificAttribute: airbridgeSpecific];
[analyticsAttributes addCustomAttribute: @"key1" value: @"value1"];
[analyticsAttributes addCustomAttribute: @"key2" value: @"value2"];
[HIVEAnalytics sendEventWithAttributes: @"Quest Complete" attributes: analyticsAttributes];
API Reference: HIVEAnalytics:sendEventWithAttributes
#import HIVEService
// Create AnalyticsAttributes
let analyticsAttributes = AnalyticsAttributes()
// Specific Attribute for Airbridge
let airbridgeSpecific = AirbridgeSpecific()
airbridgeSpecific.setSemanticAction("Tool")
airbridgeSpecific.setSemanticLabel("Hammer")
airbridgeSpecific.setSemanticValue(10.0)
airbridgeSpecific.addSemanticAttribute("type", value: "Warrior")
airbridgeSpecific.addSemanticAttribute("score", value: 20.0)
// Add Airbridge Specific Attribute
analyticsAttributes.addModuleSpecificAttribute(airbridgeSpecific)
// Add Custom Attribute
analyticsAttributes.addCustomAttribute("key1", value: "value1")
analyticsAttributes.addCustomAttribute("key2", value: "value2")
AnalyticsInterface.sendEventWithAttributes("Quest Complete", attributes: analyticsAttributes)
Singular, Appsflyer, Firebase Analytics로 이벤트 수동으로 추적하기¶
- 각 어트리뷰션 대시보드에서 키를 발급받습니다. 키 발급 방법에 대해서는 각 어트리뷰션에서 제공하는 대시보드 안내를 참고하세요.
- Singular: 대시보드에서 SDK Key와 SDK SecretKey를 받습니다.
- Appsflyer: 대시보드 > 앱 설정에서 Dev 키를 받습니다.
- Firebase Analytics: 키 발급이 필요하지 않습니다.
- 아래 안내를 따라 hive_config.xml에 설정합니다. 아래 예제 코드를 참고하세요. Hive SDK iOS(Native, Unity, Unreal)에서 AppsFlyer 어트리뷰션을 사용할 경우, Apple AppID 설정을 위해 `itunseConnectAppId` 값을 설정합니다.
<providers> <!-- Singular 설정하기 --> <!-- Singular 노드 name 필드는 "Singular" 고정값입니다. --> <!-- event 노드 name 필드는 게임사에서 임의로 설정합니다. 단, sendEvent() 호출을 위해 다른 어트리뷰션에서도 동일한 값을 사용해야 합니다.--> <!-- event 노드 value 필드는 게임사에서 임의로 설정합니다. --> <Singular name="Singular" id="SDK_KEY" key="SDK_SECRET_KEY"> <events> <event name="TutorialComplete" value="Tutorial Complete" /> <event name="MissionClear" value="Mission Clear" /> </events> </Singular> <!-- AppsFlyer 설정하기 --> <!-- AppsFlyer 노드 name 필드는 "AppsFlyer" 고정값입니다. --> <!-- AppsFlyer 노드 id 필드는 설정하지 않습니다. --> <!-- event 노드 name 필드는 게임사에서 임의로 설정합니다. 단, sendEvent() 호출을 위해 다른 어트리뷰션에서도 동일한 값을 사용해야 합니다.--> <!-- event 노드 value 필드는 게임사에서 임의로 설정합니다. --> <AppsFlyer name="AppsFlyer" id="unused" key="DEV_KEY" itunseConnectAppId="909923112"> <events> <event name="TutorialComplete" value="Tutorial Complete" /> <event name="MissionClear" value="Mission Clear" /> </events> </AppsFlyer> <!-- Firebase Analytics 설정하기 --> <!-- event 노드 name 필드는 게임사에서 임의로 설정합니다. 단, sendEvent() 호출을 위해 다른 어트리뷰션에서도 동일한 값을 사용해야 합니다.--> <!-- event 노드 value 필드는 게임사에서 임의로 설정합니다. --> <firebase> <events> <event name="TutorialComplete" value="TutorialComplete" /> <event name="MissionClear" value="MissionClear" /> </events> </firebase> </providers>
- Analytics API sendEvent()를 호출하여 이벤트를 전송합니다. 이벤트 전송 시 hive_config.xml에 추가한
event name
을 사용합니다.name
은 API 호출 시 파라미터로 사용하며value
는 각 어트리뷰션의 대시보드에서 확인할 수 있습니다.Analytics.sendEvent("TutorialComplete");
Analytics.sendEvent("MissionClear");
sendEvent()로 이벤트 전송하기¶
유저의 행동을 추적할 때 모든 행동을 추적하기 보다는 유저의 행동이 특정 조건을 만족시켰을 때 (예. 튜토리얼 완료) 어트리뷰션에 추적 이벤트를 전송하기를 권장합니다. 유저 행동 추적 이벤트를 전송하려면 Analytics API의 sendEvent()
함수를 호출하세요. sendEvent()
함수의 첫 번째 파라미터 값으로는 hive_config.xml 설정 파일에 정의한 <event>
요소의 name
속성 값을 입력하세요.
다음은 유저가 튜토리얼을 완료했다는 것을 알리기 위한 TutorialComplete 이벤트를 마케팅 어트리뷰션에 전송하는 예제 코드입니다.
API Reference: hive.Analytics.sendEvent
API Reference: Analytics::sendEvent
API Reference: Analytics.sendEvent
API Reference: AnalyticsInterface .sendEvent
API Reference: HIVEAnalytics:sendEvent
API Reference: AnalyticsInterface.sendEvent
Firebase 환경에서 Google Ads Ondevice Measurement 적용하기¶
Firebase 환경에서 Google Ads가 제공하는 기기 내 전환을 측정하려면 Firebase Google ODM 솔루션을 적용해야 합니다. 이 솔루션을 사용하려면 사용자가 제공 동의한 이메일 주소 또는 전화번호가 필요합니다. 이 솔루션을 적용하는 과정에서 Firebase Authentication 또는 개발사가 별도로 도입한 인증 환경을 구현했을 때, Hive SDK는 이메일 주소를 수집하지 않으며 인증 후 얻는 응답값에 이메일 주소가 있다면 이를 Firebase API에 그대로 전달만 합니다.
Note
이 가이드는 iOS앱만을 대상으로 합니다. Android앱은 Firebase 환경에서 기기 내 전환 측정을 위한 별도 과정이 필요하지 않습니다.
적용 방법¶
아래 전체 과정에서 개인 식별 정보가 사용자 기기에서 외부로 유출되지 않도록 해야 합니다.
- Google Firebase ODM Unity 플러그인을 다운로드 후 Unity 프로젝트에 추가합니다.
- 로그인 후 로그인한 IdP 이메일 주소 또는 전화번호를 얻도록 인증을 구현합니다.
- 이메일 주소 또는 전화번호를 Firebase에서 정의한 방법대로 정규화합니다.
- 정규화한 이메일 주소/전화번호를 Firebase에 전달하도록 구현합니다. 또는 정규화한 이메일 주소/전화번호를 해싱한 값을 Firebase에 전달하도록 구현합니다. 아래 예제 코드를 참고하세요.
Note
플러그인 API는 순차적으로 호출할 수 있지만, 사용자별로 한 번 호출하면 후속 호출은 사실상 무시됩니다.
예제 코드¶
다음은 Unity 플러그인 사용 시 예제 코드입니다.