Unity SDK - 基础集成

前提条件

在安装 Singular Unity SDK 之前,请完成以下前提条件步骤,以确保集成过程顺利进行。

必需的前提条件:


安装

通过 Unity Package Manager (UPM) 安装

Singular Unity SDK 通过 Unity Package Manager 使用 Git URL 进行安装。请按照以下步骤将 SDK 添加到您的项目中。

安装步骤

  1. 打开 Package Manager: 在 Unity 中,导航至 Window > Package Manager 。
  2. 从 Git 添加包: 点击左上角的 [+] 按钮,然后选择 "Add package from git URL" 。
  3. 输入 Git URL:
    • 标准版 SDK: 输入 https://github.com/singular-labs/Singular-Unity-SDK.git
    • 儿童版 SDK: 输入 https://github.com/singular-labs/Singular-Unity-SDK.git#kids
  4. 完成安装: 点击 "Add" 以安装 SDK 包。

未使用 Google EDM4U? 如果您的项目不使用 External Dependency Manager,则必须手动下载并添加原生依赖项。

手动安装依赖项

  1. 下载依赖项: 从 Singular 的 S3 存储桶下载相应的 Plugins.zip 文件:
  2. 解压到 Assets: 解压下载的文件,并将其移动到 Unity 项目中的 Assets > Plugins 。
  3. 配置 iOS 框架: 导航至 Assets > Plugins > iOS 并选择 Singular.xcframework 。
  4. 嵌入二进制文件: 在 Inspector 面板中,勾选 "Add to Embedded Binaries" 选项。

Android 配置提示

请配置您的 Android 构建设置,以确保 SDK 正常运行。Unity 提供了多种方式来自定义 Android 清单文件和 Gradle 文件。

如何更新 AndroidManifest.xml

您可以使用以下两种方法之一修改 AndroidManifest:

方法 1:Unity 自定义清单

  1. 导航至 File > Build Settings > Player Settings > Publishing Settings 。
  2. 在 Publishing Settings 部分下启用 "Custom Main Manifest" 。
  3. Unity 会在 Assets/Plugins/Android/AndroidManifest.xml 处生成一个默认的 AndroidManifest.xml 文件。
  4. 编辑此文件以添加所需的权限和配置。

来源: Unity Android Manifest 文档

方法 2:Android Studio

  1. 使用 File > Build Settings > Export Project 从 Unity 导出您的项目。
  2. 在 Android Studio 中打开导出的项目。
  3. 直接在 Android Studio 中编辑 AndroidManifest.xml 文件。
如何更新 Gradle 构建文件

方法 1:Unity 自定义模板

  1. 导航至 File > Build Settings > Player Settings > Publishing Settings 。
  2. 在 Publishing Settings 部分下启用 "Custom Gradle Template" 。
  3. Unity 会在 Assets/Plugins/Android/mainTemplate.gradle 处生成一个 mainTemplate.gradle 文件。
  4. 将您的自定义 Gradle 配置添加到此文件中。

来源: Unity Gradle Overview 文档

方法 2:Android Studio

  1. 从 Unity 导出您的项目。
  2. 在 Android Studio 中打开项目。
  3. 直接编辑应用的 build.gradle 文件。
解决重复类错误

在 Unity 中构建 Android 应用时,您可能会遇到由多个 SDK 引入相同的传递依赖项而导致的 "Duplicate class"(重复类)错误。这种情况通常在同时使用 AppLovin SDK 和 Singular SDK 时,因 Android Vending Licensing 库而发生。

错误示例:

Duplicate class com.android.vending.licensing.ILicensingService found in modules
applovin-sdk-13.5.0.aar -> jetified-applovin-sdk-13.5.0-runtime (com.applovin:applovin-sdk:13.5.0)
and singular_sdk-12.11.0.aar -> jetified-singular_sdk-12.11.0-runtime (com.singular.sdk:singular_sdk:12.11.0)

解决方案 1:使用 External Dependency Manager (EDM4U)

如果您的项目使用 External Dependency Manager for Unity (推荐),请向您的 Dependencies XML 文件添加排除规则。

  1. 在您的 Unity 项目中找到 *Dependencies.xml 文件(通常位于 Assets/Editor 或类似位置)。
  2. 向其中一个 SDK 依赖项添加排除规则:
