Unity 包管理器 SDK 集成指南

 

开始之前:SDK 先决条件

  • 按照集成 Singular SDK中的步骤操作:规划和先决条件》中的步骤。
    这些步骤是任何 Singular SDK 集成的先决条件。
  • 验证您是否使用Google EDM4U,即用于 Unity 的 Google 外部依赖关系管理器
    什么是 Google EDM4U?了解更多 [此处]
警告:升级到 5.3.0 版时的破坏性更改

从5.3.0版本开始,如果您的项目使用应用内购买,Singular要求将Unity应用内购买(IAP)库作为强制依赖项。必须通过 Unity 包管理器(package.json)将其导入到您的 Unity 项目中。

在 Singular Unity SDK 中启用访问 IAP 功能的步骤。

步骤 1:通过 UPM 安装 Unity IAP:

  1. 打开软件包管理器: 在 Unity 编辑器中,转到窗口软件包管理器。
  2. 选择 Unity 注册表: 在 "软件包管理器 "窗口中,从顶部的下拉菜单中选择 "Unity 注册表"。
  3. 搜索 Unity IAP: 滚动列表或使用搜索栏查找应用内购买或 Unity IAP。
  4. 安装软件包: 找到 In-App Purchasing 后,点击它,然后点击右侧面板上的安装按钮。
  5. 验证安装: 安装完成后,Unity 会自动将必要的资产和依赖项添加到您的项目中,包括在 Assets/Plugins 下为 Unity Purchasing 资产添加一个文件夹。

第 2 步:设置脚本定义符号:

为每个平台(Android 和 iOS)设置以下脚本定义符号:

  1. 导航至 "播放器设置" > "播放器" > "Android/iOS" > "脚本编译"。
  2. 在脚本定义符号字段中添加"SINGULAR_SDK_IAP_ENABLED"
    PlayerSettingIAP.png

    这可以通过 Unity 编辑器或 Unity Cloud 控制面板完成。

警告:如果未正确完成上述任何步骤,将导致编译时出错,从而可能无法成功构建项目。

警告: 您是否正在从".unitypackage"升级到"UPM"SDK 版本?您必须执行特定的升级步骤,如下所述!
重要: 在继续安装 UPM SDK 之前,请执行以下升级步骤。

升级需要手动删除现有的 Singular SDK 文件,这些文件是使用.unitypackage 中已废弃的集成流程导入的。
这必须在使用 Unity Package Manager (UPM) 导入 SDK 之前完成!

在使用 Unity Package Manager (UPM) 集成 SDK 之前,请删除以下文件列表。请格外小心,确保只移除此处指出的奇异文件:

  1. 从项目的/Code文件夹中:
    unity_upgrade_code_folder_file_removal.png

  2. 从项目的/Plugins/Android文件夹中删除 AAR 和 JAR:
    unity_upgrade_plugin_android_folder_file_removal.png

  3. 从项目的/Plugins/iOS文件夹中移除 iOS .h 和 .m 文件以及 .xcframework:
    unity_upgrade_plugin_ios_folder_file_removal.png

1.安装 SDK

1.1.下载和导入 SDK 软件包

使用Unity 软件包管理器 (UPM)安装 Singular Unity SDK
  1. 软件包管理器窗口中

      • 点击[+]按钮
      • 选择"从 git URL 添加软件包
      • 对于非儿童 SDK
        输入Singular Unity SDK GitHub URL:
        https://github.com/singular-labs/Singular-Unity-SDK.git
      • 对于儿童 SDK
        输入Singular Unity 儿童 SDK GitHub URL:
        https://github.com/singular-labs/Singular-Unity-SDK.git#kids

    unity-git-url.png

  2. 点击"添加 "按钮
重要:如果您没有使用 Google 的 EDM4U,请按照以下额外步骤操作。

1.2.为 Android 配置

提示: 使用 Unity 时如何更新 AndroidManifest?
  1. 从 Unity v2018.3 起,您只需启用播放器窗口上的自定义主 Manifest属性(可通过 "文件">"构建设置">"播放器设置">"发布设置 "访问),即可添加自己的AndroidManifest 文件。这样就会为你生成一个默认的AndroidManifest.xml文件,你可以对其进行编辑。

    文件位置为Assets/Plugins/Android/AndroidManifest.xml

    来源:https://docs.unity3d.com/2023.2/Documentation/Manual/android-manifest.html

  2. 从 Unity 导出应用程序后,您可以从 Android Studio 访问AndroidManifest.xml,而不是使用 Unity 自定义的 MainManifest文件。

提示: 使用 Unity 时如何更新 Gradle 设置。
  1. 从 Unity v2018.3 起,只需启用播放器窗口上的自定义 Gradle 模板属性(可通过 "文件">"构建设置">"播放器设置">"发布设置 "访问),就可以添加自己的自定义 Gradle 构建文件。这会生成一个默认的mainTemplate.gradle文件供你编辑。

    文件位置如下Assets/Plugins/Android/mainTemplate.gradle

    来源:https://docs.unity3d.com/2023.2/Documentation/Manual/android-gradle-overview.html

  2. 从 Unity 导出应用程序后,您可以从 Android Studio 访问应用程序build.gradle,而不是使用 Unity 的自定义Gradle构建文件。

您是否使用 Proguard

如果您使用 Proguard,请 在 proguard-unity.txt 文件中添加以下代码行:

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

1.3.iOS 提示

提示:在 Unity 中构建后,在 Xcode 中构建更新 Cocoa Pod

