虚幻引擎 SDK - 支持推送通知

文档

支持推送通知

通过将 Firebase Cloud Messaging (FCM) 或 Apple Push Notification service (APNs) 与 Singular SDK 集成,跟踪用户与推送通知的互动,以衡量再参与活动并准确归因转化。

请遵循以下实施指南,以确保通知数据正确传递到 Singular SDK,从而实现正确的归因。

为什么要跟踪推送通知?推送通知能促进用户重新参与,但跟踪需要正确的集成。Singular 可确保与通知互动的用户得到正确归因,从而优化营销活动和参与策略。


实施指南

集成 Singular SDK

使用Singular虚幻引擎SDK指南中记录的标准安装说明在您的虚幻引擎项目中集成Singular SDK


注册推送令牌

向Singular注册您的推送通知令牌,以启用卸载跟踪和推送归因。

C++
// Register push token for uninstall tracking
void UYourGameInstance::OnPushTokenReceived(const FString& Token)
{
    // Pass the FCM or APNs token to Singular
    USingularSDKBPLibrary::SetUninstallToken(Token);
    UE_LOG(LogTemp, Log, TEXT("Push token registered: %s"), *Token);
}

方法签名

static void SetUninstallToken(FString token);

最佳实践:从 FCM (Android) 或 APNs (iOS) 收到推送通知令牌后,请立即致电SetUninstallToken。这样可以确保正确跟踪卸载和推送通知互动。


特定平台处理

iOS 推送通知处理

配置推送通知路径

对于 iOS 实现,请在 SDK 初始化期间配置推送通知有效载荷结构中 Singular 跟踪链接所在的 JSON 路径。

C++
// iOS: Configure push notification link paths in initialization
// Note: This is typically configured through the iOS native bridge
// The Singular iOS SDK automatically handles push tracking when configured

// Example configuration in iOS native code (Objective-C):
// SingularConfig *config = [[SingularConfig alloc] initWithApiKey:@"API_KEY" andSecret:@"API_SECRET"];
// config.singularLinksHandler = ^(SingularLinkParams * _Nonnull params) {
//     // Handle deep link from push notification
// };
// [Singular start:config];

终止状态(应用程序未运行)

处于终止状态的 iOS 应用程序无需手动操作。当用户在应用程序未运行时点击通知时,Singular iOS 集成会自动处理推送跟踪。

自动处理:当用户在应用程序未运行时点击推送通知时,Singular 会在应用程序启动期间通过本地 iOS 集成层自动捕获通知有效载荷。

后台状态(应用程序在后台运行)

当应用程序处于后台时收到通知,iOS SDK 会自动处理通知数据。除了初始令牌注册外,不需要额外的 C++ 代码。

重要:确保您的 iOS 项目正确配置了推送通知功能,并在应用程序初始化期间使用SetUninstallToken 注册了 APNs 令牌。


安卓推送通知处理

Firebase 云消息集成

对于安卓实施,请集成 Firebase Cloud Messaging (FCM),并将推送令牌转发至 Singular SDK 以进行跟踪。

C++
// Android: Register FCM token with Singular
void UYourGameInstance::OnFirebaseTokenReceived(const FString& FcmToken)
{
    // Register the FCM token for uninstall tracking
    USingularSDKBPLibrary::SetUninstallToken(FcmToken);
    UE_LOG(LogTemp, Log, TEXT("FCM token registered with Singular: %s"), *FcmToken);
}

处理推送通知数据

当用户点击包含 Singular 跟踪链接的推送通知时,确保将通知数据传递给应用程序的深度链接处理程序,以便正确归属。

C++
// Handle notification tap event
void UYourGameInstance::OnNotificationTapped(const FString& NotificationData)
{
    // Parse notification data for Singular links
    // Example: Extract "sng_link" or custom key from notification payload

    // If notification contains a Singular tracking link, it will be
    // automatically processed by the SDK's deep link handler

    UE_LOG(LogTemp, Log, TEXT("Notification tapped: %s"), *NotificationData);

    // Route user to appropriate content
    ProcessNotificationDeepLink(NotificationData);
}

void UYourGameInstance::ProcessNotificationDeepLink(const FString& LinkData)
{
    // Your custom deep link routing logic
    if (LinkData.Contains(TEXT("article")))
    {
        // Navigate to article
        OpenArticleScreen();
    }
    else if (LinkData.Contains(TEXT("promotion")))
    {
        // Navigate to promotion
        OpenPromotionScreen();
    }
}

最佳实践:构建推送通知有效载荷,同时包含 Singular 跟踪链接(用于归因)和应用程序的自定义深度链接数据(用于将用户导向特定内容)。


验证指南

验证推送令牌注册

在应用程序初始化过程中检查 SDK 日志,确认推送通知令牌已在 Singular 正确注册。

C++
// Enable SDK logging to verify token registration
bool Success = USingularSDKBPLibrary::Initialize(
    TEXT("YOUR_SDK_KEY"),
    TEXT("YOUR_SDK_SECRET"),
    60,                      // Session timeout
    TEXT(""),                // Custom user ID
    true,                    // Enable SKAdNetwork
    false,                   // Manual SKAN management
    0,                       // Wait for tracking authorization
    false,                   // OAID collection
    true,                    // Enable logging for debugging
    5,                       // Verbose log level
    false,                   // Clipboard attribution
    TEXT(""),                // Facebook App ID
    TEXT("")                 // Custom SDID
);

// After receiving push token
FString PushToken = GetPushNotificationToken();
USingularSDKBPLibrary::SetUninstallToken(PushToken);

// Check logs for confirmation:
// "Push token registered successfully" or similar message