XML
<dependencies>
  <androidPackages>
    <androidPackage spec="com.applovin:applovin-sdk:13.5.0">
      <androidSdkPackageIds>
        <exclude group="com.android.vending" module="licensing"/>
      </androidSdkPackageIds>
    </androidPackage>
    <androidPackage spec="com.singular.sdk:singular_sdk:12.11.0" />
  </androidPackages>
</dependencies>

注意: 与修改 Gradle 模板相比,此方法更持久,因为 Android Resolver 在解析过程中可能会覆盖自定义模板的更改。

解决方案 2:使用自定义 Gradle 模板

如果您未使用 EDM4U,请直接在您的 Gradle 配置文件中应用排除规则。

  1. 导航至 File > Build Settings > Player Settings > Publishing Settings 。
  2. 启用 "Custom Main Gradle Template" 或 "Custom Launcher Gradle Template" 。
  3. 打开 Assets/Plugins/Android/mainTemplate.gradle (或 launcherTemplate.gradle )。
  4. 将排除规则添加到您的 dependencies 块中:
Gradle
dependencies {
    implementation('com.applovin:applovin-sdk:13.5.0') {
        exclude group: 'com.android.vending', module: 'licensing'
    }
    implementation 'com.singular.sdk:singular_sdk:12.11.0'
}

替代方案: 通过在 dependencies 块之后添加以下内容来应用全局排除:

Gradle
configurations.all {
    exclude group: 'com.android.vending', module: 'licensing'
}

验证解决结果

  1. 应用排除规则后,通过删除 Library/Bee 和 Temp 文件夹来清理您的项目。
  2. 在 Unity 中重新构建您的 Android 项目。
  3. 确认构建输出中不再出现重复类错误。

工作原理: 两个 SDK 都将相同的 Android licensing 库作为传递依赖项捆绑在一起。排除规则告诉 Gradle 仅使用一个副本,从而解决冲突。

ProGuard 配置

如果您的项目使用 ProGuard 进行代码混淆,请将以下 keep 规则添加到您的 proguard-unity.txt 文件中,以防止 Singular SDK 被剥离:

proguard-unity.txt
-keep class com.singular.sdk.** { *; }
-keep public class com.android.installreferrer.** { *; }
-keep public class com.singular.unitybridge.** { *; }

iOS 配置提示

配置 iOS 特定的设置,以启用正确的归因、深度链接和测试功能。

更新 CocoaPods 依赖项

在为 iOS 构建 Unity 项目之后、在 Xcode 中构建之前,请更新您的 CocoaPods 依赖项,以确保您拥有最新的 SDK 版本。

Terminal
cd /path/to/your/ios/project
pod repo update
pod update
记录 IDFV 以供测试

在测试您的集成时,记录 IDFV (Identifier for Vendor),以便快速将您的测试设备添加到 Singular SDK Console 中。

添加 IDFV 日志记录

  1. 在从 Unity 构建后打开您的 Xcode 项目。
  2. 导航至 Classes > UnityAppController.mm 。
  3. 找到 applicationDidBecomeActive 方法。
  4. 添加以下代码以记录 IDFV:
Objective-C
// Log IDFV for testing
NSLog(@"Singular === IDFV: %@", [[[UIDevice currentDevice] identifierForVendor] UUIDString]);
  1. 在 Xcode 中构建并运行您的应用。
  2. 检查 Xcode 控制台日志以获取 IDFV 输出。
  3. 复制 IDFV 并将其作为测试设备添加到 Singular SDK Console 中。
配置深度链接支持

通过在您的 Xcode 项目中配置 Associated Domains,启用用于深度链接的 Universal Links。

  1. 添加 Associated Domain: 在 Xcode 中,导航至您应用目标的 Signing & Capabilities 选项卡。
  2. 启用功能: 点击 [+] Capability 并添加 "Associated Domains" 。
  3. 添加域名: 以以下格式添加您的 Singular 追踪域名: applinks:yourdomain.sng.link
  4. 配置 Team ID: 在 Singular 仪表板中,导航至您应用的设置并添加您的 Apple Team ID。这样 Singular 即可生成并托管 Universal Links 所需的 Apple App Site Association (AASA) 文件。