我们建议从 Pods 所在文件夹启动以下命令。

pod repo update
pod update
提示: 从 applicationDidBecomeActive() 中记录 IDFV 标识符。

要在 iOS 上进行测试,我们建议在以下目录中添加以下代码行:类 > UnityAppController > applicationDidBecomeActive函数中添加以下代码。

// Printing Identifier for Vendor (IDFV) to Xcode Console for use in Singular SDK Console


NSLog(@"Singular === IDFV: %@", [[[UIDevice currentDevice] identifierForVendor] UUIDString]);

idfv.png

这将允许您在 Xcode 日志中检索应用程序打开时的IDFV 标识符。在 Singular SDK 控制台中使用此标识符添加测试设备。

idfv3.png

提示:深层链接支持提醒
  1. "签名和功能"中添加关联域。如果没有正确配置关联域,点击 Singular 跟踪链接时将无法打开应用程序。

  2. 确认团队 ID 也已添加到 Singular 平台的应用程序页面。这将允许Singular建立和托管所需的苹果应用程序网站关联文件,以启用通用链接功能。

2.SDK 集成

2.1.创建SingularSDKObject

将SingularSDKObject添加到层次结构中

使用 Singularprefab对象添加 SingularSDKObject。

将 Singular 预制对象移动到层次结构窗格中

  • 从 "项目"窗格,导航至包 > Singular > SingularSDK > 预制件
  • 将 SingularSDKObject 移到 "层次结构"窗格中
    unity_prefab.png
如果使用预制GameObject,请按照以下步骤手动添加 "SingularSDKObject "GameObject。

在层次结构窗格中

  1. 场景中创建一个空 GameObject
  2. 将 GameObject 命名为SingularSDKObject
    重要提示: GameObject 必须命名为 "SingularSDKObject",Singular 的 SDK 才能运行。
  3. 单击 SingularSDKObject。
  4. 导航到 "检查窗格"。
  5. 在 "检查 "窗格中,单击 "添加组件
  6. 在搜索栏中输入"Singular"并选择"Singular SDK"脚本。
    unity_add_script.png

配置 SingularSDKObject 设置

  1. SingularSDKObject 的 "检查 "窗格中,将 Singular SDK 密钥和 SDK 秘密粘贴到相应字段。要获取 SDK 密钥和秘钥,请登录您的 Singular 账户,进入"开发工具 > SDK 集成 > SDK 密钥"(Developer Tools > SDK Integration > SDK Keys)。

    sdk_keys.png
    重要:请勿使用 Singular 报告 API 密钥,否则将无法收到 SDK 数据。请按照上述说明获取正确的密钥和秘钥。
    unity_singularsdkobject_settings.png

    如果 Singular SDK 密钥和秘密应用错误,数据将无法发送到 Singular。
    使用 Singular SDK 控制台测试您的实现,以验证行为是否正确。

    注: SingularSDKObject 的默认检查窗格设置

    检查窗格中启用了以下选项:

    • 唤醒时初始化(选中)

      此设置可使 Unity 根据应用程序的唤醒状态控制 Singular SDK 初始化。

      请根据您的应用程序要求遵循隐私合规性,并根据需要更新此选项。取消选中该选项将禁止在唤醒状态下初始化 Singular SDK,并需要手动初始化。

    • 已启用 SKAN(选中)

      从 Unity SDK 4.0.17 版开始, 默认启用SKAdNetwork在托管模式(Singular 使用您在 Singular 面板中选择的转换模型为您更新 SKAN 转换值)下启用。

    • 等待跟踪授权,设置为 0(关闭)

      如果您的应用程序显示 "应用程序跟踪透明度(ATT)"提示,建议将此超时设置为 300 秒。添加超时会延迟 Singular SDK 会话,允许用户在将事件记录到 Singular 服务器之前授权/拒绝 AppTrackingTransparency 同意。一旦用户回复 ATT 提示,Singular SDK 就会继续,不会有任何延迟。这样就可以在用户同意时捕获 IDFA 标识符,以便进行安装归属。如果不显示 ATT,则该选项的默认值应保持为 0(不等待)。

    • 启用日志记录(选中)

      启用 Singular SDK 的日志记录功能。它必须与"日志级别"选项一起使用。
      "日志级别 "应使用 "int "数字指定,如下面的枚举映射所示。在此范围内,数字越小,日志就越详细。

      //Based on Android Logger.java log levels enum: android.util.Log
      public enum LogLevel {
         Verbose = 2,
         Debug   = 3,
         Info    = 4,
         Warn    = 5,
         Error   = 6,
         Assert  = 7
         }

      注意: 目前,大多数日志只适用于 Android 系统。

    • Ddl 超时秒数设置为 0

      默认情况下,设置为 "0 "时,超时时间为 60 秒。这将告诉 Singular 服务器搜索与上次触摸属性相关联的深度链接值的时间。如果找到了延迟的深度链接,它会在 SDK 会话请求的响应中发送回应用程序,并在 SingularLinkHandler 中进行处理。如果在 60 秒内没有找到递延深度链接,服务器就会停止搜索。

    • 会话超时秒数设置为 0

      这是应用程序从后台返回前台时,Singular SDK 注册新会话前的超时时间(以秒为单位)。默认情况下,设置为 "0 "时,超时时间为 60 秒。如有需要,您可以调整此设置以获得更大的窗口。

    • 短链接解决超时设置为 0

      默认情况下,设置为 "0 "将使用 10 秒超时。该超时可保护用户体验。如果给定的短链接在指定时间内未解决,则 Singular SDK 不会触发深度链接处理程序。

    其他检查窗格选项:

    启用 Facebook(META 安装推荐人)

    要支持 META 安装推荐人归属方法,请将您的 Facebook 应用程序 ID 添加到 SingularSDKObject 的检测窗格中。

    1. 单击主场景中的 SingularSDKObject。
    2. 打开 "检查窗格",找到 "Facebook 应用 ID "字段。
    3. 添加 Facebook 应用程序 ID

