私密点击测量 (PCM) 简介
这篇博文介绍了一个新功能,名为私密点击测量(Private Click Measurement,简称 PCM),用于衡量跨网站以及从 iOS 应用到网站的广告点击。它是 iOS 和 iPadOS 14.5 测试版的一部分。
动机和目标
传统的网络广告归因是通过携带用户或设备 ID 的 Cookie 来完成的。这种归因构成了跨站跟踪,而 WebKit 致力于阻止此类行为。网站不应能够将广告点击数据和转化数据归因于单一用户,作为大规模跟踪的一部分。
同时,我们希望支持在线广告的测量。PCM 通过在专用的私密浏览模式下发送数据有限的归因报告来实现这种权衡,不使用任何 Cookie,并将报告随机延迟 24 到 48 小时以使事件在时间上脱钩,并在设备上处理数据。
功能概述
- 一项新的默认开启功能,名为私密点击测量(Private Click Measurement,简称 PCM),用于在 iOS 和 iPadOS 14.5 测试版中,隐私保护地测量跨网站以及从 iOS 应用到网站的广告点击。
- 点击源侧的 8 位标识符,这意味着每个网站或应用可以测量 256 个并行广告活动。
- 转化侧的 4 位标识符,这意味着可以区分 16 种不同的转化事件。
- 通过不可关联令牌的欺诈预防功能即将推出。
一项拟议标准
我们最早在 2019 年 5 月提出了隐私保护的广告点击测量。自那时起,该提案已更名为私密点击测量,并在 W3C 隐私社区组中通过会议和 GitHub 进行了广泛讨论。
一个提案需要两个独立的实现才能有望成为网络标准。这意味着在 PCM 能够进一步推进标准轨道之前,其他浏览器,例如 Firefox、Brave、Chrome 或 Edge,需要独立实现 PCM。我们正在与它们合作以实现这一目标。
尽管如此,我们很高兴成为第一个启用拟议网络广告测量标准的浏览器!
默认开启
您可能会问,为什么我们在没有第二个独立实现并且尚未添加 W3C 隐私 CG 讨论的欺诈预防机制之前,就默认启用了 PCM。原因如下:
- 提前访问。我们认识到提前访问的需求,以便广告商、网站和应用可以采用这项技术,分析真实数据,调整其测量,并向我们报告任何问题。
- 平等访问。我们希望为所有人提供从一开始就测试和使用这项技术的机会。另一种选择是仅与选定的合作伙伴合作,但我们选择了开放的方法。
- 归因数据稳定。欺诈预防令牌将会添加,数据标签的命名可能会改变,但功能和归因数据是稳定的,即点击源侧为 8 位,归因侧为 4 位。因此,目前对 PCM 进行全面测试是有意义和有用的。
网站到网站的点击测量
PCM 网站到网站是拟议标准所涵盖的案例,即用户点击网页上的链接,被导航到另一个网站,最多七天后,目标网站会发出信号,表示希望对之前将用户带到此处的任何点击进行归因。
为了下面的示例,我们假设点击发生在名为 social.example
的网站上,并且点击将用户导航到 shop.example
。
点击侧

希望存储点击测量数据的链接应如下所示:
<!-- Link on social.example -->
<a href="https://shop.example/product.html"
attributionsourceid="[8-bit source ID]"
attributeon="https://shop.example">
Markup
</a>
两个强制属性是:
attributionsourceid
:8 位归因源 ID,允许值为 0 到 255。这以前被称为广告活动 ID,但由于 PCM 在技术上不与广告绑定,因此在标准讨论中决定其属性和键名不应使用广告术语。attributeon
。希望将传入导航归因于点击的点击目标网站。请注意,PCM 仅使用可注册域名或 eTLD+1,即不基于子域名进行区分。这是为了防止目标网站被设置为https://janeDoeTracking.shop.example
来跟踪用户 Jane Doe。
如果点击确实将用户导航到 attributeon
网站,则 attributionsourceid
将作为从 social.example
到 shop.example
的点击存储 7 天。
请注意,此数据网站无法访问。它悄悄地存储在浏览器中。
触发事件

