Unity SDK - 设置用户 ID 和哈希 User Details

设置用户 ID 和哈希 User Details

向 Singular 发送内部用户 ID,以实现跨设备跟踪和用户级数据报告。

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

用户ID要求

隐私和最佳实践

在实施用户 ID 跟踪时,请遵循以下准则,以确保隐私合规和正确的跨设备测量。

  • 无 PII:用户 ID 不应暴露个人身份信息 (PII),如电子邮件地址、用户名或电话号码。使用与第一方数据独一无二的哈希值。
  • 跨平台一致性:用户 ID 值必须是您在所有平台(网络/移动/PC/控制台/离线)上获取的相同内部标识符,以便进行准确的跨设备测量。
  • 第一方数据:Singular会在用户级导出、ETL和内部商业智能回传(如有配置)中包含用户ID。用户 ID 是第一方数据,不会与第三方共享。
  • 持久性:用户 ID 会一直存在,直到使用UnsetCustomUserId() 明确取消设置或卸载应用程序。关闭或重启应用程序不会清除用户 ID。

实施概述

何时设置用户 ID

使用SetCustomUserId() 设置用户标识符,使用UnsetCustomUserId() 注销时清除用户标识符。

最佳实践:如果多个用户共用一台设备,请执行注销流程,登录时调用SetCustomUserId() ,注销时调用UnsetCustomUserId()

如果在应用程序打开时已经知道用户 ID,请在初始化 Singular SDK 之前调用SetCustomUserId() 。不过,在用户注册或登录之前,用户 ID 通常是不可用的,在这种情况下,应在注册或验证流程完成后调用SetCustomUserId()


SDK 方法

设置自定义用户 ID

向 Singular 发送内部用户 ID,用于跨设备跟踪和用户级报告。

C#
// Set the user ID after login or registration
SingularSDK.SetCustomUserId("custom_user_id");

方法签名

public static void SetCustomUserId(string customUserId)

取消设置自定义用户 ID

在用户注销时清除用户 ID,以确保多用户设备的准确会话跟踪。

C#
// Unset the user ID on logout
SingularSDK.UnsetCustomUserId();

方法签名

public static void UnsetCustomUserId()

哈希 User Details(邮箱和电话号码)

上述用户 ID 是您自己的不透明标识符。如果您还想将用户的邮箱地址或电话号码发送到 Singular,请使用独立的 SingularUserDetails API。SDK 会在设备上对这些值进行规范化并使用 SHA-256 哈希,因此原始的邮箱地址和电话号码不会被传输。

适用版本: Unity SDK 5.10.0 及以上版本。这两个方法在 Unity 编辑器中不执行任何操作,请在设备或模拟器上验证。

选择哈希模式

提供 User Details 有两种方式。请为每位用户选择一种并保持一致。

  • SDK 哈希(推荐): 传入明文邮箱地址或电话号码。SDK 会对值进行规范化并哈希,生成 Singular 可用于匹配的所有变体。
  • 预哈希: 传入您已自行规范化并使用 SHA-256 哈希的值。SDK 会原样存储,不做任何额外处理。当您的应用不能持有明文值时使用此方式。

重要: 如果您同时设置了明文值及其对应的预哈希变体,预哈希值优先。

SingularUserDetails Setter

每个 setter 都会返回同一个 SingularUserDetails 实例,因此可以链式调用。传入 null、空字符串或空白字符会移除该值,而不是存储它。