2.2.使用 SKAdNetwork

从 Unity SDK 4.0.17 版开始, SKAdNetwork默认启用。 它在 "托管模式"(Singular 使用您在 Singular 面板中选择的转换模型为您更新 SKAN 转换值)中启用。

要使用 SKAdNetwork,只要您使用的是最新的 SDK,就不需要设置任何其他内容或添加任何代码。

其他信息

在旧版本的 SDK 中启用 SKAdNetwork

如果您使用的是旧版本的 SDK,则需要通过以下方法之一启用 SKAdNetwork:

  • 转到SingularSDKObject并将SKANEnabled设为True
  • 在应用程序代码中调用SingularSDK.SkanRegisterAppForAdNetworkAttribution()
在手动模式下使用 SKAdNetwork(高级)

如果您选择使用您的逻辑手动管理 SKAN 转换值,您需要执行以下操作:

  • 转到SingularSDKObject,将manualSKANConversionManagement设为True。
  • 在代码中使用以下方法设置和检索转换值。
SingularSDK.SkanUpdateConversionValue 方法
说明

更新 SKAdNetwork 转换值。

注意: 如果您选择手动更新 SKAdNetwork 转换值,请使用此方法。此方法只有在manualSKANConversionManagement设置为True 时才有效。

签名 public void SkanUpdateConversionValue(int value)
使用示例
// A sign-up event happened


Singular.Event("SignUp");

// Update the conversion value to 7


SingularSDK.SkanUpdateConversionValue(7);
SingularSDK.SkanGetConversionValue 方法
说明 获取 Singular SDK 追踪的当前转换值。
特征 公共 int?SkanGetConversionValue()
使用示例
int? value = SingularSDK.SkanGetConversionValue();
SingularSDK.SetConversionValueUpdatedHandler 方法
方法描述 设置转换值更新时接收通知的处理程序。
签名 public void SetConversionValueUpdatedHandler(SingularConversionValueUpdatedHandler handler)
使用示例
public class Main : MonoBehaviour, SingularConversionValueUpdatedHandler {
  void Awake() {
    SingularSDK.SetConversionValueUpdatedHandler(this);
  }

  void OnConversionValueUpdated(int value) {
    // Use the conversion value


  }
}

2.3.处理 iOS 应用程序跟踪透明度(ATT)同意书

您是否显示了应用程序跟踪透明度(ATT)提示?

从 iOS 14.5 开始,应用程序在访问和共享某些用户数据(包括设备的 IDFA)之前,必须征得用户同意(使用应用程序跟踪透明度框架),这有助于实现跟踪目的。

Singular 和广告网络从 IDFA 中获益匪浅,可以识别设备并执行安装归因(不过也有不使用 IDFA 的方法)。我们强烈建议在 征得用户同意后获取 IDFA。

建议延迟 Singular SDK 初始化,直到用户回复 ATT 提示。

默认情况下,Singular SDK 会在初始化时发送用户会话。当会话从新设备发送时,会立即触发 Singular 的归属过程--该过程仅根据 Singular 当时可用的数据执行。因此,Singular SDK 发送第一个会话之前征求同意和检索 IDFA 至关重要。

提示: 如果您的应用程序显示 "应用程序跟踪透明度(ATT)"提示,建议将超时时间设置为 300 秒。如果不显示 ATT,该选项的默认值应保持为 0(不等待)。

要配置waitForTrackingAuthorizationWithTimeoutInterval,请调整SingularSDKObject 检测窗格中的配置选项。这将设置 Singular SDK 在将事件记录到 Singular 服务器之前等待用户授权/拒绝 AppTrackingTransparency 同意的最长时间(以秒为单位)。

2.4.处理深层链接

深层链接是引导用户访问应用程序中特定内容的 URL。当用户在已安装应用程序的设备上点击深层链接时,应用程序会打开并显示特定产品或体验。

单个跟踪链接可以包含深度链接延迟深度链接。有关详细信息,请参阅我们的深度链接常见问题奇异链接常见问题

注释:

展开以下章节了解平台支持和处理程序代码的详细信息:

在 Android 上支持深度链接

支持安卓系统上的深度链接

  1. 用编辑器打开Project > Assets > Plugins > Android > AndroidManifest.xml文件。
  2. 从默认值更新活动名称属性:
    <activity android:name="com.unity3d.player.UnityPlayerActivity"

    更新为

    <activity android:name="com.singular.unitybridge.SingularUnityActivity"

    重要提示: 如果您实施了自定义活动,请为您实施 onNewIntent 的 SingularUnityBridge 添加导入语句:
    1. 为您要实现onNewIntentSingularUnityBridge添加导入语句。

      import com.singular.unitybridge.SingularUnityBridge;
    2. 在活动中的 onNewIntent 方法中调用SingularUnityBridge.onNewIntent(intent);

      示例
      @Override
      protected void onNewIntent(Intent intent) {
          setIntent(intent);
      
          // Call this method from your custom activity in onNewIntent
      
      
          SingularUnityBridge.onNewIntent(intent);
      }

    警告:如果您为应用程序创建了自定义活动,且该活动没有扩展(继承自)Unity Player 活动,那么您可以考虑在onNewIntent方法中添加防护措施,以处理当前活动对象可能为空的情况。

  3. 在适当的活动中添加一个 Intent Filter,以支持使用所选主机名的 Android 应用链接。hostandroid:host值必须与为跟踪链接配置的 Singular Links 域相匹配。
    <!-- Added Intent Filter for Singular Android Links Deeplinking -->
    <!-- Replace example with your value -->
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="http" />
      <data android:scheme="https" />
      <data android:host="example.sng.link" />
      <data android:pathPrefix="/A"/>
      <data android:pathPrefix="/B"/>
      <data android:pathPrefix="/E"/>
      <data android:pathPrefix="/F"/>
    </intent-filter>