要触发点击归因,“归因”网站必须向运行点击广告的网站发起 HTTP GET 请求。这种方式旨在支持现有的“跟踪像素”并简化采用。在我们的示例中,这将是 shop.example
网站向 social.example
发起 HTTP GET 请求。有关更现代的归因触发方式,请参阅“未来增强”部分。
对 social.example
的 HTTP GET 请求如果重定向到 https://social.example/.well-known/private-click-measurement/trigger-attribution/
[4位触发数据]/[可选的6位优先级]
,则会触发归因。注意:第一个测试版缺少 /trigger-attribution
路径组件,因为这是标准组中非常最近的决定。
两个 URL 路径参数是:
- 触发数据。这是一个 00 到 15 之间的 4 位值,用于编码触发事件(注意强制的两位数字)。这以前被称为转化值,但再次强调,PCM 在技术上不与广告绑定,因此不使用广告术语。
- 可选优先级。这是一个 00 到 63 之间的 6 位值,允许多个触发事件导致针对最高优先级事件生成一个归因报告(再次强调,注意两位数字)。例如,销售漏斗中可能存在多个步骤,每个步骤都会触发归因,但漏斗中更下游的步骤具有更高的优先级。此值仅控制哪个触发数据进入归因报告,而不属于归因报告本身。您可能会问为什么这不是一个像触发数据一样的 4 位值。原因是支持轻松更改测量内容,而无需重新映射多个触发数据到优先级对。触发事件 00-15 可能最初映射到优先级 00-15,但随后店主希望深入了解事件 5-7。有了额外的位,可以轻松将触发事件 05-07 分配到优先级 20-22,从而将归因报告集中到这些事件。
一旦触发事件与存储的点击匹配,浏览器会安排在 24 到 48 小时后(或之后浏览器运行的最早时间)随机发送一份归因报告。只要归因报告尚未发送,就可以根据具有更高优先级的触发事件进行重新安排。
归因报告

PCM 归因报告以 HTTP POST 请求的形式发送到点击发生网站的 /.well-known/private-click-measurement/report-attribution/
,在我们的示例中是 https://social.example/.well-known/private-click-measurement/report-attribution/
。注意:第一个测试版缺少 /report-attribution
路径组件,因为这是标准组中非常最近的决定。
报告采用 JSON 格式,如下所示:
{
"source_engagement_type" : "click",
"source_site" : "social.example",
"source_id" : [8-bit source ID],
"attributed_on_site" : "shop.example",
"trigger_data" : [4-bit trigger data],
"version": 1
}
关于以上不明显的键值对的说明:
- 对于 PCM,
source_engagement_type
始终为“click”。此字段允许将来将此报告机制用于其他类型的归因,例如视图归因。 version
向接收端表明这是归因功能的哪个版本。您应该预期当添加欺诈预防令牌或机制发生其他更改时,此数字会增加。这允许并发版本并行工作,并向开发人员提供信号,表明他们可能需要更改或采用其侧的一些内容。
应用到网站的点击测量
这令人兴奋——我们正在添加从 iOS 和 iPadOS 应用测量广告点击到 Safari 的功能!
许多应用内的广告商希望将用户带到他们的网站,在那里用户可以购买产品或注册服务。这正是 PCM 应用到网站功能允许他们测量的广告类型。
点击侧
与 PCM 网站到网站不同之处仅在于 iOS 应用中的点击侧。要采用这项技术,您需要执行以下操作:
- 在 Info.plist 中,在
NSAdvertisingAttributionReportEndpoint
键下添加一个 URL,用于在您的应用中点击广告时发送 PCM 的广告归因报告。此端点的命名故意不与 PCM 绑定。将来与应用相关的潜在广告测量报告可能在适当情况下使用此 URL 以及不同的已知位置。请注意,随后的 HTTP 重定向以触发归因需要指向此网站。 - 填充新的
UIEventAttribution
并将其添加到您调用openURL:
的选项中。有关需要在UIEventAttribution
中输入哪些字段,请参见下文。 - 将点击广告中将触发导航到网站的部分覆盖上新的
UIEventAttributionView
。此视图仅作为 Apple 设备上代码的检查点,用于在导航发生之前检查是否发生了用户手势。该视图不消耗手势,即使手势发生在此视图之一上,您也可以自由决定是否导航到网站。您的UIEventAttribution
对象需要用户手势才能作为调用openURL:
的一部分转发到浏览器。请注意,PCM 应用到网站目前仅在 Safari 上支持,并且仅在 iOS 和 iPadOS 上。我们打算添加 WebKit API,以使其他默认浏览器也能成为 PCM 应用到网站的目标。

