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 中找到)。

其他资源:


初始化 SDK

隐私合规: 在实现 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
{
    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
    }
}

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


高级配置

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 链接器标志,并在 SingularConfig 中启用 enableOdmWithTimeoutInterval

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

查看完整的 iOS ICM 技术要求


配置会话超时

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

会话超时配置

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

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

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


从 .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 安装说明