支持 iOS 上的深度链接

支持 iOS 上的深度链接

Singular 使用 iOS通用链接应用程序方案在 iOS 上进行深度链接。请按照以下步骤启用您的应用程序,以便通过 Singular 链接使用 iOS 通用链接和应用程序方案深度链接。

  1. 在 Singular 的 "属性">"管理链接"页面中为链接配置至少一个子域。更多信息,请参阅Singular 链接常见问题解答
  2. 设置通用链接(iOS 中的深度链接):
    • 登录Apple Developer Portal
    • 转到 "标识符",选择要添加通用链接支持的应用程序。

      identifiers.png

    • 在 "能力"菜单中,选中 "关联域"复选框,然后单击 "保存"

      associateddomains.png

  3. 将 "关联域 "权限添加到您的应用程序:
    • 在 XCode 中,转到 "项目设置">"功能">"关联域"。

    • 添加您的 Singular Links 域。

      associateddomains2.png

  4. 苹果开发者门户复制 "应用程序前缀"(又称 "团队 ID")。
  5. 在 Singular 中,转到 "应用程序配置",找到你的应用程序,展开 "iOS 应用程序高级设置",然后在 "团队 ID "字段中粘贴该值。 这将允许 Singular 在你的 Singular 域中托管通用链接的 apple-app-site-association文件。

    mceclip3.png

  6. 注:在通用链接无法进行深度链接的情况下,需要执行此步骤。
    在 "团队 ID "下方,输入 iOS"应用程序方案",以启用传统应用程序方案深度链接作为通用链接深度链接的备用方案。
    mceclip4.png

    如果这是您的应用程序首次支持用于深度链接的 iOS 应用程序方案,请确保应用程序方案在您的 Xcode 项目中注册为 "URL 类型":
    Screenshot of Xcode showing the URL Types section with a URL that reads "com.example.myphotoapp."

    有关 iOS 应用程序支持应用程序方案的更多信息,请参阅Apple 有关此主题的开发人员帮助文章

2.5.初始化 SDK

注意:在实施 Singular SDK 时,切记要遵守业务所在地区颁布的各种隐私法,包括 GDPR、CCPA、COPPA 等。如需了解更多信息,请参阅SDK 选择加入和选择退出实践

每次打开应用程序时都应调用 SDK 初始化代码。它是所有Singular归因功能的前提,并向Singular发送一个新会话,用于计算用户留存。

默认情况下,当通过 Awake 方法创建场景时,SingularSDK.cs会自动初始化 SDK

手动初始化

如果您希望在应用程序运行的稍后阶段手动初始化 SDK,请执行以下操作:

  1. 在 SingularSDK 对象的检查窗格中禁用 "唤醒时初始化"选项。
  2. 使用SingularSDK.InitializeSingularSDK静态方法初始化 SDK:
SingularSDK.InitializeSingularSDK 方法
说明 如果 Singular SDK 在唤醒时尚未初始化,则对其进行初始化。
签名
public void InitializeSingularSDK()
使用示例
// SDK Key and SDK Secret are set on the 


// game object associated with SingularSDK 


SingularSDK.InitializeSingularSDK();

线程安全注意事项: Singular Unity SDK 应始终在同一线程中调用,就像调用其他 Unity 方法一样。

2.6.配置会话超时(可选)

默认情况下,如果应用程序在后台运行 60 秒或更长时间后才返回前台,Singular SDK 就会注册一个新的会话。您可以通过修改 SingularSDKObject 的话超时Sec属性来更改默认超时值。

2.7.向 Singular 发送用户 ID(可选)

你可以使用Singular SDK方法向Singular发送内部用户ID。

注:如果使用Singular 的跨设备解决方案,则必须在所有平台上收集用户 ID。

  • 用户 ID 可以是任何标识符,但不应暴露 PII(个人身份信息)。例如,不应使用用户的电子邮件地址、用户名或电话号码。Singular 建议使用仅对第一方数据唯一的哈希值。
  • 传递给Singular的用户ID值也应该是你在所有平台(Web/移动/PC/控制台/离线)上获取的相同的内部用户ID。
  • Singular 将在用户级导出、ETL 和内部 BI 回传(如果配置)中包含用户 ID。用户 ID 是第一方数据,Singular 不会与其他方共享。
  • 使用 Singular SDK 方法设置时,用户 ID 值会一直存在,直到使用UnsetCustomUserId 方法取消设置或卸载应用程序为止。关闭或重启应用程序不会取消设置用户 ID。

要设置用户 ID,请使用SetCustomUserId 方法。要取消设置(例如,如果用户 "注销 "账户),请致电UnsetCustomUserId

