Unity SDK - 卸载跟踪

文档

卸载跟踪

通过将推送通知服务与 Singular SDK 集成,跟踪应用程序的卸载情况,以衡量用户保留率并优化重新参与活动。

重要:谷歌已于 2018 年 4 月弃用 GCM API。 所有安卓卸载跟踪实施均使用 Firebase Cloud Messaging (FCM)。

安卓卸载跟踪

前提条件

在您的 Unity 应用程序中实施卸载跟踪之前,请按照 "设置 Android 卸载跟踪 "指南在 Singular 平台中配置您的应用程序。


系统要求

卸载跟踪需要 Firebase Cloud Messaging 和特定的设备配置。

FCM 要求(源):

  • 安卓版本:设备必须运行 Android 4.1 (API 16) 或更高版本
  • Google Play 服务:设备必须安装 Google Play Store 应用程序
  • 模拟器支持:支持带有 Google API 的 Android 4.1 或更高版本模拟器
  • 分发:应用程序可在 Google Play Store 之外分发,同时仍支持卸载跟踪

注意:不支持的 Android 版本或没有 Google Play 服务的设备上的用户将不会被跟踪卸载。


实施步骤

第 1 步:整合 Firebase 云消息服务

在您的 Unity 应用程序中设置 Firebase 云消息(如果尚未配置)。

请按照 Google 官方指南为 Unity 设置 Firebase 云消息服务。 其中包括

  1. 将 Firebase 添加到您的 Unity 项目
  2. 导入 Firebase Messaging Unity 软件包
  3. 为 Android 配置 Firebase 设置
  4. 申请通知权限(Android 13+)

第 2 步:配置 AndroidManifest.xml

在 Android 清单中注册 Firebase 消息服务,以接收 FCM 消息。

AndroidManifest.xml
<service 
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

重要:.java.MyFirebaseMessagingService 替换为扩展FirebaseMessagingService 的类的完整限定名称。


步骤 3:注册 FCM 设备令牌

在SDK初始化之前,读取FCM设备令牌并将其发送给Singular,以便卸载跟踪。

C#
using UnityEngine;
using Singular;
using Firebase.Messaging;
using System.Threading.Tasks;

public class UninstallTrackingManager : MonoBehaviour
{
    async void Start()
    {
        // Initialize Firebase
        await InitializeFirebase();

        // Get FCM token and register it with Singular
        await RegisterFCMToken();

        // Initialize Singular SDK after registering the token
        SingularSDK.InitializeSingularSDK();
    }

    private async Task InitializeFirebase()
    {
        var dependencyStatus = await Firebase.FirebaseApp.CheckAndFixDependenciesAsync();

        if (dependencyStatus == Firebase.DependencyStatus.Available)
        {
            Debug.Log("Firebase is ready");
        }
        else
        {
            Debug.LogError($"Could not resolve Firebase dependencies: {dependencyStatus}");
        }
    }

    private async Task RegisterFCMToken()
    {
        try
        {
            // Get FCM token
            string token = await Firebase.Messaging.FirebaseMessaging.GetTokenAsync();

            if (!string.IsNullOrEmpty(token))
            {
                // Register token with Singular BEFORE SDK initialization
                SingularSDK.RegisterTokenForUninstall(token);
                Debug.Log($"FCM token registered with Singular: {token}");
            }
            else
            {
                Debug.LogWarning("FCM token is empty");
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Error getting FCM token: {ex.Message}");
        }
    }
}

关键: RegisterTokenForUninstall()方法必须SingularSDK.InitializeSingularSDK()之前调用。在初始化之后注册令牌将无法实现卸载跟踪。


步骤 4:处理令牌刷新

每当 FCM 令牌刷新时,就用 Singular 更新令牌,以保持准确的卸载跟踪。

C#
using UnityEngine;
using Singular;
using Firebase.Messaging;

public class FCMTokenRefreshHandler : MonoBehaviour
{
    void Start()
    {
        // Subscribe to token refresh event
        Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
    }

    void OnDestroy()
    {
        // Unsubscribe when destroyed
        Firebase.Messaging.FirebaseMessaging.TokenReceived -= OnTokenReceived;
    }