UIEventAttribution
这是您在调用 openURL:
并希望测量点击时提交的可选数据结构
open class UIEventAttribution : NSObject, NSCopying {
open var sourceIdentifier: UInt8 { get }
open var destinationURL: URL { get }
open var reportEndpoint: String? { get }
open var sourceDescription: String { get }
open var purchaser: String { get }
public init(sourceIdentifier: UInt8,
destinationURL: URL,
sourceDescription: String,
purchaser: String)
}
sourceIdentifier
与 PCM 链接的attributionsourceid
属性相同。允许的值为 0-255。destinationURL
与 PCM 链接的attributeon
属性相同,但它应该是一个带协议的完整 URL。报告将发送到 URL 的可注册域名(eTLD+1)并通过 HTTPS。reportEndpoint
将由 Apple 代码从您的 info.plist 的NSAdvertisingAttributionReportEndpoint
中获取。正如您所见,init
函数不接受此参数。这是 PCM 将发送任何后续广告归因报告的地方。它需要在静态 Info.plist 中声明的原因是,它不能通过动态提交用户特定的报告 URL(例如janeDoeTracking.example
)来用作跟踪向量。sourceDescription
是被点击内容的人类可读描述。此字符串长度不应超过约 100 个字符,并可根据上下文进行本地化。Apple 或目标网站不会看到它。相反,它旨在向用户显示他们存储了哪些广告点击数据。purchaser
是被点击内容购买者(通常是广告买家)的人类可读名称或描述。此字符串长度不应超过约 100 个字符,并可根据上下文进行本地化。Apple 或目标网站不会看到它。相反,它旨在向用户显示他们存储了哪些广告点击数据。
UIEventAttribution
示例代码
func openAdLink() {
let adURL = URL(string: "https://shop.example/tabletStandDeluxe.html")!
let eventAttribution =
UIEventAttribution(sourceIdentifier: 4,
destinationURL: adURL,
sourceDescription: "Banner ad for Tablet Stand Deluxe.",
purchaser: "Shop Example, Inc.")
// If using scene lifecycle.
let sceneOpenURLOptions = UIScene.OpenExternalURLOptions()
sceneOpenURLOptions.eventAttribution = eventAttribution
self.view.window?.windowScene?.open(adURL,
options: sceneOpenURLOptions,
completionHandler: nil)
// If using application lifecycle.
let appOpenURLOptions: [UIApplication.OpenExternalURLOptionsKey : Any] = [
.eventAttribution: eventAttribution
]
UIApplication.shared.open(adURL,
options: appOpenURLOptions,
completionHandler: nil)
}
UIEventAttributionView
UIEventAttributionView
是放置在可点击内容(通常是广告)上方的视图。系统用它来验证是否发生了用户手势。
open class UIEventAttributionView : UIView {
}
该视图是不可见的,并且非常轻量级。最简单的用例是创建一个这样的视图,并将其拉伸覆盖您整个可点击的内容。如果例如您想创建特定的可点击区域,您也可以在单个内容上放置多个视图。
为确保您的 UIEventAttributionView
正常工作
- 确保
isUserInteractionEnabled
为false
。这是此视图的默认值,并确保该视图不消耗否则会传递到其下方内容的事件。 - 确保事件归因视图上方没有放置任何视图。用户应该点击此视图,以便将其计为 PCM 应用到网站的用户手势。
- 确保您的点击处理在触摸抬起事件时发生。如果您的内容在
UITapGestureRecognizer
触发或UILongPressGestureRecognizer
的.ended
状态下被点击,则会自动发生此情况。
UIEventAttributionView
示例代码
func addEventAttributionView() {
// Create an event attribution view.
let eventAttributionView = UIEventAttributionView()
// Place it over your ad however you'd like.
eventAttributionView.translatesAutoresizingMaskIntoConstraints = false
adView.addSubview(eventAttributionView)
NSLayoutConstraint.activate([
adView.topAnchor.constraint(equalTo: eventAttributionView.topAnchor),
adView.leadingAnchor.constraint(equalTo: eventAttributionView.leadingAnchor),
adView.trailingAnchor.constraint(equalTo: eventAttributionView.trailingAnchor),
adView.bottomAnchor.constraint(equalTo: eventAttributionView.bottomAnchor)
])
}
测试与调试
WebKit 有一个名为“私密点击测量调试模式”的实验性功能。您可以在 macOS 上的“开发”->“实验性功能”下找到它,在 iOS 和 iPadOS 上的“设置”->“Safari”->“高级”->“实验性功能”下找到它。当您启用此模式并重新启动 Safari 时,报告会在触发事件后仅 10 秒发送,而不是 24-48 小时后。这允许快速进行测试和调试。
调试模式还会启用 Web Inspector 控制台中的调试输出。此输出将在后续测试版中默认显示。
测试完成后,请记住禁用调试模式。
未来增强功能
与网络标准(无论是拟议的还是已建立的)一样,总会有增强请求、边缘案例以及随着平台发展而演进规范的需求。以下是可能在即将发布的 PCM 实现版本中体现为更改的突出且相关的问题列表。如果您有任何意见,请在 GitHub 上参与。
- 通过不可关联令牌进行欺诈预防,GitHub 问题 #27。一项拟议解决方案已于 2020 年 5 月提交给 W3C 隐私社区组。它将使用传统上称为盲签名(我们称之为不可关联令牌)。目的是向网站提供以加密方式签署令牌的服务,这些令牌将以一种格式包含在归因报告中,使得无法将其与签署时的事件关联起来。这些令牌作为报告接收方的证明,表明他们信任所涉及的事件(链接点击和归因触发),而无需告知他们是哪个事件。
- 现代 JavaScript API 用于触发事件,而不是传统的跟踪像素,GitHub 问题 #31。这里的意图是让 JavaScript 调用作为触发事件,而不是重定向跟踪像素。这将完全消除对第三方请求的要求。
- 归因报告也发送给广告商,GitHub 问题 #53。我们曾表示希望将归因报告发送给点击来源和广告商网站。然而,这引发了关于向指定第三方发送报告的讨论,您可以在GitHub 问题 #57中阅读并参与该讨论。
- 支持嵌套 iframe 中的 PCM 链接,GitHub 问题 #7。这涉及到测量在跨站点 iframe 中提供的点击广告。由于后续的归因报告将发送到第一方点击源站点,因此不清楚第一方应如何控制其代表请求的点击测量。本次讨论的一部分不仅涵盖第三方提供广告,还涵盖向此类第三方进行报告。这种方案的隐私风险在GitHub 问题 #57中进行了探讨。
滥用或与跟踪结合使用可能导致阻止
PCM 旨在支持隐私保护地测量跨网站或从应用到网站的点击。它不打算用于跨这些上下文跟踪用户、事件或设备。
如果 PCM 被滥用于跟踪目的,或与无关的用户、事件或设备跟踪手段结合使用,我们可能会阻止违规方使用 PCM 以及潜在的未来测量功能。
常见问题
- PCM 网站到应用呢?我们对此感兴趣,但尚未有解决方案。
- 视图广告归因呢?我们对此感兴趣,但尚未有隐私保护的解决方案。
- 为什么点击必须将用户带到设备的浏览器?是的。存储的点击有效期为 7 天。假设用户在点击后没有立即触发归因,而是想先考虑一下。当他们几个小时或几天后选择重新参与时,他们很可能会前往浏览器,要么查看他们离开时的标签页,要么使用他们可能保存的书签,要么使用他们的搜索提供商找到正确的网页,或者直接在 URL 栏中输入网站地址。为了让存储的点击数据在用户以这种方式重新参与时随时可用,初始点击需要将用户带到他们的浏览器,因为 PCM 数据就像其他网站数据一样,在浏览器和 WebView 之间不共享。简而言之:用户的浏览器是最有可能发生延迟点击归因的地方。
- 根据 AppTrackingTransparency,使用 PCM 应用到网站是否需要应用获得跟踪权限?不需要。
- 用户如何删除存储的点击?当用户删除网站数据时,存储的点击也会被删除。
- 用户可以退出 PCM 吗?是的。Safari 中有一个新的隐私设置用于隐私保护广告测量。如果用户已选择退出,则不会存储任何点击元数据,也不会发送任何归因报告。
- PCM 在私密浏览模式下启用吗?不启用。
- 每个源网站或源应用并行广告活动的最大数量是多少?256,实际值在 0 到 255 之间。
- 我可以区分的触发事件的最大数量是多少?16,实际值在 0 到 15 之间。
- 点击和触发事件之间最长的时间间隔是多少才能获得归因?7 天。
- 我可以使用 WebView 与 PCM 应用到网站一起使用吗?不能。应用对 WebView 的控制太多,像 PCM 这样的功能无法保护数据。
- 我可以使用 SFSafariViewController 与 PCM 应用到网站一起使用吗?我们对此感兴趣,但尚未有解决方案。
- iOS 和 iPadOS 上的其他默认浏览器可以参与 PCM 应用到网站吗?我们打算在稍后添加此类 API。如果您感兴趣,请告知我们。
- 我可以在哪里提供反馈?请直接向 WebKit 提交任何与 Web 相关的问题或归因报告机制问题:https://bugs.webkit.org。有关 UIKit API 或 Info.plist 集成的任何问题,请使用 Feedback Assistant:https://developer.apple.com/bug-reporting/。
感谢
我们衷心感谢 W3C 隐私社区组在提交问题、建议更改以及与我们共同开展这项工作方面所做的所有努力。请在我们前进的道路上继续这样做。此外,非常感谢帮助实现此功能的工程师们——Anant、Kate、Jon、Chris、Jonathan、Chris 和 Glen。