注意:如果多个用户使用一台设备,我们建议实施注销流程,为每次登录和注销设置取消设置用户 ID。

如果在应用程序打开时已经知道用户 ID,请在初始化 Singular SDK 之前调用SetCustomUserId 。这样,Singular 就能从第一次会话中获取用户 ID。不过,在用户注册或登录之前,用户 ID 通常是不可用的。在这种情况下,请在注册流程完成后调用SetCustomUserId

SingularSDK.SetCustomUserId方法
说明 向 Singular 发送用户 ID。
签名 public void SetCustomUserId(string customUserId)
使用示例
SingularSDK.SetCustomUserId("custom_user_id");
SingularSDK.UnsetCustomUserId 方法
说明 取消设置已发送至 Singular 的用户 ID。
签名 public void UnsetCustomUserId()
使用示例
SingularSDK.UnsetCustomUserId();

可选:自定义用户 ID 设备映射

重要:此高级企业功能仅在特殊情况下可用。实施前请咨询 Singular 解决方案工程师。

Singular 可以通过服务器到服务器集成接收额外的移动事件跟踪数据。要使用此功能,必须将用户 ID 映射到 Singular 的移动设备跟踪标识符。

注意:在初始化Singular SDK后或获得用户ID后,请尽快调用此方法。

SingularSDK.SetDeviceCustomUserId方法
说明 设置与登录相同的自定义用户 ID,并将其映射到 Singular 的跟踪标识符。
签名 public void SetDeviceCustomUserId(string customUserId)
使用示例
SingularSDK.SetDeviceCustomUserId('CustomUserId');

3.跟踪事件和收入

3.1.跟踪事件(非收入)

Singular 可以收集有关应用程序内事件的数据,帮助分析营销活动的效果并衡量关键绩效指标。例如,您的企业可能希望收集有关用户登录、注册、教程完成或游戏应用中等级提升的数据。

Singular 支持各种 标准事件。广告网络通常支持这些常用事件,用于报告和优化。另一个优点是,当您使用标准事件名称时,Singular 会自动识别并将其添加到事件列表中,而无需手动定义。我们建议尽可能使用标准事件。

发送到 Singular 的事件列表(附带属性)应由用户体验/营销/业务团队根据企业的营销关键绩效指标编制。业务团队可以参考《如何跟踪应用内事件:单一归因客户指南》

您跟踪的每个事件都可以传递各种属性。请参阅推荐的每个事件的标准属性

使用代码中的 event 或 eventWithArgs 方法向 Singular 发送标准事件。

注:对于标准事件,请使用事件在 Unity SDK 标准事件和属性列表中的 Unity 名称,如 sngLogin。

SingularSDK.Event(Events.sngLogin);

对于自定义事件,即贵组织希望测量的事件,如果不符合 Singular 的任何标准事件,则可使用任何自定义名称(最多 32 个字符)。我们建议使用英文名称,以便与可能从 Singular 接收事件的广告网络合作伙伴兼容,达到优化目的。

SingularSDK.Event 方法
说明 向 Singular 发送用户事件以进行跟踪。
签名
public static void Event(string name)
public static void Event(string name, params object[] args)
public static void Event(Dictionary<string, object> args, string name)

注意:当传递字典时,字典值必须是以下类型之一:字符串、int、long、float、double、null、ArrayList、Dictionary<string, object>。

使用示例

// 1) Send the standard event Login


SingularSDK.Event(Events.sngLogin);
// 2) An example custom event passing two key value pairs


SingularSDK.Event("myEventName", "Key1", "Value1", "Key2", 1234);
// 3) An example JSON Event passing a dictionary


// Create a dictionary for attributes


Dictionary<string, object> attributes = new Dictionary<string, object>();

// Add attributes


attributes["key1"] = "value1";
attributes["key2"] = "value2";
attributes["key3"] = "value3";
// Add more attributes as needed



SingularSDK.Event(attributes, "myEventName");

3.2.跟踪收入

Singular可以收集通过应用程序获得的收入数据,以帮助分析营销活动的绩效和投资回报率。Singular会在报告、日志导出和回传中提供这些数据。

注意事项 以不同货币报告的任何收入都将自动转换为您的 Singular 账户中设置的组织首选货币。

您可以使用Unity 内置的 IAP(应用内购买)对象跟踪收入事件。通过这种方式,Singular 可以获得有关购买的所有可用信息,从而提供更丰富的报告。Singular 还会获得购买收据,Singular 会在后端使用该收据验证购买行为并排除归因欺诈。

SingularSDK.InAppPurchase 方法
说明 向 Singular 发送 IAP 产品以跟踪购买事件。
签名
public static void InAppPurchase(Product product, Dictionary<string, object> attributes, bool isRestored = false)
public static void InAppPurchase(string eventName, Product product, Dictionary<string, object> attributes, bool isRestored = false)
public static void InAppPurchase(IEnumerable<Product> products,
Dictionary<string, object> attributes, bool isRestored = false)
public static void InAppPurchase(string eventName,IEnumerable<Product> products, Dictionary<string, object> attributes, bool isRestored = false)

备注:

  • product是指从 IAP 收到的产品对象:UnityEngine.Purchasing.Product
  • 属性: 使用此参数可向 Singular 传递附加信息。如果没有要传递的属性,则传递空值即可。
  • isRestored: 说明交易是否已还原。默认值:false。
使用示例
// IAP with a single product and no extra attributes


SingularSDK.InAppPurchase(myProduct, null);
// IAP with a single product and attributes