    private void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs e)
    {
        Debug.Log($"New FCM token received: {e.Token}");

        // Update token with Singular
        SingularSDK.RegisterTokenForUninstall(e.Token);

        // Also send token to your server if needed
        SendTokenToServer(e.Token);
    }

    private void SendTokenToServer(string token)
    {
        // Implement your server communication logic here
        Debug.Log($"Sending token to server: {token}");
    }
}

最佳做法:FCM 令牌可以随时刷新(应用程序更新、设备还原等)。请始终订阅TokenReceived 事件,以便用最新令牌保持 Singular 的更新。


iOS 卸载跟踪

前提条件

iOS 卸载跟踪基于苹果推送通知服务(APN)技术。

如果您的应用程序不支持推送通知,请参阅 Apple向 APNs 注册应用程序的指南


注册 APNS 设备令牌

在 SDK 初始化后,使用RegisterTokenForUninstall 方法传递从 APNs 返回的设备令牌。

方法签名

public static void RegisterTokenForUninstall(string APNSToken)

参数

  • APNSToken:从 APNs 返回的设备令牌,十六进制字符串

令牌格式:APNS 令牌的原始格式通常是二进制数据,但必须以十六进制字符串的形式传递给 Singular。


使用示例

向 Singular 注册 APNS 设备令牌,用于 iOS 卸载跟踪。

C#
using UnityEngine;
using Singular;

#if UNITY_IOS
using Unity.Notifications.iOS;
#endif

public class iOSUninstallTracking : MonoBehaviour
{
    void Start()
    {
        #if UNITY_IOS
        // Initialize Singular SDK first
        SingularSDK.InitializeSingularSDK();

        // Request notification authorization
        RequestNotificationAuthorization();
        #endif
    }

    #if UNITY_IOS
    private void RequestNotificationAuthorization()
    {
        var authorizationOption = AuthorizationOption.Alert | 
                                  AuthorizationOption.Badge | 
                                  AuthorizationOption.Sound;

        using (var req = new AuthorizationRequest(authorizationOption, true))
        {
            while (!req.IsFinished)
            {
                // Wait for authorization
            }

            string deviceToken = req.DeviceToken;

            if (!string.IsNullOrEmpty(deviceToken))
            {
                // Convert device token to hex string and register with Singular
                SingularSDK.RegisterTokenForUninstall(deviceToken);
                Debug.Log($"APNS token registered: {deviceToken}");
            }
            else
            {
                Debug.LogWarning("Failed to get APNS device token");
            }
        }
    }
    #endif
}

令牌示例

// Pass the APNS token as a hex-string
SingularSDK.RegisterTokenForUninstall("ba85ab31a7c7f5c2f012587f29fb0e596d4b67e7b7b2838fa1a8582c1f7dbdee");

平台差异:安卓系统必须SDK 初始化注册令牌,而 iOS 系统的令牌则应在 SDK 初始化注册。


验证和故障排除

验证实施

确认卸载跟踪工作正常。

  1. 检查日志:验证令牌注册是否出现在 Unity 控制台日志中。
  2. 测试令牌生成:确保首次启动应用程序时生成令牌
  3. 监控仪表板:检查 Singular 仪表板,查看 24-48 小时后的卸载跟踪数据
  4. 测试令牌刷新:清除应用程序数据并验证令牌更新是否正确

常见问题

  • 未生成 Android 令牌:验证是否正确添加了 Firebase 依赖关系,以及是否在 Unity 项目中配置了 Firebase
  • 令牌未更新:检查您是否订阅了 Android 的TokenReceived 事件或正确处理了 iOS 的 APNs 回调
  • 缺少数据:确保设备符合平台要求(Android 4.1+ 支持 Google Play 服务,iOS 支持 APNs
  • 配置错误:确认已在 Singular 平台设置中启用卸载跟踪功能
  • 初始化顺序:对于 Android,确认RegisterTokenForUninstall()InitializeSingularSDK()之前调用

其他资源:有关详细的故障排除,请参阅《Android 卸载跟踪设置指南》Firebase Cloud Messaging for Unity 文档