重要: 如果没有正确配置 Associated Domains 和 Team ID,Universal Links 将无法工作,用户也将无法从 Singular 追踪链接打开您的应用。

⚠️ 重要:解决 UnityAppController 冲突

如果您正在使用其他注册 UnityAppController 的 SDK(例如 Firebase、Adjust 或 AppsFlyer),则可能会遇到导致 Singular 无法正常初始化的冲突。在 Unity 中,同一时间只能有一个类注册为 UnityAppController。

要解决此冲突:

  1. 打开 您 Xcode 项目中的 SingularSwizzledAppController.m 文件。
  2. 取消注释此文件中的所有代码。
  3. 打开 SingularAppDelegate.m 并验证以下行未被注释掉:
    IMPL_APP_CONTROLLER_SUBCLASS(SingularAppDelegate)

这样 Singular 即可通过方法 swizzling 而非子类化 UnityAppController 的方式,与其他 SDK 协同工作。


集成 SDK

创建 SingularSDK GameObject

Singular SDK 需要在您的 Unity 场景层级中有一个 GameObject 才能运行。您可以使用提供的预制件 (prefab) 或手动创建来添加此 GameObject。

方法 1:使用 Singular 预制件(推荐)

将预制件添加到场景

  1. 在 Project 面板中,导航至 Packages > Singular > SingularSDK > Prefabs 。
  2. 将 SingularSDKObject 预制件拖入您的 Hierarchy 面板中。
  3. 现在该预制件已可在 Inspector 中进行配置。
方法 2:手动创建 GameObject

手动创建 GameObject

  1. 在 Hierarchy 面板中,右键单击并选择 Create Empty 。
  2. 将该 GameObject 命名为 SingularSDKObject (必须使用此确切名称)。
  3. 在选中该 GameObject 的情况下,导航至 Inspector 面板。
  4. 点击 Add Component 。
  5. 搜索 "Singular" 并选择 Singular SDK 脚本组件。

关键: 该 GameObject 的名称必须确切为 SingularSDKObject ,SDK 才能正常运行。

配置 SDK 设置

通过 Unity Inspector 配置您的 SDK 凭据和初始化设置。SDK 需要您的 API Key 和 Secret 才能与 Singular 的服务器通信。

添加 API 凭据

  1. 选择 SingularSDKObject: 在您的 Hierarchy 中点击 SingularSDKObject。
  2. 找到凭据: 登录您的 Singular 账户 并导航至 Developer Tools > SDK Integration > SDK Keys 。
  3. 复制密钥: 复制您的 SDK Key 和 SDK Secret 。
  4. 粘贴到 Inspector: 在 Unity 的 Inspector 面板中,将凭据粘贴到 Singular API Key 和 Singular API Secret 字段中。

关键: 请勿使用 Singular Reporting API Key。请仅使用 SDK Integration 页面中专用于 SDK 的 API Key 和 Secret。使用错误的凭据会导致数据无法发送到 Singular。

验证您的集成: 配置完成后,使用 Singular SDK Console 测试您的实现,以确保事件被正确跟踪。

默认 Inspector 设置

SingularSDKObject 附带合理的默认值。了解这些设置有助于您根据应用的需求自定义 SDK 的行为。

默认配置选项
  • Initialize On Awake: 默认启用。当 GameObject 唤醒时,SDK 会自动初始化。如果您需要为隐私同意或其他要求而延迟初始化,请禁用此选项。
  • SKAN Enabled: 默认启用(仅限 iOS)。在托管模式 (Managed Mode) 下启用 SKAdNetwork 归因,Singular 会根据您配置的转化模型自动更新转化值。
  • Wait For Tracking Authorization: 设置为 0(禁用)。如果您的应用显示 iOS App Tracking Transparency (ATT) 提示,请将其设置为 300 秒。这会将 SDK 会话延迟到用户响应 ATT 提示之后,确保在授予同意时能够捕获 IDFA。如果不使用 ATT,请保持为 0。
  • Enable Logging: 默认启用。输出 SDK 调试日志,以帮助集成和故障排除。在生产版本中应禁用此选项。它与 Log Level 设置(见下文)配合使用。
  • Log Level: 默认设置为 3 (Info)。控制日志记录的详细程度。数字越小,日志越详细:
    C#
    // Based on Android Logger log levels
    public enum LogLevel {
       Verbose = 2,  // Most verbose
       Debug   = 3,
       Info    = 4,  // Default
       Warn    = 5,
       Error   = 6,
       Assert  = 7   // Least verbose
    }

    注意: 详细日志主要在 Android 上可用。

  • DDL Timeout Sec: 设置为 0(使用 60 秒的默认值)。决定 SDK 等待服务器返回延迟深度链接数据的时长。如果在此超时后仍未找到延迟深度链接,服务器将停止搜索。
  • Session Timeout Sec: 设置为 0(使用 60 秒的默认值)。定义应用在后台运行多长时间后,SDK 会在返回前台时创建新会话。
  • Shortlink Resolve Timeout: 设置为 0(使用 10 秒的默认值)。等待短链接解析的最长时间。通过防止在短链接无法解析时长时间等待,保护用户体验。