var attr = new Dictionary<string, object>() {
["my_first_attribute"] = "value1",
["my_second_attribute"] = "value2"};
 
SingularSDK.InAppPurchase(myProduct, attr);
// IAP with with a single product, 


// no extra attributes and a custom event name



SingularSDK.InAppPurchase("MyCustomProduct",
myProduct, null);
// IAP with list of products, no extra attributes


SingularSDK.InAppPurchase(myProductList, null);
// IAP with with list of products, no extra attributes


// and a custom event name



SingularSDK.InAppPurchase("MyCustomProducts",
myProductList, null);
跟踪收入的另一种方法:收入和自定义收入方法

如果无法使用 Unity IAP,Singular SDK 提供了两种 "手动 "向 Singular 传递购买信息的方法:

  • 使用Revenue将购买信息传递给 Singular,详细说明交易货币、金额和其他可选细节。
  • 自定义收入(CustomRevenue)与之类似,但允许你为事件自定义名称。

注意:如果使用 Revenue/CustomRevenue 代替 InAppPurchase,Singular 将无法验证购买收据。

SingularSDK.Revenue方法
说明 向 Singular 发送收入事件。
签名
public static void Revenue(string currency, double amount)
public static void Revenue(string currency, double amount, string productSKU, string productName, string productCategory, int productQuantity, double productPrice)
public static void Revenue(string currency, double amount, Dictionary<string, object> attributes)
注意:以三字母 ISO 4217 货币代码形式传递货币,如 "USD"、"EUR"、"INR"。
使用示例
// Send a revenue event with no product details


SingularSDK.Revenue("USD", 1.99);
// Send a revenue event with product details


SingularSDK.Revenue("USD", 4.99, "coin_package_abc123", "Coin Pack 5", "Bundles", 1, 4.99);
// Send a revenue event with JSON Dictionary for attributes


Dictionary<string, object> attributes = new Dictionary<string, object>();

// Add attributes


attributes["productSKU"] = "coin_package_abc123";
attributes["productName"] = "Coin Pack 5";
attributes["productCategory"] = "Bundles";
attributes["productQuantity"] = 2;
attributes["productPrice"] = 4.99;

SingularSDK.Revenue("USD", 9.98, attributes);
SingularSDK.CustomRevenue 方法
说明 向 Singular 发送带有自定义名称的收入事件。
签名
public static void CustomRevenue(string eventName, string currency, double amount)
public static void CustomRevenue(string eventName, string currency, double amount, string productSKU, string productName, string productCategory, int productQuantity, double productPrice)
public static void CustomRevenue(string eventName, string currency, double amount, Dictionary<string, object> attributes)
注意:以三个字母的 ISO 4217 货币代码形式传递货币,如 "USD"、"EUR"、"INR"。
使用示例
// Send a revenue event with a custom name


SingularSDK.CustomRevenue("MyCustomRevenue", "USD", 9.99);
// Send a revenue event with a custom name + product details


SingularSDK.CustomRevenue("MyCustomRevenue", "USD", 50.50, "abc123", "myProductName", "myProductCategory", 2, 25.50);
// Send a revenue event with a custom name + JSON Dictionary for attributes


// Create a dictionary for attributes


Dictionary<string, object> attributes = new Dictionary<string, object>();

// Add attributes


attributes["productSKU"] = "coin_package_abc123";
attributes["productName"] = "Coin Pack 5";
attributes["productCategory"] = "Bundles";
attributes["productQuantity"] = 2;
attributes["productPrice"] = 4.99;
// Add more attributes as needed



SingularSDK.CustomRevenue("MyCustomRevenue", "USD", 9.98, attributes);

3.3.混合事件跟踪(高级)

Singular 建议通过集成到应用程序中的 Singular SDK 发送所有事件和收入。但是,Singular 也可以从其他来源收集事件和收入。

任何未从 Singular SDK 发送的事件都必须符合 Singular 的服务器到服务器事件文档要求,并提供匹配的设备标识符,以便正确归属事件。

重要:

如果服务器到服务器事件请求中使用的设备标识符在 Singular 中没有匹配的设备标识符,就会出现差异。请注意以下可能性:

  • 如果"在 "Singular SDK 从应用程序会话中记录设备标识符之前收到了事件请求,那么该事件请求将被视为未知设备的 "第一次会话",Singular 将把该设备作为有机归属
  • 如果 Singular SDK 确实记录了设备标识符,但 Singular SDK 标识符与服务器到服务器事件请求中指定的设备标识符不同,那么事件将被错误归属

混合事件跟踪指南

从内部服务器发送事件

Singular可以收集来自服务器的收入数据,帮助分析营销活动的表现和投资回报率。

要求:

  • 从应用内注册或登录事件中捕获并传递设备标识符,并将此数据与服务器上的用户 ID 一起存储。由于用户的设备标识符可能会发生变化,因此请确保在用户生成应用程序会话时更新标识符。这将确保服务器端事件归属于正确的设备。
  • 服务器端事件是特定于平台的,只能使用与设备平台相匹配的设备标识符发送(如 iOS 设备的 IDFA 或 IDFV)。
  • 您可以使用 Singular 内部 BI 回传机制将事件实时推送到内部端点,以便更新服务器端的数据集。请参阅内部 BI 回传常见问题
  • 查看服务器到服务器集成指南中的"跟踪收入 "部分,了解详情。
从收入提供商发送事件
RevenueCatadapty等第三方提供商可以向Singular提供购买和订阅收入

请点击以下链接了解如何启用这些合作伙伴。

