Skip to main content

TTD (The Trade Desk):UID2 使用指南

概述#

本文主要介绍 UID2 的相关概念、如何使用,以及在 TradPlus 的产品使用和集成过程中,开发者如何正确设置 UID2 。

特别声明:为便利开发者下载使用TTD SDK,TradPlus仅提供下载指引,不代表TradPlus 对TTD SDK数据收集处理活动承担任何责任,开发者应自行选择是否下载使用TTD SDK, 若开发者选择使用TTD SDK, 应与TTD共同严格按照适用的数据保护法规定,履行获得最终用户同意、数据跨境传输报备认证等义务。

什么是 UID2#

Unified ID 2.0 利用加密的电子邮件和电话号码数据,为整个数字广告生态系统提供注重隐私、安全和准确的身份标准。(UID2 官网 原文:Unified ID 2.0 leverages encrypted email and phone number data to provide a privacy-conscious, secure, and accurate identity standard for the entire digital advertising ecosystem。)

UID2.0 和 Cookie、IDFA、GAID 同样为匿名 ID,用以识别用户、维持程序化广告的正常运作。但 UID2 具体跨平台追踪属性,当用户以电子邮件或手机登入并授权追踪后,TTD 平台将基于此生成一个加密(无法逆向破解)的「匿名通用 ID 」。只要用户以同一个电子邮件或手机号浏览其他网页或 App ,所有支持 UID 2.0 的网站、APP 和平台都可以预设追踪该用户的 ID。