其他配置选项

Facebook (Meta) Install Referrer 配置

自 2025 年 6 月 18 日起: Meta 的 Advanced Mobile Measurement (AMM) 消除了实现 Meta Install Referrer 的需要。如果已启用 AMM 报告,则无需配置 Meta Install Referrer。

如果您需要支持旧版 Meta Install Referrer 归因方法,请将您的 Facebook App ID 添加到 SingularSDKObject 配置中。

配置步骤

  1. 在您的场景层级中选择 SingularSDKObject 。
  2. 在 Inspector 面板中,找到 "Facebook App ID" 字段。
  3. 输入您的 Facebook App ID(可在您的 Facebook Developer Console 中找到)。

其他资源:

完整的配置选项列表请参阅Unity SDK 配置参考。


初始化 SDK

关于 SDID

SDID(Singular Device ID)是由 Singular 生成和管理的设备级标识符。在混合集成中(此 SDK 在您的应用中运行,同时您的服务器还通过 Server-to-Server(S2S)API 发送事件),在这些服务器端事件中发送相同的 SDID,可将它们与 SDK 正在追踪的同一设备关联起来。这样,Singular 无需依赖平台特定的广告标识符,即可将 SDK 和 S2S 活动归因到单个设备。

默认启用 SDID: 自 2026 年 7 月 14 日起,新的 Singular 客户默认启用 SDID(Singular Device ID)。SDK 会在初始化期间自动生成并解析 SDID,因此无需额外配置。下面的示例注册了 SDID 接收回调,以便你可以在日志中确认 SDK 已收到 SDID。

自定义 SDID 是企业版功能: 设置自定义 SDID 是企业版功能,默认未启用。除非你的账户已启用该功能,否则请勿设置自定义 SDID;请联系你的 Singular Customer Success Manager。下面的示例特意不设置自定义 SDID。

隐私合规: 在实现 Singular SDK 时,请遵守您运营所在地区的隐私法律,包括 GDPR、CCPA、COPPA 等。有关指南,请参阅 SDK 选择加入与选择退出实践 。

每次应用启动时都要初始化 Singular SDK。SDK 初始化对于所有 Singular 归因功能都是必不可少的,并且会创建一个用于计算用户留存指标的新会话。

自动初始化

默认情况下, SingularSDK.cs 脚本会在您的场景加载时,通过 Unity 的 Awake() 方法自动初始化 SDK。如果在 Inspector 中启用了 Initialize On Awake ,则无需额外代码。

手动初始化

如果您需要在特定时间初始化 SDK(例如,在获得用户同意之后),请禁用自动初始化并手动调用初始化方法。

手动初始化设置

  1. 在您的场景层级中选择 SingularSDKObject 。
  2. 在 Inspector 面板中,取消勾选 Initialize On Awake 。
  3. 在准备好初始化时,在您的代码中调用 SingularSDK.InitializeSingularSDK() 。

InitializeSingularSDK 方法

在禁用自动初始化时,使用此方法手动初始化 SDK。

C#
using UnityEngine;
using Singular;

public class GameInitializer : MonoBehaviour, SingularSdidAccessorHandler
{
    void Awake()
    {
        // Register the SDID accessor handler before initialization (SDID is enabled by default for new accounts)
        SingularSDK.SetSingularSdidAccessorHandler(this);
    }