从分段发送事件

要使 Segment 能与 Singular SDK 并行发送事件到 Singular,必须在 Segment 中添加一个"云模式 "目的地。请点击此处查看我们的指南。

4.高级选项

4.1.创建短推荐人链接

注:此功能在 SDK 4.0.16+ 版本中可用。

使用短链接可将冗长、充满参数的奇异链接转换为更短、更安全的链接,方便分享。

通常情况下,您需要动态创建短链接,以便应用程序的用户可以与朋友分享,邀请他们使用应用程序。

要创建短链接,您需要

  • 指向应用下载的奇异链接(请参阅奇异链接常见问题)。
  • 您可以为链接动态添加任何参数(选项列表请参阅跟踪链接参数)。
  • 如果要跟踪新应用的安装情况,返回到共享链接的用户,则必须提供推荐用户的推荐人名称和推荐人 ID。

使用createReferrerShortLink方法创建短链接,如下例所示。

void callback(string shortLinkURL, string error){
    // Add your share logic here if shortLinkURL is not null


    // If there was an error, add logic to retry/abort/modify the params


    // passed to the function, based on the cause of the error


}

SingularSDK.createReferrerShortLink(
    "https://sample.sng.link/B4tbm/v8fp?_dl=https%3A%2F%2Fabc.com",
    "John Doe", // Referrer Name


    "342", // Referrer ID


    new Dictionary<string, string>() { 
        // a Dictionary object containing any parameters you want to add


        {"channel", "sms"}
    },
    callback 
);

4.2.添加广告收入归属支持

Singular与谷歌AdMob、AppLovin、Unity LevelPlay(IronSource)和TradPlus等中介平台集成,用于广告收入归属。通过我们的通用广告收入 SDK 集成,Singular 还支持其他中介平台。

通过在 Singular SDK 集成中添加代码片段,您可以从中介平台获取广告收入归因数据。这也允许您获取 SKAdNetwork 活动的广告收入数据。

从您的调解平台获取用户级广告收入后,Singular 就能将归属广告收入发送回媒体源,这些媒体源可以接受这些数据来运行 AdROAS 广告系列。

请参阅 SDK 实施说明和代码片段[此处]。

4.3.跟踪卸载

注:卸载跟踪仅适用于企业客户。

安卓卸载跟踪

要启用安卓应用程序的卸载跟踪功能,请首先在 Singular 平台上配置应用程序,详情请参阅《 设置卸载跟踪》。然后,按照以下说明操作。

注意: 谷歌于 2018 年 4 月废弃了 GCM API。请使用 FCM 进行卸载跟踪。

使用 Firebase Cloud Messaging (FCM) 启用卸载跟踪:

1.与 FCM 集成:

要跟踪卸载,您可以使用 Firebase Cloud Messaging (FCM) 平台的服务。如果您尚未使用 FCM,请按照 Google 的说明 在 Android 上设置 Firebase Cloud Messaging 客户端应用程序

FCM 要求(源代码)

FCM 客户端需要安装了 Google Play Store 应用程序的 Android 4.1 或更高版本设备,或运行 Android 4.1 并带有 Google API 的模拟器。请注意,您并不局限于通过 Google Play Store 部署您的 Android 应用程序。

不在支持版本的安卓系统上运行的用户/设备将无法进行Singular卸载跟踪。

2.更新 AndroidManifest.xml 文件:

更新 AndroidManifest.xml 文件,为应用程序添加必要的意图过滤器(用实现 Firebase 服务的类替换 MyFirebaseMessagingService):

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

3.注册并发送 FCM 设备令牌:

获取 FCM 令牌后,将其作为参数传递给 "RegisterTokenForUninstall "方法:

SingularSDK.RegisterTokenForUninstall(String fcmDeviceToken);

RegisterTokenForUninstall "方法应在 "SingularSDK.InitializeSingularSDK() "方法之前调用

iOS 卸载跟踪

iOS 上的卸载跟踪基于苹果的推送通知技术。如果您的应用程序不支持推送通知,请参阅 Apple 指南。如果您的应用程序已经支持推送通知,则必须在 SDK 初始化后使用 RegisterTokenForUninstall 方法传递从 APNS 返回的设备令牌。

