Unreal SDK

    Maven metadata URL

    SDK 安装

    Airbridge Unreal SDK 需要 Unreal Engine 4.23 或以上版本。

    包安装

    1. 请下载最新版本的 Airbridge Unreal SDK

    2. 请在 Unreal Engine Project 的 Root Directory 创建 Plugins 文件夹。

    3. 请将 Airbridge Unreal SDK 移动至 Plugins 文件夹内部,如下所示:

    123456
    <YOUR_UE_PROJECT>
      ├── Plugins
              └── AirbridgeUnrealSDK
                  ├── Resources
                  ├── Source
                  └── AirbridgeUnrealSDK.uplugin

    4. 请点击 Unreal Engine 工具栏中的 [Settings]>[Plugins],以启用 Airbridge Unreal SDK。

    5. 请在 App 的 Build.cs 文件(<YOUR_UE_PROJECT>.Build.cs)内部的 PublicDependencyModuleNames 排列添加 AirbridgeUnreal,如下所示:

    123456789
    public class <YOUR_UE_PROJECT> : ModuleRules
    {
        public <YOUR_UE_PROJECT>(ReadOnlyTargetRules Target) : base(Target)
        {
            ...
            PublicDependencyModuleNames.AddRange(new string[] { ... , "AirbridgeUnreal" });   // ADD DEPENDENCY 
            ...
        }
    }

    Project 设置

    1. 请点击 Unreal Engine 工具栏中的 [Settings]>[Project Settings...],以打开 Project Settings 窗。

    2. 您可以通过点击 Plugins 下的 Airbridge Unreal SDK 查看以下页面:

    输入完成后,请务必进行以下操作以使设置生效:

    1. 请在 [Plugins]>[Airbridge Unreal SDK] 点击右上角的 Set as Default 按钮。设置将保存到 [Project]>[Config] 的 DefaultAirbridge.ini 文件中。

    2. 请在 Unreal Engine 工具栏点击 Airbridge(Update iOS Setting & Update Android Manifest)按钮。

    提示

    如果需要手动合并 Android Manifest 文件,请参照 [Project]>[Plugins]>[AirbridgeUnrealSDK]>[Source]>[AirbridgeUnreal] 的 Airbridge_UPL_Android.xml 文件。

    App 信息设置

    请在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 的 App Name 和 App Token 字段中输入在 Airbridge 面板注册的 App 名称(Unique ID)和 App SDK Token 信息。

    App 名称(Unique ID)和 App SDK Token 可在 Airbridge 面板的 [设置]>[Token] 查看。

    初始化

    一般情况下,Airbridge Unreal SDK 无需进行额外的初始化操作,但在特殊情况下,可能需要针对各平台进行迁移操作。

    检查 SDK 安装

    在 Unreal 检查

    您可在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 的 Log Level 字段查看 App 的 Log。

    提示

    由于此方法可能暴露用户信息,请确保此方法仅在 Build.DEBUG 下运行。

    在 Airbridge 面板检查

    您可在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看 App 的 Log。

    深度链接(Deep Link)设置

    Airbridge 面板设置

    需要在 Airbridge 面板进行的 Android 和 iOS 深度链接设置如下:

    Project 设置

    Android 深度链接设置

    请在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 的 Android URI Scheme 字段中输入在 Airbridge 面板注册的 Android URI Scheme 信息。

    Android URI Scheme 可在 Airbridge 面板的 [追踪链接]>[深度链接] 查看。

    iOS 深度链接设置

    请在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 的 iOS URI Scheme 字段中输入在 Airbridge 面板注册的 iOS URI Scheme 信息。

    iOS URI Scheme 可在 Airbridge 面板的 [追踪链接]>[深度链接] 查看。

    品牌域名设置

    在 Airbridge 面板创建的追踪链接默认使用 deeplink.page 或 abr.ge 域名的追踪链接。您可通过以下步骤设置品牌域名,如 go.my_company.com/abcd,为您的追踪链接添加品牌效果,从而提高 CTR。

    1. 请参照 本指南 设置品牌域名。

    2. 请在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 的 Custom Domain 字段输入在步骤 1. 设置的品牌域名。

    为了收取用户点击的深度链接数据,请进行以下设置:

    1. 请点击 [Content Browser]>[Add/Import]>[New C++ Class...],然后将 Parent Class 指定为 Game Mode Base,以创建 Game Mode Base 类。

    2. 请在步骤 1. 创建的 Game Mode Base 类的 Header 文件中进行深度链接回调设置,如下所示:

    Header File
    12345678910111213141516171819202122232425
    // ExampleGameModeBase.h
    
    #pragma once
    
    #include "AirbridgeCallbacks.h"
    ...
    
    UCLASS()
    class YOUR_UE_PROJECT_API AExampleGameModeBase : public AGameModeBase
    {
        GENERATED_BODY()
    
    public:
        AExampleGameModeBase();
        
        virtual void BeginPlay() override;
        
        // Method will be called by Airbridge when deeplink detected
        UFUNCTION()
        void OnDeeplinkReceived(const FString& Url);
    
        // Register an object to receive user-clicked deep link data
        UPROPERTY()
        UAirbridgeCallbacks* AirbridgeCallbacks;
    };

    3. 请在步骤 1. 创建的 Game Mode Base 类的源代码中进行深度链接回调设置,如下所示:

    ExampleGameModeBase.cpp
    1234567891011121314151617181920212223
    ...
    #include "AirbridgeUnreal.h"
    
    AExampleGameModeBase::AExampleGameModeBase()
    {
        AirbridgeCallbacks = CreateDefaultSubobject<UAirbridgeCallbacks>(TEXT("AIRBRIDGE_CALLBACKS"));
    }
    
    void AExampleGameModeBase::BeginPlay()
    {
        // Register an object to receive user-clicked deep link data
        AirbridgeCallbacks->OnDeeplinkReceived.AddDynamic(this, &AExampleGameModeBase::OnDeeplinkReceived);
      
        // Call SetDeeplinkCallback to receive user-clicked deep link data
        FAirbridgeUnreal::SetDeeplinkCallback();
    }
    
    // 위와 같이 Callback을 등록하게 되면 해당 클래스는 다음과 같은 함수를 통해 딥링크 URL을 넘겨받게 됩니다.
    // Method will be called by Airbridge when deeplink detected
    void AExampleGameModeBase::OnDeeplinkReceived(const FString& Url)
    {
        
    }

    4. 请在 [Unreal Editor]>[Project Settings]>[Project]>[Maps & Modes]>[Default Modes] 的 Default GameMode 字段指定已完成深度链接回调设置的 Game Mode(例:ExampleGameModeBase)。

    检查深度链接设置

    完成 Airbridge Unreal SDK 深度链接设置后,可以通过点击 URI Scheme 检查是否能正确跳转到相应的 App 页面。

    • scheme://

    深度链接设置正确无误时,您可在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看深度链接打开(Deeplink Open)记录。

    用户设置

    用户标识符设置

    Airbridge 收集以下用户标识符信息,以监测跨 Web 和 App 的用户贡献:

    • User Email : 用户邮箱

    • User Phone : 用户电话号码

    • User ID : 用户唯一 ID (可识别用户并且在 Web 端和 App 端一致的 ID)

    • User Alias : 可以代表用户的其他 ID (例:忠诚计划专用 ID、集团子公司统一 ID)

    提示

    用户邮箱和电话号码将自动进行 SHA256 哈希处理后发送到服务器。

    您可通过以下方法在 Airbridge Unreal SDK 设置用户标识符信息:

    C++
    123456
    #include "AirbridgeUnreal.h"
    
    FAirbridgeUnreal::SetUserID("personID");
    FAirbridgeUnreal::SetUserEmail("persondoe@airbridge.io");
    FAirbridgeUnreal::SetUserPhone("1(123)123-1234");
    FAirbridgeUnreal::SetUserAlias(TEXT("alias1"), TEXT("value"));

    User Alias 规则

    • User Alias 最多可设置 10 个。

    • User Alias 的 key 是 string 类型,最多为 128 个字符。

    • User Alias 的 key 必须符合正则表达式 ^[a-z_][a-z0-9_]*$

    • User Alias 的 value 是 string 类型,最多为 128 个字符。

    设置用户标识符信息后,所有事件将包含标识符信息进行发送。

    用户属性设置

    您可以为提高 MTA(Multi-touch attribution, 多触点归因)分析的准确性、内部数据分析以及与第三方解决方案的集成等目的设置附加用户属性。

    C++
    1234567
    #include "AirbridgeUnreal.h"
    
    FAirbridgeUnreal::SetUserAttribute(TEXT("int_key"), 100);
    FAirbridgeUnreal::SetUserAttribute(TEXT("long_key"), 1000);
    FAirbridgeUnreal::SetUserAttribute(TEXT("float_key"), 3.14F);
    FAirbridgeUnreal::SetUserAttribute(TEXT("boolean_key"), true);
    FAirbridgeUnreal::SetUserAttribute(TEXT("string_key"), TEXT("airbridge"));

    User Attribute 规则

    • User Attribute 最多可设置 100 个。

    • User Attribute 的 key 是 string 类型,最多为 128 个字符。

    • User Attribute 的 key 必须符合正则表达式 ^[a-z_][a-z0-9_]*$

    • User Attribute 的 value 类型可以为 integer、float、long、boolean 或 string,且如果是 string,则最多为 1024 个字符。

    检查用户设置

    Airbridge Unreal SDK 中设置的用户信息可在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看。

    设备设置

    设备标识符设置

    您可在 SDK 中设置设备标识符,使以后收集的所有事件包含设备标识符。设置后,无论 App 是否关闭,设备标识符将保留,除非手动删除。

    c++
    12345
    #include "AirbridgeUnreal.h"
    
    FAirbridgeUnreal::SetDeviceAlias(TEXT("ADD_YOUR_KEY"), TEXT("AND_YOUR_VALUE"));
    FAirbridgeUnreal::RemoveDeviceAlias(TEXT("DELETE_THIS_KEY"));
    FAirbridgeUnreal::ClearDeviceAlias();

    方法

    说明

    SetDeviceAlias(const FString& Key, const FString& Value)

    将键值对添加到设备标识符中。

    RemoveDeviceAlias(const FString& Key)

    删除相应于 key 的设备标识符。如果没有相应的设备标识符,则不执行任何操作。

    ClearDeviceAlias()

    删除所有设备标识符。

    事件设置

    Airbridge Unreal SDK 调用的所有事件都可以包含以下 6 个属性值进行发送:

    • Event Category:事件名称 (FString) 必填

    • Event Action:事件属性 1 (FString)

    • Event Label:事件属性 2 (FString)

    • Event Value:事件属性 3 (double)

    • Event Semantic Attributes:标准事件属性 (UAirbridgeMap Class)

    • Event Custom Attributes:自定义事件属性 (UAirbridgeMap Class)

    用户事件发送

    为方便起见,Airbridge Unreal SDK 提供以下 3 种用户事件:

    注册 (Sign-up)

    C++
    123456789
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    FAirbridgeUnreal::SetUserID("personID");
    FAirbridgeUnreal::SetUserEmail("persondoe@airbridge.io");
    FAirbridgeUnreal::SetUserPhone("1(123)123-1234");
    FAirbridgeUnreal::SetUserAlias(TEXT("alias1"), TEXT("value"));
    
    FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::SIGN_UP);

    登录 (Sign-in)

    C++
    123456789
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    FAirbridgeUnreal::SetUserID("personID");
    FAirbridgeUnreal::SetUserEmail("persondoe@airbridge.io");
    FAirbridgeUnreal::SetUserPhone("1(123)123-1234");
    FAirbridgeUnreal::SetUserAlias(TEXT("alias1"), TEXT("value"));
    
    FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::SIGN_IN);

    退出登录 (Sign-out)

    C++
    12345
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::SIGN_OUT);
    FAirbridgeUnreal::ClearUser();

    电商事件发送

    为方便起见,Airbridge Unreal SDK 提供以下产品 Class 和电商事件:

    C++
    1234567
    UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 0);

    查看首页 (View Home Screen)

    C++
    1234
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    FAirbridgeUnreal::TrackEvent(AirbridgeConstants::CATEGORY::VIEW_HOME);

    查看搜索结果 (View Search Result)

    C++
    12345678910111213141516171819202122232425262728293031323334353637383940
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    UAirbridgeList* Beverages = UAirbridgeList::CreateObject();
    
    UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
    Beverages->Add(Cocacola);
    
    UAirbridgeMap* Fanta = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_2")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Fanta")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 10.99)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 1);
    Beverages->Add(Fanta);
        
    UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::ATTRIBUTES::QUERY, "SELECT * FROM beverages")
        ->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Beverages);
        
    FAirbridgeUnreal::TrackEvent(
        AirbridgeConstants::CATEGORY::VIEW_SEARCH_RESULT,
        UAirbridgeEventOption::CreateObject()
            ->SetValue(12.24)
            ->SetSemanticAttributes(SemanticAttributes)
    );
    
    // Optional (Remove the resource immediately)
    SemanticAttributes->ConditionalBeginDestroy();
    Fanta->ConditionalBeginDestroy();
    Cocacola->ConditionalBeginDestroy();
    Fanta->ConditionalBeginDestroy();
    Beverages->ConditionalBeginDestroy();

    查看产品列表 (View Product List)

    C++
    123456789101112131415161718192021222324252627282930313233343536373839
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    UAirbridgeList* Beverages = UAirbridgeList::CreateObject();
    
    UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
    Beverages->Add(Cocacola);
    
    UAirbridgeMap* Fanta = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_3")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Fanta")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 10.99)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 2);
    Beverages->Add(Fanta);
    
    UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::ATTRIBUTES::PRODUCT_LIST_ID, "beverage_list_0")
        ->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Beverages);
        
    FAirbridgeUnreal::TrackEvent(
        AirbridgeConstants::CATEGORY::VIEW_PRODUCT_LIST,
        UAirbridgeEventOption::CreateObject()
            ->SetValue(12.24)
            ->SetSemanticAttributes(SemanticAttributes)
    );
    
    // Optional (Remove the resource immediately)
    SemanticAttributes->ConditionalBeginDestroy();
    Fanta->ConditionalBeginDestroy();
    Cocacola->ConditionalBeginDestroy();
    Beverages->ConditionalBeginDestroy();

    查看产品详情 (View Product Detail)

    C++
    123456789101112131415161718192021222324252627
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    UAirbridgeList* Products = UAirbridgeList::CreateObject();
        
    UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
    Products->Add(Cocacola);
    
    UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Products);
    
    FAirbridgeUnreal::TrackEvent(
        AirbridgeConstants::CATEGORY::VIEW_PRODUCT_DETAILS,
        UAirbridgeEventOption::CreateObject()
            ->SetSemanticAttributes(SemanticAttributes)
    );
    
    // Optional (Remove the resource immediately)
    SemanticAttributes->ConditionalBeginDestroy();
    Cocacola->ConditionalBeginDestroy();
    Products->ConditionalBeginDestroy();

    加入购物车 (Add to Cart)

    C++
    12345678910111213141516171819202122232425262728
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    UAirbridgeList* Products = UAirbridgeList::CreateObject();
        
    UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
    Products->Add(Cocacola);
    
    UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Products);
    
    FAirbridgeUnreal::TrackEvent(
        AirbridgeConstants::CATEGORY::ADD_TO_CART,
        UAirbridgeEventOption::CreateObject()
            ->SetValue(1.25)
            ->SetSemanticAttributes(SemanticAttributes)
    );
    
    // Optional (Remove the resource immediately)
    SemanticAttributes->ConditionalBeginDestroy();
    Cocacola->ConditionalBeginDestroy();
    Products->ConditionalBeginDestroy();

    完成订单 (Order Complete)

    C++
    123456789101112131415161718192021222324252627282930313233343536373839404142
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    UAirbridgeList* Beverages = UAirbridgeList::CreateObject();
    
    UAirbridgeMap* Cocacola = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_1")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Coca Cola")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 1.25)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 0);
    Beverages->Add(Cocacola);
    
    UAirbridgeMap* Fanta = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::PRODUCT::ID, "beverage_3")
        ->Set(AirbridgeConstants::PRODUCT::NAME, "Fanta")
        ->Set(AirbridgeConstants::PRODUCT::PRICE, 10.99)
        ->Set(AirbridgeConstants::PRODUCT::CURRENCY, "USD")
        ->Set(AirbridgeConstants::PRODUCT::QUANTITY, 1)
        ->Set(AirbridgeConstants::PRODUCT::POSITION, 2);
    Beverages->Add(Fanta);
        
    UAirbridgeMap* SemanticAttributes = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeConstants::ATTRIBUTES::TRANSACTION_ID, "transaction_123")
        ->Set(AirbridgeConstants::ATTRIBUTES::PRODUCTS, Beverages)
        ->Set(AirbridgeConstants::ATTRIBUTES::IN_APP_PURCHASED, true)
        ->Set(AirbridgeConstants::ATTRIBUTES::CURRENCY, "USD");
        
    FAirbridgeUnreal::TrackEvent(
        AirbridgeConstants::CATEGORY::ORDER_COMPLETE,
        UAirbridgeEventOption::CreateObject()
            ->SetValue(1.25)
            ->SetSemanticAttributes(SemanticAttributes)
    );
    
    // Optional (Remove the resource immediately)
    SemanticAttributes->ConditionalBeginDestroy();
    Fanta->ConditionalBeginDestroy();
    Cocacola->ConditionalBeginDestroy();
    Fanta->ConditionalBeginDestroy();
    Beverages->ConditionalBeginDestroy();

    自定义事件发送

    在 Airbridge Unreal SDK 中,您可通过以下方法发送自定义事件:

    C++
    123456789101112131415161718192021222324252627282930313233343536373839
    #include "AirbridgeUnreal.h"
    #include "Airbridge/AirbridgeConstants.h"
    
    FAirbridgeUnreal::TrackEvent(
        "category",
        UAirbridgeEventOption::CreateObject()
            ->SetAction("action")
            ->SetLabel("label")
            ->SetValue(100.99)
            // Custom Attributes
            ->SetCustomAttributes(
                UAirbridgeMap::CreateObject()
                    ->Set("model", "MMM")
                    ->Set("report", UAirbridgeMap::CreateObject()
                        ->Set("start_date", TEXT"2022-01-01")
                        ->Set("end_date", TEXT"2022-12-31")
                        ->Set("channel_attributions", UAirbridgeList::CreateObject()
                            ->Add(UAirbridgeMap::CreateObject()
                                ->Set("channel", "Paid Search")
                                ->Set("attributed_conversions", 100)
                                ->Set("attributed_revenue", 1000)
                            )
                            ->Add(UAirbridgeMap::CreateObject()
                                ->Set("channel", "Organic Search")
                                ->Set("attributed_conversions", 75)
                                ->Set("attributed_revenue", 500)
                            )
                            ->Add(UAirbridgeMap::CreateObject()
                                ->Set("channel", "Email")
                                ->Set("attributed_conversions", 50)
                                ->Set("attributed_revenue", 250)
                            )
                        )
                    )
            )
            // Semantic Attributes
            ->SetSemanticAttributes(UAirbridgeMap::CreateObject()
                ->Set(AirbridgeConstants::ATTRIBUTES::QUERY, "query_123"))
        );

    通过以上代码发送到服务器的事件的 Payload 如下:

    123456789101112131415161718192021222324252627282930313233
    {
        "category": "category",
        "action": "action",
        "label": "label",
        "value": 100.99,
        "customAttributes": {
            "model": "MMM",
            "report": {
                "start_date": "2022-01-01",
                "end_date": "2022-12-31",
                "channel_attributions": [
                    {
                        "channel": "Paid Search",
                        "attributed_conversions": 100,
                        "attributed_revenue": 1000
                  },
                  {
                        "channel": "Organic Search",
                        "attributed_conversions": 75,
                        "attributed_revenue": 500
                  },
                  {
                        "channel": "Email",
                        "attributed_conversions": 50,
                        "attributed_revenue": 250
                  }
                ]
            }
        },
        "semanticAttributes": {
            "query": "query_123"
        }
    }

    提示

    如果需要自定义配置并发送 Semantic Attribute,请参阅 本指南

    检查事件设置

    Airbridge Unreal SDK 发送的事件可在 Airbridge 的 [原始数据]>[App 实时记录] 查看。

    高级设置

    SDK 签名(SDK Signature)设置

    您可在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 设置 SDK Signature Secret 字段和 SDK Signature Secret ID 字段,以防止 SDK 伪造(SDK Spoofing)。

    为了设置 SDK 签名,需要 SDK Signature Secret 和 SDK Signature Secret ID。请参阅 本指南 获取这 2个值。

    用户标识符信息 SHA256 哈希处理设置

    如果出于内部数据分析等目的需要发送未经 SHA 256 哈希处理的用户标识符信息,您可在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 设置 User Info Hash Enabled 字段,以停止对 User Email 和 User Phone 信息的哈希处理。

    注意

    由于此选项将敏感个人信息提供给第三方,因此必须事先采取额外的内部安全措施。

    会话过期设置

    您可在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 设置 Session Timeout Seconds 字段,以在设定的会话期间内,即使用户重新启用 App,也可判断为同一个会话,而不重新发送 App 启用事件。

    Opt-in 设置

    此功能在根据隐私法(例:GDPRCCPA)收集和传输数据时需要征得用户同意的情况下非常有用。

    您可在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 设置 Auto Start Tracking Enabled 字段,以明确地开始收集和传输数据。

    如果关闭此功能,则需要明确调用以下函数才能正确进行数据收集:

    C++
    123
    #include "AirbridgeUnreal.h"
    
    FAirbridgeUnreal::StartTracking();

    如果由于 App 内的多个深度链接操作,导致难以通过 Airbridge 一目了然地查看再互动(Re-engagement)绩效,您可在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 设置 Track Airbridge Link Only 字段,以过滤并仅查看由 Airbridge 深度链接产生的绩效。

    深度链接绩效监测

    开启此功能后,仅当通过符合以下条件的深度链接打开 App 时,才会监测为深度链接的绩效。

    • 通过 Airbridge 面板中注册的深度链接打开 App 时

    • 通过 airbridge.io 深度链接打开 App 时

    • 通过 deeplink.page 深度链接打开 App 时

    • airbridge_referrer query 信息存在时

    位置信息收集 (Android)

    您可在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 设置 Location Collection Enabled 字段,以收集用户的位置信息。

    此功能仅在 Android 上可用,且 AndroidManifest.xml 中必须包含以下权限设置:

    12
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    注意

    位置信息必须以合法目的和方式收集,使用此功能请谨慎。

    ATT 设置 (iOS)

    根据 Apple 政策,iOS 只有在 ATT (App Tracking Transparency, 应用跟踪透明度)征得用户同意,才能收集 IDFA 信息。

    您可在 [Unreal Editor]>[Project Settings]>[Plugins]>[Airbridge Unreal SDK]>[Airbridge Configure] 设置 iOS Tracking Authorize Timeout Seconds 字段,以延迟安装事件,使安装事件包含 IDFA。

    App 卸载追踪设置

    Android App 卸载追踪

    请参照以下指南发送通过 Firebase Cloud Messaging 设置生成的 Push Token:

    C++
    123
    #include "AirbridgeUnreal.h"
    
    FAirbridgeUnreal::RegisterPushToken("FIREBASE_PUSH_TOKEN");

    iOS App 卸载追踪

    请参照以下指南发送 APNs Device Token:

    C++
    123
    #include "AirbridgeUnreal.h"
    
    FAirbridgeUnreal::RegisterPushToken("APNS_DEVICE_TOKEN");

    Hybrid App 设置

    仅通过安装 Web SDK 无法追踪 App 安装、App 启用、深度链接调用等额外事件。您可通过以下设置在 Hybrid App 调用应用内事件:

    C++
    1234567891011
    #include "AirbridgeUnreal.h"
    
    TUniquePtr<IAirbridgeWebInterface> AirbridgeWebInterface;
    
    AirbridgeWebInterface = TUniquePtr<IAirbridgeWebInterface>(FAirbridgeUnreal::CreateWebInterface(
        TEXT("YOUR_WEB_TOKEN"),             // web token
        [](const FString& Msg) -> FString   // post command function
        {
            return TEXT("...");
        }
    ));

    提示

    您可通过 FAirbridgeUnreal::CreateWebInterface 控制 Web Interface。

    Blueprints 使用指南

    请参阅 Blueprints 使用指南

    故障排除


    Android

    1. AndroidX 适用

    - Unreal Engine 4.23 ~ 5.1.0 版本

    从 Airbridge Unreal SDK 1.3.4 版本开始,由于引入了 com.google.android.gms:play-services-appset:16.0.2 Dependency,适用了 AndroidX。因此,需要在 Unreal Plugin Language (UPL) 文件中添加以下设置:

    12345678910111213141516171819202122232425262728293031323334353637
    <gradleProperties>
        <insert>
        android.useAndroidX=true
        android.enableJetifier=true
        </insert>
    </gradleProperties>
    
    <baseBuildGradleAdditions>
        <insert>
        allprojects {
            def classMap = [
                'android.support.annotation': 'androidx.annotation',
                'android.support.v4.app.ActivityCompat': 'androidx.core.app.ActivityCompat',
                'android.support.v4.app.NotificationCompat': 'androidx.core.app.NotificationCompat',
                'android.support.v4.app.NotificationManagerCompat': 'androidx.core.app.NotificationManagerCompat',
                'android.support.v4.content.ContextCompat': 'androidx.core.content.ContextCompat',
                'android.support.v4.content.FileProvider': 'androidx.core.content.FileProvider',
                'android.support.v13.app.FragmentCompat': 'androidx.legacy.app.FragmentCompat',
                'android.arch.lifecycle': 'androidx.lifecycle',
                'android.arch.lifecycle.Lifecycle': 'androidx.lifecycle.Lifecycle',
                'android.arch.lifecycle.LifecycleObserver': 'androidx.lifecycle.LifecycleObserver',
                'android.arch.lifecycle.OnLifecycleEvent': 'androidx.lifecycle.OnLifecycleEvent',
                'android.arch.lifecycle.ProcessLifecycleOwner': 'androidx.lifecycle.ProcessLifecycleOwner',
            ]
            afterEvaluate { project ->
                project.rootProject.projectDir.traverse(type: groovy.io.FileType.FILES, nameFilter: ~/.*\.java$/) { f ->
                    classMap.each { entry ->
                        if (f.getText('UTF-8').contains(entry.key)) {
                            println "Change ${entry.key} to ${entry.value} in file ${f}"
                            ant.replace(file: f, token: entry.key, value: entry.value)
                        }
                    }
                }
            }
        }
        </insert>
    </baseBuildGradleAdditions>

    - Unreal Engine 5.1.1 及以上版本

    无需为适用 AndroidX 进行额外设置。

    2. Google Play services

    - Unreal Engine 4.23 ~ 5.1.0 版本

    从 Airbridge Unreal SDK 1.3.4 版本开始,引入了 com.google.android.gms:play-services-appset:16.0.2 Dependency。为了解决 Dependency Resolution,需要在 Unreal Plugin Language (UPL) 文件中添加以下设置:

    123456789101112131415
    <baseBuildGradleAdditions>
        <insert>
        allprojects {
            subprojects {
                project.configurations.all {
                    resolutionStrategy {
                        force 'com.google.android.gms:play-services-base:11.8.0'
                        force 'com.google.android.gms:play-services-basement:11.8.0'
                        force 'com.google.android.gms:play-services-tasks:11.8.0'
                    }
                }
            }
        }
        </insert>
    </baseBuildGradleAdditions>

    注意

    Unreal Engine 4.23 ~ 5.1.0 版本无法使用从 Airbridge Unreal SDK 1.3.4 版本开始支持的 App Set ID Support 功能。

    - Unreal Engine 5.1.1 及以上版本

    无需为 Dependency Resolution 解决进行额外设置。

    迁移指南


    更新 SDK 时,请考虑以下内容:

    1.3.4

    为了支持 App Set ID,引入了 com.google.android.gms:play-services-appset:16.0.2 Dependency。请参阅 [故障排除]>[Android] 指南,应用 AndroidX 适用代码和 Dependency Resolution 解决代码后,再进行 Android 构建。

    注意

    Unreal Engine 4.23 ~ 5.1.0 版本无法使用从 Airbridge Unreal SDK 1.3.4 版本开始支持的 App Set ID Support 功能。

    1.3.0

    解决了在 1.2.0 ~ 1.2.1 版本中存在的深度链接回调提供的深度链接 URL 被解码 2 次的问题。

    1.2.0

    深度链接回调提供的深度链接 URL 中不再添加 airbridge_referrer

    Was this helpful?

    Any questions or suggestions?