TTD 致力推动 UID 2.0 成为业界的新标准,作为 Cookie 替代解方案,以在未来持续地追踪与识别用户。(来源:https://iabtechlab.com/blog/the-impact-of-the-trade-desk-contributing-uid-2-0-for-industry-development/)

图片来源:the Trade Desk

UID2 的优势、特别之处#

  • 安全且注重隐私:数据资料(email 和手机号)经过哈希 (hash),加盐(salt)和加密(encrypt)处理以增加额外保护,并杜绝非法滥用。
  • 广泛适用性:因为 UID2 已被许多领先的广告技术提供商和平台采用,参与者可以轻松地与其选择的合作伙伴一起使用最适合的身分识别策略。
  • 更好的广告体验:UID2 与其他具确定性及可识别个人身分讯息的标识符号整合,在用户通过各端(网站/应用/CTV 应用)登录入时发挥其功能,广告投放更有效,且提供更精准的广告追踪。

开发者如何使用 UID2#

下图展示了开发者如何通过 SSP 将 UID2 加入到竞价请求中的流程(原文:UID2 Overview :https://unifiedid.com/docs/intro )

图片来源:UID2 官网

UID2 使用流程简述:

  1. 用户访问 网站 / 应用 / CTV 应用
  2. 开发者获取用户 email 或手机号
  3. 开发者向 UID2 服务传输用户 email 或手机号
  4. UID2 服务响应 UID2 的 token(即为 UID2 值)
  5. 开发者存储 UID2
  6. 开发者 UID2 发送到 SSP;SSP 储存 UID2,以便用于竞价请求
  7. SSP 将带有 UID2 的请求发送至竞价服务端

UID2 Token 的申请#

在 UID2 官网点击 “Request access” 提交信息申请,地址 https://unifiedid.com/request-access 。 如果您需要帮助,可以联系您专属的 TradPlus 客户经理。

快捷接入#

请按照 TradPlus SDK 对接文档 进行广告源集成,同时使用以下流程快捷接入并使用。

特别声明:为便利开发者下载使用TTD SDK,TradPlus仅提供下载指引,不代表TradPlus 对TTD SDK数据收集处理活动承担任何责任,开发者应自行选择是否下载使用TTD SDK, 若开发者选择使用TTD SDK, 应与TTD共同严格按照适用的数据保护法规定,履行获得最终用户同意、数据跨境传输报备认证等义务。

Android#

最低目标 Android 版本:4.4+ / API 19+ (SDK) 5.0+ / API 21+ (Dev-App)

TradPlus版本:V12.3.0.1+

1.Gradle引入#

通过下载地址 获取 uid2_adapter aar 并添加到项目中

implementation 'com.uid2:uid2-android-sdk:1.4.0'
implementation files("libs/uid2_adapter_v1.0.0.aar")
混淆配置#
-keep class com.data.uid2.adapter.** {*;}
-keep interface com.data.uid2.adapter.TTDUID2Manager$ResultCallback{*;}
2.调用及参数说明:#
  • 初始化TP SDK前调用
  • phone ,phoneHash ,email ,emailHash 可根据需求至少设置一个
  • 格式要求:
    • 邮件:如果有大写字符,则将其转换为小写;地址中有句点,请将其删除
    • 手机号码:最多可有 15 位数字; 格式:[+][国家代码] [用户号码(包括区号)]
    • 具体格式要求请参考文档 https://unifiedid.com/docs/getting-started/gs-normalization-encoding
    • 格式不符合要求,UID2内部会Crash,开发者必须传入符合要求的参数
  • 多个设置时按 phone > phoneHash > email > emailHash 优先级获取其一
  • subscriptionIdpublicKey为必传字段,UID2账户后台获取
  • ttd_server_url可选,用于修改UID2服务器地址
  • 测试:
3.代码示例#
Map<String, String> mLocalExtras = new HashMap<>();
// Only for test
String ttdEmail = "janesaoirse@gmail.com";
String ttdEmailHash = "ku4mBX7Z3qJTXWyLFB1INzkyR2WZGW4ANSJUiW21iI8=";
String ttdPhone = "+12345678901";
String ttdPhoneHash = "10e6f0b47054a83359477dcb35231db6de5c69fb1816e1a6b98e192de9e5b9ee"
mLocalExtras.put("ttd_email", ttdEmail);
mLocalExtras.put("ttd_email_hash", ttdEmailHash);
mLocalExtras.put("ttd_phone", ttdPhone);
mLocalExtras.put("ttd_phone_hash", ttdPhoneHash);
//mLocalExtras.put("ttd_server_url", "修改UID2服务器地址");
// Only for test
mLocalExtras.put("ttd_test", "true");
String subscriptionId = "toPh8vgJgt";
String publicKey = "UID2-X-I-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKAbPfOz7u25g1fL6riU7p2eeqhjmpALPeYoyjvZmZ1xM2NM8UeOmDZmCIBnKyRZ97pz5bMCjrs38WM22O7LJuw==";
TTDUID2Manager.getInstance().startUID2(this,
subscriptionId,
publicKey,
mLocalExtras,
new TTDUID2Manager.ResultCallback() {
@Override
public void result(String result) {
}
});

iOS#

1.接入要求及方法#

系统要求: iOS版本 13.0+,Swift版本 5.0+

TradPlus版本:12.0.0+

通过下载地址 获取 TTDUID2Adatper.framwork 并添加到项目中。

通过pod集成 UID2SDK

pod 'UID2','1.2.4'
2.调用及参数说明#
  • 调用建议在初始化TradPlusSDK之前
  • phone ,phoneHash ,email ,emailHash 可根据需求至少设置一个
  • 传入的信息是有格式要求的,随意传入可能会造成无法正常使用。请参考UID2官方文档说明:https://unifiedid.com/docs/getting-started/gs-normalization-encoding
  • 设置多个参数时,按 phone > phoneHash > email > emailHash 优先级获取使用。
  • subscriptionIDserverPublicKey为必传字段。
  • appName为可选字段,默认会获取当前app包名
  • customURLString 可选,用于修改UID2服务器地址。
  • isTestMode 设置为 true 是将启动测试环境 。
  • 开启测试环境时,默认customURLString为:https://operator-integ.uidapi.com
3.代码示例#
//OC
#import <TTDUID2Adatper/TTDUID2Adatper.h>
[TTDUID2ManagerAdatper sharedInstance].email = @"abc@abc.com";
//[TTDUID2ManagerAdatper sharedInstance].emailHash = @"";
//[TTDUID2ManagerAdatper sharedInstance].phone = @"";
//[TTDUID2ManagerAdatper sharedInstance].phoneHash = @"";
[TTDUID2ManagerAdatper sharedInstance].subscriptionID = @"toPh8vgJgt";
[TTDUID2ManagerAdatper sharedInstance].serverPublicKey = @"UID2-X-I-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKAbPfOz7u25g1fL6riU7p2eeqhjmpALPeYoyjvZmZ1xM2NM8UeOmDZmCIBnKyRZ97pz5bMCjrs38WM22O7LJuw==";
//[TTDUID2ManagerAdatper sharedInstance].appName="";
//[TTDUID2ManagerAdatper sharedInstance].isTestMode = YES;
//[TTDUID2ManagerAdatper sharedInstance].customURLString = @"";
[[TTDUID2ManagerAdatper sharedInstance] startWithCallback:^(NSError * _Nonnull error) {
MSLogInfo(@"error %@",error);
}];
//Swift
import TTDUID2Adatper
TTDUID2ManagerAdatper.sharedInstance().email = "abc@abc.com";
//TTDUID2ManagerAdatper.sharedInstance().emailHash = "";
//TTDUID2ManagerAdatper.sharedInstance().phone = "";
//TTDUID2ManagerAdatper.sharedInstance().phoneHash = "";
TTDUID2ManagerAdatper.sharedInstance().subscriptionID = "toPh8vgJgt";
TTDUID2ManagerAdatper.sharedInstance().serverPublicKey = "UID2-X-I-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKAbPfOz7u25g1fL6riU7p2eeqhjmpALPeYoyjvZmZ1xM2NM8UeOmDZmCIBnKyRZ97pz5bMCjrs38WM22O7LJuw==";
//TTDUID2ManagerAdatper.sharedInstance().appName="";
//TTDUID2ManagerAdatper.sharedInstance().isTestMode = true;
//TTDUID2ManagerAdatper.sharedInstance().customURLString = "";
TTDUID2ManagerAdatper.sharedInstance().start { error in
if(error == nil)
{
print(TTDUID2ManagerAdatper.sharedInstance().getToken());
}
};

Unity#

1.接入要求及方法#

TradPlus Unity Plugin版本要求:1.2.3+

  • Android

Gradle引入

通过下载地址 获取 uid2_adapter aar 并添加到项目中

implementation 'com.uid2:uid2-android-sdk:1.4.0'
implementation files("libs/uid2_adapter_v1.0.0.aar")

混淆配置

-keep class com.data.uid2.adapter.** {*;}
-keep interface com.data.uid2.adapter.TTDUID2Manager$ResultCallback{*;}
  • iOS

通过下载地址 获取 TTDUID2Adatper.framwork 并添加到Unity项目的Assets目录下

通过pod集成 UID2SDK

pod 'UID2','1.2.4'
2.调用及参数说明#
  • 调用建议在初始化TradPlusSDK之前
  • phone ,phoneHash ,email ,emailHash 可根据需求至少设置一个
  • 传入的信息是有格式要求的,随意传入可能会造成无法正常使用。请参考UID2官方文档说明:https://unifiedid.com/docs/getting-started/gs-normalization-encoding
  • 设置多个参数时,按 phone > phoneHash > email > emailHash 优先级获取使用。
  • subscriptionIDserverPublicKey为必传字段。
  • appName为可选字段,默认会获取当前app包名(仅iOS支持)。
  • customURLString 可选,用于修改UID2服务器地址。
  • isTestMode 设置为 true 是将启动测试环境 。
  • 开启测试环境时,默认customURLString为:https://operator-integ.uidapi.com
3.代码事例#
TTDUID2Extra extra = new TTDUID2Extra();
extra.email = "abc@abc.com";
//extra.emailHash = "";
//extra.phone = "";
//extra.emailHash = "";
extra.subscriptionID = "toPh8vgJgt";
extra.serverPublicKey = "UID2-X-I-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKAbPfOz7u25g1fL6riU7p2eeqhjmpALPeYoyjvZmZ1xM2NM8UeOmDZmCIBnKyRZ97pz5bMCjrs38WM22O7LJuw==";
//extra.appName = "";
//extra.isTestMode = true;
//extra.customURLString = "";
TradplusAds.Instance().startUID2(extra);
//设置监听回调
TradplusAds.Instance().OnUID2StartFinish += OnUID2StartFinish;
void OnUID2StartFinish(string errrorMsg)
{
if(errrorMsg == null)
{
Configure.Instance().ShowLog("OnUID2StartFinish");
}
else
{
Configure.Instance().ShowLog("OnUID2StartFinish ------ errrorMsg:" + errrorMsg);
}
}
//移除监听
TradplusAds.Instance().OnUID2StartFinish -= OnUID2StartFinish;

Flutter#

1.接入要求及方法#

TradPlus Flutter 版本要求:1.1.6+

  • Android

Gradle引入

通过下载地址 获取 uid2_adapter aar 并添加到项目中

implementation 'com.uid2:uid2-android-sdk:1.4.0'
implementation files("libs/uid2_adapter_v1.0.0.aar")

混淆配置

-keep class com.data.uid2.adapter.** {*;}
-keep interface com.data.uid2.adapter.TTDUID2Manager$ResultCallback{*;}
  • iOS

通过下载地址 获取 TTDUID2Adatper.framwork 并添加到Xcode项目中

通过pod集成 UID2SDK

pod 'UID2','1.2.4'
2.调用及参数说明#
  • 调用建议在初始化TradPlusSDK之前
  • phone ,phoneHash ,email ,emailHash 可根据需求至少设置一个
  • 传入的信息是有格式要求的,随意传入可能会造成无法正常使用。请参考UID2官方文档说明:https://unifiedid.com/docs/getting-started/gs-normalization-encoding
  • 设置多个参数时,按 phone > phoneHash > email > emailHash 优先级获取使用。
  • subscriptionIDserverPublicKey为必传字段。
  • appName为可选字段,默认会获取当前app包名。
  • customURLString 可选,用于修改UID2服务器地址。
  • isTestMode 设置为 true 是将启动测试环境 。
  • 开启测试环境时,默认customURLString为:https://operator-integ.uidapi.com
3.代码事例#
static TTDUID2Listener? uid2Listener;
Map? extraMap = ttdUID2Manager.createUID2ExtraMap(
email: "abc@abc.com",
// emailHash:"",
// phone:"",
// phoneHash:"",
subscriptionID:"toPh8vgJgt",
serverPublicKey:"UID2-X-I-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKAbPfOz7u25g1fL6riU7p2eeqhjmpALPeYoyjvZmZ1xM2NM8UeOmDZmCIBnKyRZ97pz5bMCjrs38WM22O7LJuw==",
// appName:"",
// isTestMode: true,
// customURLString:""
);
uid2Listener = TTDUID2Listener(startFinish:(error){
if(error != null)
{
// Android 返回Success表示 成功 不会有返回null的情况
// ios 返回 null 表示成功
TPAdConfiguration.showLog('UID2 startFinish : error = $error');
}
else
{
TPAdConfiguration.showLog('UID2 startFinish');
}
});
ttdUID2Manager.setInitListener(uid2Listener!);
if(extraMap != null)
{
ttdUID2Manager.start(extraMap);
}

自行接入#

重要前提条件:请确保您已从 TTD 官方渠道获取到 UID2 Token

若您已成功从 TTD 官方获取到 UID2 Token,请按照 TradPlus SDK 对接文档 进行广告源集成,同时使用以下代码进行各端开发设置:

  • Android
  • 请注意:Android V10.1.0.1 及以上版本支持 UID2 Token 传输。
  • 请注意:以下代码建议在初始化 TradPlus SDK 前设置并获取。
UserDataInfo userDataInfo = new UserDataInfo();
userDataInfo.setAdvertisingToken(token);
TPSettingManager.getInstance().setUserDataInfo(userDataInfo);
  • iOS
  • 请注意:iOS V 9.8.0 及以上版本支持 UID2 Token 传输
  • 请注意:以下代码建议在初始化 TradPlus SDK 前设置
TradPlusUID2Info *UID2Info = [[TradPlusUID2Info alloc] init];
UID2Info.UID2Token = @"您的UID2Token";
[[TradPlus sharedInstance] setUID2Info:UID2Info];
  • Unity
  • 请注意:以下代码建议在初始化 TradPlus SDK 前设置
Dictionary <string, object> settingMap = new Dictionary<string, object>();
settingMap.Add("uid2_token", "您的UID2Token");
TradplusAds.Instance().SetSettingDataParam(settingMap);
  • Flutter
  • 请注意:以下代码建议在初始化 TradPlus SDK 前设置
Map settingMap = {"uid2_token": "您的UID2Token"};
TPSDKManager.setSettingDataParam(settingMap);

参考文档#