SingularSDK.RegisterTokenForUninstall 方法
说明 传递从 APNS 返回的设备令牌。APNS 令牌通常是本地形式的二进制数据,但必须以字符串形式传递。
签名
public static void RegisterTokenForUninstall
(string APNSToken)
使用示例
// pass the APNS token as a hex-string 


  SingularSDK.RegisterTokenForUninstall("ba85ab31a7c7
f5c2f012587f29fb0e596d4b67e7b7b2838fa1a8582c1f7dbdee");

4.4.添加全局属性

对于应用程序发送的每个会话和事件,Singular SDK 都允许你定义自定义的附加属性发送给 Singular 服务器。 这些属性可以代表有关用户、应用程序模式、状态或其他任何信息。一旦设置了这些属性,它们就可以作为报告中的维度,您可以用它们来细分数据。

例如,如果您有一个游戏应用程序,您可以定义一个名为 "级别 "的属性,并将其初始设置为 "0"。应用程序发送的任何会话和事件都将带有 "Level":"0".一旦用户等级提升,您就可以将该属性重置为 "1",以此类推。然后,您就可以获得按用户等级分列的报告,包括会话、事件计数和收入数据。

  • 最多可以定义5 个全局属性
  • 它们会在应用程序运行期间持续存在(使用您给定的最新值),直到您取消设置或用户卸载应用程序。
  • 每个属性的名称和值最长可包含200 个字符。如果您传递的属性名称或值较长,将被截断为 200 个字符。
  • 全局属性可在用户级导出回传中访问和使用。将来还会增加汇总报告支持。如果有任何问题或对全局属性支持的更新感兴趣,请联系 Singular 客户成功经理!

在初始化前设置全局属性

在初始化SDK之前,你可以使用SetGlobalProperty 方法通过SingularSDK设置全局属性。如果希望会话中包含全局属性,请关闭 "唤醒时初始化 "标记

由于全局属性及其值会在应用程序运行期间持续存在,因此您要设置的属性可能已经被设置为不同的值。使用overrideExisting参数可告诉 SDK 是否用新值覆盖现有属性。

初始化后设置全局属性

在应用程序运行期间,您可以随时使用以下方法设置、取消设置和检索全局属性。

SingularSDK.SetGlobalProperty 方法
说明

将全局属性设置为给定值。

注意

  • 如果该属性尚未存在,且已有 5 个其他全局属性,则不会添加该属性。
  • 如果属性已被设置,overrideExisting参数将决定是否覆盖现有值。
  • 如果属性设置成功,该方法返回true,否则返回false
签名 public static bool SetGlobalProperty(string key, string value, bool overrideExisting)
使用示例
bool result = SingularSDK.SetGlobalProperty("key", "value", false);
SingularSDK.GetGlobalProperties(获取全局属性)方法
说明 以 Map 形式读取所有全局属性及其当前值。
特征 public static Dictionary<string, string> GetGlobalProperties()
使用示例
Dictionary<string, string> props = SingularSDK.GetGlobalProperties();
SingularSDK.UnsetGlobalProperty 方法
说明 移除全局属性。
签名 public static void UnsetGlobalProperty(string key)
使用示例
SingularSDK.UnsetGlobalProperty(“test_key”);
SingularSDK.ClearGlobalProperties(清除全局属性)方法
说明 删除所有全局属性。
签名 public static void ClearGlobalProperties()
使用示例
SingularSDK.clearGlobalProperties();

4.5.在旧版安卓设备上收集安装推荐人

安卓系统中,安装推荐人是 Singular 用于确定归因并帮助 Singular 检测和分析欺诈企图的最准确工具。它是 Google Play 商店提供的标识符,指向用户在安装应用程序之前点击的广告。

在使用最新 Google Play 商店版本的设备上,Singular SDK 会自动收集安装推荐人值(因为 Singular 已集成了最新的Google Play 推荐人 API)。

要在旧版本设备上收集安装推荐人,请按照Android SDK 指南中的说明进行操作。

5.遵守数据隐私法

5.1.限制数据共享

Singular提供隐私保护功能,帮助您与任何可能遵守消费者隐私法(如GDPR和CCPA(加州消费者隐私法))的合作伙伴合作。这些合作伙伴希望在最终用户同意共享其私人信息时得到通知。

限制数据共享

如果你已经实施了一种征求用户同意共享其信息的方法,请使用limitDataSharing方法通知 Singular 用户的选择:

  • 使用limitDataSharing:NO表示用户同意(选择加入)共享其信息。
  • 如果用户不同意,则使用limitDataSharing:YES

Singular在"用户隐私回传"中使用限制数据分享,并将此信息传递给需要遵守相关规定的合作伙伴。更多信息请参阅"用户隐私和限制数据共享"。

注意:该方法的使用是可选的,但合作伙伴只有在明确通知用户已选择的情况下,才能与Singular共享属性信息。

SingularSDK.LimitDataSharing方法
签名 SingularSDK.LimitDataSharing(boolshouldLimitDataSharing)
说明 通知 Singular 用户同意(opt-in)共享私人数据。限制数据共享方法为您提供了一个选项,以控制您的应用程序是否将用户数据发送给第三方。如果您想根据用户偏好或隐私要求限制数据共享,这将非常有用。
使用示例
// User has opted in to sharing data


SingularSDK.LimitDataSharing(false);

5.2.遵守 GDPR 的其他方法

Singular SDK 提供了几种方法来帮助你遵守 GDPR 政策,并让 Singular 了解用户是否同意追踪。

SingularSDK.TrackingOptIn方法
说明 通知 Singular 用户同意(选入)跟踪。TrackingOptIn()方法用于向Singular服务器发送 "gdpr "事件。如果您不调用此方法,应用程序将继续跟踪用户,就像用户已经同意一样,但不会特别将其标记为 GDPR 选择加入。如果您的应用程序需要遵守 GDPR(《通用数据保护条例》),则应调用此功能,以确保正确记录用户同意。
使用示例
SingularSDK.TrackingOptIn();
SingularSDK.StopAllTracking方法
说明 停止此用户在此应用程序上的所有跟踪活动。
注意: 此方法将有效禁用 SDK,即使应用程序重新启动后也是如此(状态是持久的)!重新启用跟踪的唯一方法是调用 resumeAllTracking()。
使用示例
SingularSDK.StopAllTracking();
SingularSDK.ResumeAllTracking 方法
说明 在此应用程序上恢复对该用户的跟踪。
使用示例
SingularSDK.ResumeAllTracking();
SingularSDK.IsAllTrackingStopped方法
说明 检查此应用程序中该用户的跟踪状态。如果使用 StopAllTracking() 停止了跟踪且未恢复,则返回 true。
使用示例
SingularSDK.IsAllTrackingStopped();