调试提示:在开发过程中启用详细日志(日志级别 5),以查看有关推送令牌注册和通知处理的详细信息。为提高性能,在生产构建中禁用详细日志记录。


在仪表板中验证归属

使用 Singular 面板验证推送通知互动是否被正确跟踪。

  • 重新参与营销活动:检查仪表板中的 "再参与 "部分,查看推送通知营销活动的性能。
  • 用户级数据:导出用户级数据,以验证推送通知接触点是否以正确的归因方式记录。
  • 转换事件:确认推送通知点击后触发的事件归因于正确的营销活动。

高级配置

自定义通知有效载荷结构

调整推送通知有效载荷结构,使其包含 Singular 跟踪参数和自定义数据。

推荐的有效载荷结构(JSON)

{
  "notification": {
    "title": "Special Offer!",
    "body": "Get 50% off today only"
  },
  "data": {
    "sng_link": "https://yourapp.sng.link/Abc12?_dl=myapp://promo",
    "campaign_id": "summer_sale_2025",
    "promo_code": "SAVE50",
    "deep_link": "myapp://promo/summer"
  }
}

关键要素

  • sng_link:用于归因的 Singular 跟踪链接(推送跟踪需要)。
  • campaign_id:您的内部营销活动标识符,供参考。
  • deep_link:您应用程序的自定义深度链接,用于内容路由。
  • 自定义数据:您的应用程序所需的任何附加数据(促销代码、用户细分等)。

注意:Singular SDK 会自动从 "sng_link "密钥中提取并处理跟踪链接。请确保在所有推送通知活动中一致使用此密钥。


深度链接路由实施

实施集中式深度链接处理程序,以便在用户点击推送通知时将其路由到特定内容。

C++
// Centralized deep link handler
class UDeepLinkHandler : public UObject
{
public:
    void HandleDeepLink(const FString& DeepLink)
    {
        // Parse the deep link URL
        if (DeepLink.StartsWith(TEXT("myapp://article/")))
        {
            FString ArticleId = ExtractArticleId(DeepLink);
            NavigateToArticle(ArticleId);
        }
        else if (DeepLink.StartsWith(TEXT("myapp://promo/")))
        {
            FString PromoId = ExtractPromoId(DeepLink);
            NavigateToPromotion(PromoId);
        }
        else if (DeepLink.StartsWith(TEXT("myapp://profile")))
        {
            NavigateToUserProfile();
        }
        else
        {
            // Default: Navigate to home screen
            NavigateToHome();
        }
    }

private:
    FString ExtractArticleId(const FString& Url)
    {
        // Extract article ID from URL
        FString ArticleId;
        Url.Split(TEXT("article/"), nullptr, &ArticleId);
        return ArticleId;
    }

    FString ExtractPromoId(const FString& Url)
    {
        // Extract promo ID from URL
        FString PromoId;
        Url.Split(TEXT("promo/"), nullptr, &PromoId);
        return PromoId;
    }

    void NavigateToArticle(const FString& ArticleId)
    {
        UE_LOG(LogTemp, Log, TEXT("Navigating to article: %s"), *ArticleId);
        // Your navigation logic
    }

    void NavigateToPromotion(const FString& PromoId)
    {
        UE_LOG(LogTemp, Log, TEXT("Navigating to promotion: %s"), *PromoId);
        // Your navigation logic
    }

    void NavigateToUserProfile()
    {
        UE_LOG(LogTemp, Log, TEXT("Navigating to user profile"));
        // Your navigation logic
    }

    void NavigateToHome()
    {
        UE_LOG(LogTemp, Log, TEXT("Navigating to home screen"));
        // Your navigation logic
    }
};

重要注意事项

实施注意事项

  • 令牌注册时间:一旦从 FCM 或 APN 获取推送令牌,最好在 SDK 初始化期间或之后立即向 Singular 注册。
  • 归因流程:当用户点击包含 Singular 链接的通知时,SDK 会在会话开始事件中自动处理归因数据。无需手动处理归因跟踪。
  • 深度链接处理:虽然 Singular 会自动处理归因,但您必须实施自定义的深度链接路由逻辑,以便将用户导航到正确的应用内内容。
  • 有效载荷一致性:在所有推送通知活动中使用一致的关键名称(如 "sng_link"),以确保可靠的跟踪。
  • 平台差异:iOS 和 Android 在系统层面处理推送通知的方式不同。确保您的实施考虑到特定平台的行为。
  • 卸载跟踪:推送令牌还可用于卸载跟踪。Singular 会发送静默推送通知以检测卸载的应用程序,从而提供有价值的留存洞察。

生产检查表:在启动推送通知活动之前,请确认:(1)推送令牌已成功注册;(2)通知有效载荷中包含 Singular 跟踪链接;(3)深层链接路由工作正常;(4)归因数据出现在 Singular 面板中。


隐私和权限

在实施推送通知时,确保符合平台要求和用户隐私法规。

  • iOS 许可:用户必须授予接收推送通知的权限。在应用程序流程的适当时间请求许可,而不是在首次启动时立即请求许可。
  • Android 许可:从 Android 13(API 级 33)开始,应用程序必须请求 POST_NOTIFICATIONS 权限才能发送通知。
  • 用户同意:尊重用户接收营销信息的偏好。在应用程序设置中提供明确的退出机制。
  • 数据隐私:避免在推送通知有效载荷中包含个人身份信息 (PII)。使用用户 ID 或其他非 PII 标识符。

成功:通过遵循这些实施步骤,您的虚幻引擎应用程序现在可以使用 Singular 跟踪推送通知的交互,从而提高活动性能洞察力并确保准确的重新参与归因。