作者:iHTCboy
前言
“We’re trying to do two diametrically opposed things at once: provide an advanced and open platform to developers while at the same time protect iPhone users from viruses, malware, privacy attacks, etc. This is no easy task.” “我们试图同时做两件截然相反的事情:为开发人员提供一个先进和开放的平台,同时保护 iPhone 用户免受病毒、恶意软件、隐私攻击等。这不是一件容易的事。”Steve Jobs, October 17, 2007
一直以来,苹果对隐私保护都非常严格,虽然每年新 iPhone 发布都提前被暴光的差不多了,但从 2018 年 Facebook 隐私门事件开始,不管国内还是海外,行业巨头还是个人用户,大家对于隐私的关注都达到了新的高度。正如乔布斯说,开放和安全是截然相反的事情,但这件不容易的事,总需要有人做。从 WWDC20 开始,对用户隐私的保护,又达到了史前的疯狂程度,如推出 ATT(App Tracking Transparency),成为广告行业的敌人,更不要说平时对权限的严控,所以,本文带大家一起回顾苹果关于隐私的升级变化。
相册 vs 权限控制
以往,开发者只是想从用户相册选择一张图片,但是只能允许 App 访问整个相册的权限或者不允许访问,这一刀切的做法一直被吐槽。苹果在 WWDC20 针对相册权限新增了 Limited Photo Library Access
模式,用户可以选择 App 访问全部或部分的照片:
同时,也推出了 PHPickerController 图片选择器:
相比已经淘汰的 UIImagePickerController 只能选择一张照片,PHPickerController 除了只支持 iOS 14+ 的缺点,它可以设置无上限张图片,另外也可以过滤选择的相册类型,图片、视频、livephoto 等。PHPickerController 是使用的系统独立进程,所以不需要申请相册权限,可以直接调用 API 访问,这也许是开发者应该考虑的一个更优雅的使用方式。
今年 What's new in the Photos picker - WWDC22 苹果带来了更强大的相册过滤和已经支持 iOS/iPadOS/macOS/watchOS 全平台,也支持 SwiftUI 等。详细也可以查阅苹果文档 Selecting Photos and Videos in iOS。
广告归因 vs 跟踪
也许你也有过这样的经历:在某团购 app 购买过商品,然而你浏览其他 app 时,广告一直在向你推荐同样的商品。
因为你可能使用同一个邮箱账号登陆了不同的 app,他们之间通过共享这些信息,从而定位到你:
在浏览器中,广告商 cookie、根据浏览器配置以及安装的字体和插件、网络 IP 等特征,生成设备的 指纹信息
来确定用户。
而在移动端 app 中,苹果提供 IDFA(Identifier For Advertisers,广告标识符) 来确实用户。为了保护用户隐私,早在 2012 年苹果公司就不再允许其生态的 App 获取用户的唯一标识符,但是商家在移动端打广告的时候又希望能监控到每一次广告投放的效果,因此,苹果想出了折中的办法,就是提供另外一套和硬件无关的标识符,用于给商家监测广告效果,同时用户可以在设置里改变这串字符,导致商家没有办法长期跟踪用户行为。
设置 IDFA 路径在 iOS 14 以下 设置->隐私->广告->还原广告标识符
,而在 iOS 14 苹果在 WWDC20 推出 ATT
(App Tracking Transparency
, 应用追踪透明度)框架,旨在最终全面关闭 IDFA. 如果简单来说,苹果把 IDFA 是否允许 app 获取的权限交给了用户来选择:
当然,跟踪用户设备的目的是什么?最原始的目的是 广告归因
。他们希望将购买归因于广告点击,以便商家知道将广告预算集中在哪里,此类归因用于衡量哪些广告有效。但随着移动端成为全球用户必备的随身设备,单单的广告归因已经不能满足他们的目的,收集购买习惯以及其他隐私信息,它们变得比你自己更了解自身的购买需求!
苹果推出的 SKAdNetwork
就是希望在广告端袜掉用户的标识,各 app 之间的用户标识,要不要共享给第三方使用,应该由用户自己决定:
SKAdNetwork 归因数据本身不具有任何用户标识符,所以无法跟踪用户。SKAdNetwork 是让广告平台在不获取 IDFA 的前提下,对用户的点击和安装行为提供的一套追踪解决方案。由于 Apple 的介入,将直接横跨设备与 App Store,并且不会把任何设备信息透露给广告主,并且更有利于防作弊。
当用户点击广告时,一个带有签名信息的 App Store 产品界面呈现出来,签名信息标记了此次广告活动。如果用户安装并且打开了 app,设备发送一个安装验证通知给广告网络。这个由 Apple 签名的通知包括广告活动 ID,但是不含用户或设备相关的数据。通知还可以包含一个转化数值和来源应用 ID,这个取决于苹果设定的一个隐私阈值。
SKAdNetwork 最大的问题就是提供了聚合的数据,但对于广告来说,这个过程已经不是简单的跟踪用户,而跟踪广告也是非常的重要,因为一个广告可能有多个不同的素材和不同的渠道测试等。首先 SKAdNetwork 回调通知可以获取的 数据:
SKAdNetwork 2.0
{
"version" : "2.0",
"ad-network-id" : "com.example",
"campaign-id" : 42,
"transaction-id" : "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28",
"app-id" : 525463029,
"attribution-signature" : "MDYCGQCsQ4y8d4BlYU9b8Qb9BPWPi+ixk\/OiRysCGQDZZ8fpJnuqs9my8iSQVbJO\/oU1AXUROYU="
"redownload": true,
"source-app-id": 1234567891
"conversion-value": 20
}
SKAdNetwork 3.0
{
"version": "3.0",
"ad-network-id": "example123.skadnetwork",
"campaign-id": 42,
"transaction-id": "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28",
"app-id": 525463029,
"attribution-signature": "MEYCIQD5eq3AUlamORiGovqFiHWI4RZT/PrM3VEiXUrsC+M51wIhAPMANZA9c07raZJ64gVaXhB9+9yZj/X6DcNxONdccQij",
"redownload": true,
"source-app-id": 1234567891,
"fidelity-type": 1,
"conversion-value": 20,
"did-win": true
}
字段说明:
- version:版本号
- ad-network-id: 广告平台ID
- transaction-id: 用于转换去重的确认
- campaign-id: 记录广告 campaign 信息
- app-id: 投放广告的 ID 信息
- attribution-signature: Apple 对于归因的确认
- redownload: 是否重复下载
- source-app-id: 从哪个app 上看到广告且安装的
- conversion-value: 转换价值
- fidelity-type: 2.2 及更高版本提供。值为 0 表示页面展示类型的广告;值为 1 表示 StoreKit 渲染的广告。
- did-win: 3.0 及更高版本提供。如果广告网络赢得归因,则为 true,如果回发代表没有赢得归因的合格广告效果,则为 false。
注:
- 回调的 conversion-value: 无符号的 6 bit 整数(也就是只能为 0-63 的数字)。由广告主应用和广告网络决定此值的含义。默认为0。所以,因为数字太小,无法绑定到用户信息。
- 在实践中,开发者可以仔细把握调用的时机,并且对conversion-value数值做良好的定义,就能达到衡量广告用户质量的目的。
今年 WWDC22,苹果带来了 SKAdNetwork 4.0,为广告商提供有关其广告系列的更多信息,同时继续保护用户隐私。
分层源标识符
这个字段以前称为 campaign-id
(活动ID字段),允许广告商识别安装归因于哪个广告系列,以及额外的归因信息。广告商可以根据自己的目标配置这个四位数值,例如广告系列价值、广告投放或广告创意类型。
虽然苹果提供了 4 位数字配置,但是并不一定返回 4 位。苹果始终至少包含两位数字,根据广告系列所满足的安装次数和用户隐私级别,最多可以包含四位数字。例如,如果广告系列没有生成足够数量的安装,则回发的源标识符字段中只会显示两位数字。这为广告商提供了更大的广告系列灵活性,并在达到隐私阈值时提供了额外的归因洞察力,同时保护了跨应用程序的用户隐私。
为什么苹果说足够数量的安装才会返回更多的位数?这里有一个概念 differential privacy techniques
(差分隐私技术),利用这种技术,避免可以跟踪定位到用户层级的数据。下文会提到,这里暂时先略过,有兴趣可以翻到下文查看。
多次转换通知
SKAdNetwork 最大的一个问题是,归因延迟至少 24 小时,严重影响了转换率的统计,投放的广告不能马上看到效果,这是广告投放最可怕的事,投了钱不能马上看到效果,是亏还是赚还要等。虽然今年苹果并没有提高实时回调(估计未来也不会),但提供了最多三次通知,每次都基于特定的转换窗口(分别为0-2天、3-7天和8-35天)。这使他们能够更好地了解从广告系列中安装应用程序的人随着时间的推移与广告应用程序的互动程度。
注:每个转换窗口可以包含多个活动广告。SourceID、SourceAppID和粗粒度转换值是有条件的,只有在达到隐私阈值时才包含在第二次和第三次回调中。
需要说明的是,使用 SKAdNetwork 不需要用户允许 App Tracking Transparency 广告跟踪,因为 SKAdNetwork 是聚合数据,从回调的数据中,广告商是不能反向定位用户信息,所以并不需要 ATT 的授权。
同理,因为没有用户层级的数据,LTV(Life-Time Value)的数据将会失效。这对广告主来说,是巨大对的影响。以往跟踪 LTV 数据然后进行媒体侧投放买量的行为,将会失效。所以广告主一直想跟踪用户,除了 ATT 外,设备指纹是目前剩下的方式,但根据 Apple Developer Program 许可协议,开发者不得为了唯一识别设备而从设备中获取数据。用户或设备数据的示例包括但不限于:用户的网页浏览器及其配置、用户的设备及其配置、用户的位置或用户的网络连接。引用SDK的应用程序,包括但不限于广告网络、归因服务和分析,如果发现参与这种做法,可能会被App Store拒绝。
Safari vs PCM(私人点击衡量)
Safari 浏览器拥有多项先进功能,帮助保护你的隐私安全,防止你受到跨网站跟踪,并能最大限度减少传送给第三方的数据。对于苹果来说,没有浏览器广告业务,隐私保护自然做的更加好。
PCM(Private Click Measurement,私人点击衡量)隐私保护广告点击归因,是苹果提出的一个 Web 网络标准技术,浏览器充当了搜索网站和商家网站的中间人。 中间人会限制网站之前发送的信息,过滤掉用户敏感信息,只发送归因的参数,比如 Campaign(广告组) 和 Convert (转化事件)。
详细技术可以阅读苹果官方文档:
- Introducing Private Click Measurement, PCM
- Privacy Preserving Ad Click Attribution For the Web | WebKit
- Private Click Measurement
SKAdNetwork 4.0 支持网页版 SKAdNetwork,让广告商能归因那些会转至推广 App 的 App Store 产品页面的网页广告,除了移动网站外,苹果还支持 iOS 和 iPadOS app 的 SFSafariViewController。
App Store vs 转化率
App Store 让开发者能在 175 个地区提供面向 iPhone、iPad、Mac、Apple TV 及 Apple Watch 的 App 和服务。如何触及更多用户,并不断发展您的业务,App Store 提供了巨大的商机,自定产品页、产品页优化、App 内活动、优惠订阅等等。
衡量 App 表现
有多少用户在 App Store 上搜索或浏览时发现了您的 App?哪些 App 和网站吸引了用户查看您的产品页?怎么衡量自己 App 的下载次数(包括首次下载次数、重新下载次数和总下载次数)以及您的 App Store 转化率?
苹果今年 WWDC22 提供 App 分析中的基准 功能,基准通过将与获客率、使用和盈利情况相关的绩效指标置于具体情境中,在整个客户旅程期间提供有价值的见解,这样您就可以很容易地看到您与同行相比的表现,并做出相应决策以实现业务目标。
举例来说,查看 app 转化率,开发者可以了解自己 app 与同类 app 的表现情况:
App Store 通过独家提供的宝贵数据,来深入了解和发现您的 App 的表现效果。苹果提供转化率、1/7/28天留存率、崩溃率和平均付款率等。
开发者可能会有疑问,苹果这是公开开发者的数据吗?苹果表示对照组 app 使用 differential privacy techniques
(差分隐私技术),以确保机密信息的安全性和私密性。那么什么是差分隐私技术?
举例来说,假设有一个问题用户可以回答 Yes 或 No,那么如果用户选择 Yes
,那么这个选择上传到服务器时,会先随机生成 Yes 或者 No,那么有 50% 概率是 Yes 也就是用户的选择。如果是 No,在随机生成一次 Yes 或者 No,然后有 25% 概率是 假数据
。因为数据有可能是假信息,所以可以避免通过用户的数据推导(定位)到指定的用户。所以差分隐私技术能够增强数据匿名和数据汇总的隐私保护程度。
这里读者可以有疑问,这样数据样本就不具有准确性了吗?所以,差分隐私技术的一个前提条件,是数据量必然很大,才能减少这些随机数据的影响。从上面的例子来说,至少 75% 是正确的选择,最高接近 100% 是正确选择。
关于差分隐私技术,可以参考苹果文档了解更多:
- Differential Privacy Overview - Apple
- Apple Privacy-Preserving Machine Learning Workshop 2022 - Apple Machine Learning Research
- Learning with Privacy at Scale - Apple Machine Learning Research
- Differential Privacy - Simply Explained - YouTube
App vs 开发者模式
iOS 16 和 watchOS 9 中引入的开发者模式,用于保护用户在设备上无意中安装有害软件的问题,并减少仅由开发者功能暴露的攻击载体。
对于开发者来说,此举可能比较麻烦,从体验来说打开开发者模式还算快。对于用户来说,影响是比较深远,像我们之前的文章提到 iOS15 安全漏洞分析:价值10万美元的漏洞曝光,0 day 漏洞还是 1 day 漏洞,对于不升级系统的用户,破坏性依然存在,但如果有了开发者模式,普通用户受影响的范围会降低很多。
对于使用签名分发包体的方式,未来估计不复存在,一方面教育用户启动开发者模式成本很高,另一方面苹果对于开启做了多重警告提示用户。另一种企业证书,目前苹果已经不在审批新的企业证书,所以未来只会越来越少,直到消失。至此,安全性的价值远大于开发者启动开发者模式带来的不便。
详细可以参考苹果文档:Enabling Developer Mode on a device。
隐私 vs 可见性
除了隐私权限由用户来决定,苹果也将越来越多的隐私权限使用的可见性。例如 WWDC20 推出的 隐私标签
、App 隐私报告
:
App Store 里的产品介绍页面包含一个隐私处理说明版块,以简洁易读的标签摘要形式,呈现由开发者提供的隐私信息处理方式报告,确保用户能在充分知情的情况下进行选择。
开启“记录 App 活动”功能后,你所有 app 的行为都一目了然。“设置”中的这个版块让你可以查看过去 7 天内各 app 访问你的位置、照片、摄像头、麦克风以及通讯录的频率。它还会显示这些 app 访问其他域的频率。结合隐私标签所提供的信息,你可以更加全面地了解所用 app 如何处理你的隐私。
在 iOS 16,可以通过菜单栏点击查看当前有那些 app 在使用定位权限。摄像头、麦克风等也能点击查看是那个 app 在使用对应的权限了。
粘贴板使用透明度
在 iOS 15 中,当有 app 从粘贴板拷贝内容时,系统会发出通知,提醒用户留意此行为。而 iOS 16 开发者粘贴来自其他 app 的内容时,需要弹窗请求用户允许,且在未经允许前,无法访问粘贴板的内容。
有三种方法可以避免此提示出现在 app 中:
- 使用编辑选项菜单
- 使用键盘快捷键
- 使用 UIPasteControl
UIDevice.name
Entitlements 文件中包括 com.apple.developer.device-information.user-assigned-device-name
,才能获取到真实的设备名。但目前从苹果文档 UIDevice 还没有看到相关的配置说明。
macOS app 权限
macOS Ventura 系统配置 UI 更新,并且对 App 权限进行更加精细的管理,包含 app 要调用或删除其它 app(与当前 app 包名不一样的 app),或者电脑启动时,自动启动的 app 或者服务等,都有严格的控制:
另外,苹果提供 SMAppService API 来控制这些服务能力。
Gatekeeper(门禁)
Gatekeeper(门禁)技术,旨在确保只有受信任的软件才能在 Mac 上运行。
Gatekeeper 检查新下载的应用程序的完整性,在 macOS Ventura 中,Gatekeeper 将检查所有经过公证的应用程序的完整性,而不仅仅是隔离的应用程序。有一些 app 往往不止是一个 app,而有多个不同的 app,如果需要更新这些 app,需要在 Info.plist 添加 NSUpdateSecurityPolicy
来指定那些 app 包更新权限。
"NSUpdateSecurityPolicy" => {
"AllowProcesses" => {
"123ABC" => [
0 => "com.example.pal.about"
]
}
}
注:截止本文发表,苹果还没有更新
NSUpdateSecurityPolicy
相关详细的文档。
设备连接
大家会经常看到这样的授权,本地局域网或者蓝牙授权:
需要这些权限,是因为连接的管理设备选择需要了解所有设备,但这提供了对不必要信息的访问,并带来设备指纹风险。
iOS 16 可以通过 DeviceDiscoveryExtension
Framework 来引导用户连接对应的设备。但截止目前还没有找到相关的文档说明。
没有密码 and 没有验证码
Apple、谷歌与微软承诺拓展对 FIDO 标准的支持,以加速普及免密码登录 来源
隐私与安全,最安全的身份验证可以是根据用户的生物特征来验证,而利益于指纹识别、面部识别等技术成熟,Passkeys 就是基于这些基础而免于输入密码。而验证码是用于验证用户和机器人的区别,在我们生活中,验证码已经无处不在,而苹果基于自家的 iCloud、Apple ID 账号体系提供了 Private Access Tokens
(PAT,私有访问凭据)来信任设备。
详细技术细节,可以观看 Meet passkeys、Replace CAPTCHAs with Private Access Tokens,或阅读 遇见 Passkey、私有访问凭证 文章。
Lockdown Mode(锁定模式)
- Apple 扩展安全承诺,保护用户免遭间谍软件侵害 - Apple (中国大陆)
2022 年 7 月 6 日,苹果更新了 iOS 16 beta2 版本开始,增加了 Lockdown Mode
(锁定模式)
Lockdown 旨在为极少数用户提供可选的极端保护。这些用户因其身份或工作性质,可能被极为先进的数字威胁锁定为攻击目标,如来自 NSO Group 等在国家授意下开发间谍软件的私人企业发起的攻击。在 iOS 16、iPadOS 16 和 macOS Ventura 中开启 Lockdown 模式将进一步加强设备防护,严格限制部分功能,大幅减少受攻击面,以免给具高度针对性的间谍软件可乘之机。
Lockdown 模式发布时将包括下列保护功能:
- 信息:除图片之外的绝大多数信息附件类型将被拦截。链接预览等部分功能将被禁用。
- 网络浏览:just-in-time (JIT) JavaScript 编译器等部分复杂网络技术将被禁用,除非用户在 Lockdown 模式中设置受信站点白名单。
- Apple 服务:向用户发起的 FaceTime 通话等邀请与服务请求将被拦截,除非用户此前向对方发起过通话或请求。
- iPhone 锁定时,与电脑或配件的有线连接也将被拦截。
- Lockdown 模式开启后将无法安装配置文件,且设备无法加入移动设备管理(MDM)。
总结
“我相信人都是聪明的,有些人也愿意分享更多数据。 这就要征询他们的同意,每一次都征询。就算他们厌倦了,也得让他们来告诉你不必再问了。而且你要确切地告诉他们,你会怎样使用他们的数据。”Steve Jobs 2010 年,万物数字化大会 (All Things Digital Conference)
正如乔布斯所说,隐私保护,最终让用户决定。但需要注意,在安全的环境下让用户全权决定,但不是代表一味地追求完全自主。苹果通过技术在 先进和开放
、隐私和安全
之间,找到了关联。
区块链 Web 3.0 概念虽然火热,但其不可篡改也不可撤销也未必适合所有场景。2022 年 6 月 30 号,苹果强制要求具备账号体系的 App 必须提供 帐户删除 的功能,对于用户来说,删除数据重要吗。
ATT 对于广告行业,使用 SKAdNetwork,就像投放广告,没有最好的广告,也没有最好的唯一方式,在垄断与隐私方面,依然需要探索更多的可能性和平衡性。
参考
- Meet the new Photos picker - WWDC20 - Videos - Apple Developer
- Handle the Limited Photos Library in your app - WWDC20 - Videos - Apple Developer
- What's new in the Photos picker - WWDC22 - Videos - Apple Developer
- Selecting Photos and Videos in iOS | Apple Developer Documentation
- What's new with SKAdNetwork - WWDC22 - Videos - Apple Developer
- SKAdNetwork | Apple Developer Documentation
- Ad Attribution - App Store - Apple Developer
- Discover Benchmarks in App Analytics - WWDC22 - Videos - Apple Developer
- Differential Privacy Overview - Apple
- Apple Privacy-Preserving Machine Learning Workshop 2022 - Apple Machine Learning Research
- Learning with Privacy at Scale - Apple Machine Learning Research
- Differential Privacy - Simply Explained - YouTube
- iOS15 安全漏洞分析:价值10万美元的漏洞曝光 - 掘金
- 隐私 - 管控 - Apple (中国大陆)
- Building_a_Trusted_Ecosystem_for_Millions_of_Apps_A_Threat_Analysis_of_Sideloading.pdf
- A_Day_in_the_Life_of_Your_Data.pdf
- 在 Mac 上安全地打开 App - Apple 支持 (中国)
- Meet passkeys - WWDC22 - Videos - Apple Developer
- 【WWDC22 10092】遇见 Passkey - 小专栏
- Replace CAPTCHAs with Private Access Tokens - WWDC22 - Videos - Apple Developer
- 【WWDC22 10077】验证码的替代者—私有访问凭证 - 小专栏
- 帐户删除要求将从 6 月 30 日起生效 - Apple Developer
- 隐私 - 功能 - Apple (中国大陆)