    void Start()
    {
        // Perform any required setup (e.g., consent management)
        CheckUserConsent();

        // Initialize Singular SDK after consent is obtained
        // SDK Key and Secret are configured on the SingularSDKObject
        SingularSDK.InitializeSingularSDK();
    }

    void CheckUserConsent()
    {
        // Your consent logic here
    }

    // Log the SDID once the SDK receives it
    public void SdidReceived(string result)
    {
        Debug.Log("Singular SDID received: " + result);
    }

    public void DidSetSdid(string result)
    {
        Debug.Log("Singular SDID set: " + result);
    }
}

线程安全: 请始终从用于其他 Unity API 调用的同一线程调用 Singular Unity SDK 方法。该 SDK 在多个线程间不是线程安全的。

完整的配置说明请参阅InitializeOnAwake 参考。


高级配置

Google Ads iOS 集成转化衡量所需

如果您的应用投放面向 iOS 14.5+ 用户的 Google Ads 广告系列,则需要额外的 SDK 配置步骤来支持 iOS 集成转化衡量 (ICM)。这包括:

  • 集成 Google 的 On-Device Measurement (ODM) SDK
  • 更新到 Singular iOS SDK v12.8.1+(或 Unity 的 v5.5.0+、Flutter/Cordova 的 v1.8.0+、React Native 的 v3.9.0+)
  • 添加 -ObjC 链接器标志,并在 SingularSDK 中启用 enableODMWithTimeoutInterval

注意: 启用 enableODMWithTimeoutInterval 会延迟 SDK 初始化,并可能延迟深度链接回调。请在初始 SDK 实现期间完成此设置,以避免返工。

查看完整的 iOS ICM 技术要求

完整的配置说明请参阅enableODMWithTimeoutInterval 参考。


配置会话超时

自定义您的应用在后台保持多长时间后,SDK 会在应用返回前台时创建新会话。

会话超时配置

默认会话超时为 60 秒。要更改此值:

  1. 在您的场景层级中选择 SingularSDKObject 。
  2. 在 Inspector 面板中,找到 Session Timeout Sec 字段。
  3. 输入您所需的超时值(以秒为单位,例如 120 表示 2 分钟)。
  4. 保持为 0 以使用默认的 60 秒超时。

最佳实践: 设置会话超时时,请考虑您应用的典型使用模式。会话频繁且短暂的游戏可能受益于较短的超时,而生产力类应用可能需要较长的超时。

完整的配置说明请参阅sessionTimeoutSec 参考。


从 .unitypackage 升级到 UPM

如果您正在从旧版 .unitypackage 安装方式迁移到现代的 Unity Package Manager (UPM) 方式,请遵循以下关键升级步骤。

迁移说明:从 .unitypackage 到 UPM

关键: 在安装 UPM 包之前,您必须手动删除所有现有的 Singular SDK 文件。否则将导致冲突和构建错误。

升级流程

在通过 Unity Package Manager 安装 SDK 之前,请按顺序完成以下步骤:

逐步删除文件

1. 删除代码文件

导航至您项目的 /Code 文件夹(通常为 Assets/Singular/Code ),并删除所有与 Singular 相关的 C# 脚本。

2. 删除 Android 依赖项

导航至 /Plugins/Android 并删除以下 Singular 文件:

  • 所有名称中含有 "singular" 的 .aar 文件
  • 所有名称中含有 "singular" 的 .jar 文件
  • singular-sdk.aar
  • install-referrer-*.aar
  • singular-unitybridge.aar

3. 删除 iOS 依赖项

导航至 /Plugins/iOS 并删除以下 Singular 文件:

  • 所有 .h 头文件(例如 SingularSDK.h )
  • 所有 .m 实现文件(例如 SingularUnityBridge.m )
  • Singular.xcframework 文件夹

重要: 只删除 Singular 专属的文件。请注意不要删除您项目可能依赖的其他插件文件。

4. 验证已清理干净

  1. 删除文件后,完全关闭 Unity。
  2. 删除项目目录中的 Library 文件夹,以强制 Unity 重新导入资源。
  3. 重新打开您的 Unity 项目。
  4. 等待 Unity 完成资源的重新导入。
  5. 在继续进行 UPM 安装之前,确认没有编译错误。

5. 安装 UPM 包

现在您可以通过 Unity Package Manager 安装 Singular SDK。请遵循本指南顶部的 UPM 安装说明 。