手动事件跟踪
除了安装、打开、更新和购买(应用内购买)这些由 Hive SDK 自动跟踪的事件外,您还可以手动跟踪所需的事件。为此,您需要将事件注册到每个归因的仪表板上。例如,您可以跟踪特定事件,例如完成游戏教程(TutorialComplete)或完成任务目标(MissionClear)。您应该在完成自动事件跟踪的设置后实施手动事件跟踪。
手動事件追蹤與 Adjust¶
- 要手動追蹤自訂事件,請在 Adjust 儀表板上註冊事件,並獲取應用程式令牌和事件令牌。應用程式令牌可以在儀表板主頁上獲得,事件令牌則在 儀表板 > 所有設定 > 事件中獲得。請參考 Adjust 儀表板指南 了解如何獲取令牌。
- 在 hive_config.xml 中添加每個事件的應用程式令牌和事件令牌。詳細資訊請參見下面的範例代碼。
-
Adjust 儀表板提供 SDK 簽名 V3 以防止應用程式欺騙。要使用 SDK 簽名,您必須審查與 Adjust 的合約條款。
<providers> <!-- (已跳過) --> <!-- 不要設置 Adjust 節點的 id 欄位。 --> <!-- Adjust 節點的 name 欄位固定為 "Adjust." --> <!-- 事件節點的 name 欄位由遊戲工作室定義。但一旦設置,它應該與 sendEvent() 請求的所有其他行銷歸因的 name 欄位相同。--> <!-- 從 Hive SDK v4 25.0.0 開始,id、secretId、info1~4 在應用 Adjust v5 時不再使用 --> <Adjust name="Adjust" key="APP_TOKEN"> <events> <event name="TutorialComplete" value="TutorialComplete_EVENT_TOKEN"/> <event name="MissionClear" value="MissionClear_EVENT_TOKEN"/> </events> <!-- (已跳過) --> </Adjust> </providers>
-
呼叫分析 API sendEvent() 以發送事件。在您發送事件時,請在 hive_config.xml 中使用
事件名稱
。名稱
用作 sendEvent() 的請求參數,而您設置的值
將在每個歸因的儀表板上更新。Analytics.sendEvent("TutorialComplete");
Analytics.sendEvent("MissionClear");
手動追蹤事件與 Airbridge¶
- 獲取所需的令牌。 有關如何獲取令牌的信息,請參閱Airbridge 儀表板指南。
- 從儀表板 > 設置 > 令牌管理中獲取應用程序 SDK 令牌和應用程序名稱。
- 將令牌、應用名稱和事件設置添加到 hive_config.xml。 請參閱下面的 hive_config.xml 示例代碼。 在 Windows 上,令牌和應用名稱設置不是必需的,但 Hive 控制台設置是必需的。
- Airbridge 提供SDK 簽名以防止應用程序欺騙。 要使用相關功能,您必須首先檢查與 Airbridge 的合同條款。 獲取密鑰並將其作為
secretId 、secret 值添加到 hive_config.xml。 有關 SDK 簽名安全信息的更多信息,請參閱Airbridge 指南。 這僅在 Android 和 iOS 上受支持,而不支持 Windows。 - 如果您同時應用 Windows、Android 和 iOS,請聯繫Airbridge以獲取預設。
- 通過調用分析 API sendEvent()來發送事件。 發送事件時,使用添加到 hive_config.xml 的
event<
標籤的name
和value
。name
在調用 API 時用作參數,而value
可以在每個歸因的儀表板中檢查。Analytics.sendEvent("TutorialComplete");
Analytics.sendEvent("MissionClear");
hive_config.xml 範例代碼¶
<providers>
<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
發送附加屬性。
可以發送的額外屬性資訊如下。
- 行动,标签:收集可用于Airbridge报告中的分组信息。
- 值:收集用于收入分析的信息。
- 语义属性:Airbridge的预定义属性。
- 如果输入的属性字符串不是预定义属性,可能无法被收集。
- 数据格式与语义属性不匹配的事件将不会被收集。由于每个语义属性的数据格式各不相同,因此需要谨慎。
- 数据格式为字符串的语义属性最多允许1024个字符。数据格式为整数或浮点数的语义属性最多允许64位。
- 自定义属性:用户定义的属性。
API 參考: hive.Analytics.sendEventWithAttributes
using hive;
// 創建 AnalyticsAttributes
var analyticsAttributes = new AnalyticsAttributes();
// Airbridge 的特定屬性
var airbridgeSpecific = new AirbridgeSpecific();
// 行動
airbridgeSpecific.SetSemanticAction("工具");
// 標籤
airbridgeSpecific.SetSemanticLabel("錘子");
// 值
airbridgeSpecific.SetSemanticValue(10);
// 語義屬性
airbridgeSpecific.AddSemanticAttribute("type", "Warrior");
airbridgeSpecific.AddSemanticAttribute("score", 20);
// 添加 Airbridge 特定属性
analyticsAttributes.AddModuleSpecificAttributes(airbridgeSpecific);
// 添加自定义属性
analyticsAttributes.AddCustomAttribute("key1", "value1");
analyticsAttributes.AddCustomAttribute("key2", "value2");
Analytics.sendEventWithAttributes("Quest Complete", analyticsAttributes);
#include "HiveAnalytics.h"
// 創建 AnalyticsAttributes
FHiveAnalyticsAttributes AnalyticsAttributes;
// Airbridge 的特定屬性
FHiveAirbridgeSpecific AirbridgeSpecific;
// 動作
AirbridgeSpecific.SetSemanticAction(TEXT("工具"));
// 標籤
AirbridgeSpecific.SetSemanticLabel(TEXT("錘子"));
// 值
AirbridgeSpecific.SetSemanticValue(10.0f);
// 語義屬性
TSharedPtr<FJsonValue> SemanticJsonValue1 = MakeShared<FJsonValueString>(TEXT("Warrior"));
AirbridgeSpecific.AddSemanticAttribute(TEXT("type"), SemanticJsonValue1);
TSharedPtr<FJsonValue> SemanticJsonValue2 = MakeShared<FJsonValueNumber>(20);
AirbridgeSpecific.AddSemanticAttribute(TEXT("score"), SemanticJsonValue2);
// 添加 Airbridge 特定属性
AnalyticsAttributes.AddModuleSpecificAttribute(AirbridgeSpecific);
// 添加自定义属性
TSharedPtr<FJsonValue> CustomJsonValue1 = MakeShareable(new FJsonValueString("value1"));
AnalyticsAttributes.AddCustomAttribute(TEXT("key1"), CustomJsonValue1);
TSharedPtr<FJsonValue> CustomJsonValue2 = MakeShareable(new FJsonValueString("value2"));
AnalyticsAttributes.AddCustomAttribute(TEXT("key2"), CustomJsonValue2);
FHiveAnalytics::SendEventWithAttributes(strEventName, AnalyticsAttributes);
API 參考: Analytics::sendEventWithAttributes
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
// 創建 AnalyticsAttributes
AnalyticsAttributes* analyticsAttributes = new AnalyticsAttributes();
// Airbridge 的特定屬性
AirbridgeSpecific* airbridgeSpecific = new AirbridgeSpecific();
std::string semanticAction = "工具";
std::string semanticLabel = "錘";
float semanticValue = 10.0f;
// 動作
airbridgeSpecific->setSemanticAction(semanticAction);
// 標籤
airbridgeSpecific->setSemanticLabel(semanticLabel);
// 值
airbridgeSpecific->setSemanticValue(semanticValue);
// 語義屬性
airbridgeSpecific->addSemanticAttribute("type", picojson::value("Warrior"));
airbridgeSpecific->addSemanticAttribute("score", picojson::value(20.0f));
// 添加 Airbridge 特定属性
analyticsAttributes->addModuleSpecificAttributes(airbridgeSpecific);
// 添加自定义属性
analyticsAttributes->addCustomAttribute("key1", picojson::value("value1"));
analyticsAttributes->addCustomAttribute("key2", picojson::value("value2"));
std::string eventName = "Quest Complete";
Analytics::sendEventWithAttributes(eventName, *analyticsAttributes);
API 參考: Analytics.sendEventWithAttributes
import com.hive.Analytics
import com.hive.analytics.provider.attributes.AirbridgeSpecific
import com.hive.analytics.provider.attributes.AnalyticsAttributes
// 創建 AnalyticsAttributes
val analyticsAttributes = AnalyticsAttributes()
// Airbridge 的特定属性
val airbridgeSpecific = AirbridgeSpecific().apply {
setSemanticAction("Tool") // 动作
setSemanticLabel("Hammer") // 标签
setSemanticValue(10.0f) // 值
addSemanticAttribute("type", "Warrior") // 语义属性
addSemanticAttribute("score", 20.0f) // 语义属性
}
// 添加 Airbridge 特定属性
analyticsAttributes.addModuleSpecificAttribute(airbridgeSpecific)
// 添加自定义属性
analyticsAttributes.addCustomAttribute("key1", "value1")
analyticsAttributes.addCustomAttribute("key2", "value2")
Analytics.sendEventWithAttributes("Quest Complete", analyticsAttributes)
API 參考: Analytics.sendEventWithAttributes
import com.hive.Analytics;
import com.hive.analytics.provider.attributes.AirbridgeSpecific;
import com.hive.analytics.provider.attributes.AnalyticsAttributes;
// 創建 AnalyticsAttributes
AnalyticsAttributes analyticsAttributes = new AnalyticsAttributes();
// Airbridge 的特定屬性
AirbridgeSpecific airbridgeSpecific = new AirbridgeSpecific();
airbridgeSpecific.setSemanticAction("工具"); // 行動
airbridgeSpecific.setSemanticLabel("錘子"); // 標籤
airbridgeSpecific.setSemanticValue(10.0f); // 值
airbridgeSpecific.addSemanticAttribute("類型", "戰士"); // 語義屬性
airbridgeSpecific.addSemanticAttribute("分數", 20.0f); // 語義屬性
// 添加 Airbridge 特定属性
analyticsAttributes.addModuleSpecificAttribute(airbridgeSpecific);
// 添加自定义属性
analyticsAttributes.addCustomAttribute("key1", "value1");
analyticsAttributes.addCustomAttribute("key2", "value2");
Analytics.sendEventWithAttributes("Quest Complete", analyticsAttributes);
API 參考: 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 參考: HIVEAnalytics:sendEventWithAttributes
#import HIVEService
// 創建 AnalyticsAttributes
let analyticsAttributes = AnalyticsAttributes()
// Airbridge 的特定属性
let airbridgeSpecific = AirbridgeSpecific()
airbridgeSpecific.setSemanticAction("工具")
airbridgeSpecific.setSemanticLabel("锤子")
airbridgeSpecific.setSemanticValue(10.0)
airbridgeSpecific.addSemanticAttribute("类型", value: "战士")
airbridgeSpecific.addSemanticAttribute("分数", value: 20.0)
// 添加 Airbridge 特定属性
analyticsAttributes.addModuleSpecificAttribute(airbridgeSpecific)
// 添加自定义属性
analyticsAttributes.addCustomAttribute("key1", value: "value1")
analyticsAttributes.addCustomAttribute("key2", value: "value2")
AnalyticsInterface.sendEventWithAttributes("Quest Complete", attributes: analyticsAttributes)
使用 Singular、Appsflyer、Firebase Analytics 手動事件追蹤¶
- 從每個歸因儀表板獲取所需的金鑰。請參考每個歸因儀表板的指南以了解如何獲取金鑰。
- Singular: 從儀表板獲取 SDK 金鑰和 SDK 秘密金鑰。
- Appsflyer: 前往 AppsFlyer 配置 > 應用設置以獲取開發金鑰。
- Firebase Analytics: 不需要金鑰。
-
根據以下指南配置 hive_config.xml。更多詳細信息,請參見下面的示例代碼。如果您使用 AppsFlyer 歸因與 Hive SDK iOS(原生、Unity、Unreal),則需要為 Apple AppID 設置
itunseConnectAppId
。<providers> <!-- 配置 Singular --> <!-- Singular 節點的名稱字段固定為 "Singular." --> <!-- 事件節點的名稱字段由遊戲工作室定義。但一旦設置,應該與 sendEvent() 請求的所有其他市場歸因的名稱字段相同。--> <!-- 事件節點的值字段由遊戲工作室定義。 --> <Singular name="Singular" id="SDK_KEY" key="SDK_SECRET_KEY"> <events> <event name="TutorialComplete" value="教程完成"/> <event name="MissionClear" value="任務清除"/> </events> </Singular> <!-- 配置 AppsFlyer --> <!-- AppsFlyer 節點的名稱字段固定為 "AppsFlyer." --> <!-- 不要設置 AppsFlyer 節點的 id 字段. --> <!-- 事件節點的名稱字段由遊戲工作室定義。但一旦設置,應該與 sendEvent() 請求的所有其他市場歸因的名稱字段相同. --> <!-- 事件節點的值字段由遊戲工作室定義. --> <AppsFlyer name="AppsFlyer" id="unused" key="DEV_KEY" itunseConnectAppId="909923112"> <events> <event name="TutorialComplete" value="教程完成"/> <event name="MissionClear" value="任務清除"/> </events> </AppsFlyer> <!-- 配置 Firebase 分析 --> <!-- 事件節點的名稱字段由遊戲工作室定義。但一旦設置,對於 sendEvent() 請求的所有其他市場歸因,其名稱字段應保持一致。--> <!-- 事件節點的值字段由遊戲工作室定義。 --> <firebase> <events> <event name="TutorialComplete" value="TutorialComplete"/> <event name="MissionClear" value="MissionClear"/> </events> </firebase> </providers>
-
呼叫分析 API sendEvent() 以發送事件。當您發送事件時,請在 hive_config.xml 中使用
事件名稱
。名稱
用作 sendEvent() 的請求參數,而您設置的值
將在每個歸因的儀表板上更新。Analytics.sendEvent("TutorialComplete");
Analytics.sendEvent("MissionClear");
通過 sendEvent() 發送事件¶
建議僅在用戶活動符合特定條件時(例如完成教程)向歸因發送追蹤事件。在Analytics類中調用sendEvent()
方法以發送追蹤事件。作為sendEvent()
的第一個參數,輸入在hive_config.xml文件中定義的<event>
元素的name
屬性的值。
以下是示範代碼,發送 TutorialComplete 事件到市場歸因,以通知用戶已完成教程。
API 參考: hive.Analytics.sendEvent
API 參考: Analytics::sendEvent
API 參考: Analytics.sendEvent
API 參考: AnalyticsInterface .sendEvent
API 參考: HIVEAnalytics:sendEvent
API 參考: AnalyticsInterface.sendEvent
在 Firebase 環境中應用 Google Ads 裝置測量¶
要在 Firebase 環境中測量 Google Ads 提供的設備內轉換,您需要實施 Firebase Google ODM 解決方案。此解決方案需要用戶同意提供的電子郵件地址或電話號碼。在實施此解決方案的過程中,如果實施了 Firebase 身份驗證或開發者引入的單獨身份驗證環境,則 Hive SDK 不會收集電子郵件地址,而是將身份驗證後獲得的任何電子郵件地址直接傳遞給 Firebase API。
Note
本指南僅適用於 iOS 應用程式。Android 應用程式在 Firebase 環境中不需要單獨的過程來測量設備內轉換。
實施方法¶
在以下整个过程中,您必须确保用户设备上的个人识别信息不会泄露到外部。
- 下載Google Firebase ODM Unity 插件並將其添加到您的 Unity 專案中。
- 實現身份驗證以在登錄後獲取 IdP 電子郵件地址或電話號碼。
- 根據 Firebase 定義的方法 正規化電子郵件地址或電話號碼。
- 實現將正規化的電子郵件地址/電話號碼傳遞給 Firebase。或者,實現將正規化的電子郵件地址/電話號碼的哈希值傳遞給 Firebase。請參考下面的示例代碼。
Note
插件 API 可以按顺序调用,但 后续调用在每个用户调用一次后基本上会被忽略。
示例代碼¶
以下是使用 Unity 插件時的示例代碼。