Setter 详细信息
SetEmail 模式: SDK 哈希
明文邮箱地址。SDK 会在哈希前去除空格并转换为小写。对于 gmail.comgooglemail.com 地址,它还会生成第二个变体,即从本地部分移除 +tag 后缀和所有点号。
示例: user@example.com
SetPhoneNumber 模式: SDK 哈希
明文电话号码。SDK 会生成两个变体:一个是保留开头 + 并去除其他所有非数字字符的 E.164 格式,另一个是同时去除 + 的纯数字格式。请包含国家代码,以便 E.164 变体可用。
示例: +15551234567
SetEmailSTD 模式: 预哈希
去除空格并转换为小写后的邮箱地址的 SHA-256 哈希值。
SetEmailNoDots 模式: 预哈希
去除空格、转换为小写,并从本地部分移除 +tag 后缀和所有点号后的邮箱地址的 SHA-256 哈希值。适用于 Gmail 类型的地址。
SetPhoneE164 模式: 预哈希
保留开头 + 的 E.164 格式电话号码的 SHA-256 哈希值。
SetPhoneDigits 模式: 预哈希
去除所有非数字字符(包括开头的 +)后的电话号码的 SHA-256 哈希值。

每个 setter 都有对应的 getter —— GetEmailGetPhoneNumberGetEmailSTDGetEmailNoDotsGetPhoneE164GetPhoneDigits —— 以及用于判断是否设置了任何值的 IsEmpty


在初始化前设置 User Details

Unity 没有单独的配置期 User Details API。在 SDK 初始化之前调用 SetUserDetails,这些值会被保留并随第一个会话一起发送,因此从第一个请求开始就会附带这些值。

C#
// Called before the Singular SDK initializes
SingularUserDetails userDetails = new SingularUserDetails()
    .SetEmail("user@example.com")
    .SetPhoneNumber("+15551234567");

SingularSDK.SetUserDetails(userDetails);

在初始化后设置 User Details

如果只有在登录或注册后才能获取邮箱地址或电话号码,请在那时调用 SetUserDetails。此后,这些值会附加到 SDK 发送的每个会话和事件中。

C#
// Cleartext values, hashed by the SDK
SingularUserDetails userDetails = new SingularUserDetails()
    .SetEmail("user@example.com")
    .SetPhoneNumber("+15551234567");

SingularSDK.SetUserDetails(userDetails);

// Or supply your own SHA-256 hashes
SingularUserDetails hashed = new SingularUserDetails()
    .SetEmailSTD("b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475514")
    .SetPhoneE164("8a59780bb8cd2ba022bfa5ba2ea3b6e07af17a7d8b30c1f9b3390e36f69019e4");

SingularSDK.SetUserDetails(hashed);

方法签名:

public static void SetUserDetails(SingularUserDetails details)

清除 User Details

存储的 User Details 会在应用多次启动之间保留在设备上,并在卸载应用时一并删除。请在登出时,或用户撤回同意时调用 ClearUserDetails 将其移除。

C#
// Remove stored user details on logout
SingularSDK.ClearUserDetails();

方法签名:

public static void ClearUserDetails()

注意: 在后续启动中调用 SetUserDetails 不会清除之前存储的内容。传入 SetUserDetails(null),或未设置任何值的 SingularUserDetails,同样会清除已存储的数据,而不是保持原样。


验证与隐私行为

  • 验证发生的位置: Unity 层会原样存储您传入的值并转发给原生 SDK,由原生 SDK 进行验证。被拒绝的值由原生 SDK 记录到日志中,不会发送。
  • 邮箱验证: 明文邮箱地址必须恰好包含一个 @,且其后有一个点号。无效值会被拒绝并记录到日志中,不会发送。
  • 电话号码验证: 明文电话号码必须至少包含 6 位数字。更短的值会被拒绝并记录到日志中。
  • 模式误用防护: 看起来已经过哈希的值会被 SetEmailSetPhoneNumber 拒绝。同样,预哈希 setter 会拒绝任何非 64 位 SHA-256 十六进制字符串的值。
  • Limit Data Sharing: 在启用 Limit Data Sharing 期间,User Details 载荷会从所有请求中排除。请参阅数据隐私.
  • 同意: 仅在具备合法依据时才收集和发送邮箱地址与电话号码。哈希并不能免除您在 GDPR、CCPA 或同等法规下的义务。