作者:小铁匠Linus,iOS 开发者,微信公众号《WLB工作生活两不误》号主。
Sessions: https://developer.apple.com/videos/play/wwdc2020/10676/
现今,隐私问题比以往任何时候都重要。了解这次苹果提供的隐私保护建议、方法,以及如何在苹果的平台上应用最新的功能。其中,这些新功能可以帮助您的应用赢得用户的信任,提升用户的使用体验。本 session 内容包括但不限于, iOS 会在应用使用麦克风或摄像头录制时提供的提示、使用近似的地理位置、用户追踪和权限等等。
今年,苹果提供了四个隐私保护的建议来指导我们的产品和功能。它们分别是:
本地设备的处理,在本地设备上处理数据而不将其发送到服务器;
数据最小化,请求并仅使用实际需要的数据;
安全防护;
透明与可控,为用户提供对其数据的理解和控制
不发送数据到服务端的好处,一旦从设备上发送数据,就失去了对数据的控制权,因为服务端可能会将数据共享给第三方,从而导致信息泄露。
有时,开发者需要在本地设备上收集数据并进行模型训练。只需将模型拖拽入 Xcode 项目,通过 CoreML 构建和训练设备上的模型就行了。同时,还能利用本地的安全机制将数据保护起来。
从 iOS 13 开始,iOS 已经在使用私有联邦学习(Private Federated Learning,PFL)对潜在的敏感数据进行机器学习模型的构建。PFL 发送的是模型而不是数据。因此,服务端集中处理的是模型,而不能直接访问用户的数据。去年,苹果在部分用户的手机上使用这种技术对 QuickType 和 Siri 语音识别的模型进行了优化。
今年,在芯片中用到了强大的神经引擎;同时,也不需要给苹果或其它第三方发送数据就能优化模型。详情请见 Use model deployment and security with Core ML [1]和 Get models on device using Core ML Converters[2]。
苹果为设备中的多种语言提供了本地设备的听写功能。当在手机上进行听写时,语音数据将在本地设备上进行处理,而不需要发送语音数据给服务端。
HomeKit 可以让摄像头或可视门铃识别出相册中打过标签的人像,同时,数据是没有发送给苹果进行识别的。
如果向用户索取的个人信息多于实际用到的,可能会让用户拒绝使用这个功能,因此,访问用户的数据越少,越能体现出对用户数据的敬畏,从而赢得用户的信任。
今年,提供了一系列新的工具,可以让用户数据和业务功重新达到平衡。iOS 14 为三种数据类型提供了新的访问方式,分别是照片、地理位置和通讯录。
原先在 iOS 13 中,使用相册中某一张照片时,需要在弹框中授权访问整个相册的权限;发送地理位置也是需要在弹框中授权获得精确的地理位置权限;给某个联系人发送消息,也是需要在弹框中授权访问整个通讯录的权限。从保护隐私和易用性的角度来说,过多的权限授权、多次的弹框一点都不优秀。
iOS 14 引入了一种新的 Limited Photos Library 的授权方式,用户可以只授权选中照片的权限而不是全部相册的权限。开发者记得在 iOS 14 上为新的弹框选项做兼容性处理吖。
大多数应用在使用相册时其实只需要很少的几张照片,如果使用新的 PHPicker 框架替代原本的 UIimagePickerController,那么完全可以不用弹出授权弹框。PHPicker 可以搜索和多选,而且不需要用户授予相册的访问权限。它是以独立进程的方式在屏幕的顶层进行渲染展示,应用无法直接访问到 PHPicker 或者对 PHPicker 的内容进行截图。只有用户实际选中的内容才会回调给应用。除非了的确需要所有相册访问权限的应用,比如相册备份功能,否则建议使用新的 PHPicker 框架获取照片。详情请见 Meet the new Photos picker[3]。
iOS 14 为用户增加了一种分享近似地理位置的功能,使用时也会弹框进行提示,在用户授权后应用只能获取到近似的地理位置更新。很多应用(比如给周围用户分享照片的应用等)是天然支持近似地理位置的。
开发者可以在 info.plist 中设置 NSLocationDefaultAccuracyReduced 这个 key,那么当需要地理位置授权时就会默认请求近似的地理位置。当然,如果你的应用需要精确的地理位置,比如导航软件,可以临时让用户授权精确的地理位置。
在不影响用户使用功能和更多业务功能的前提下,尽量考虑使用近似的地理位置。CoreLocation API 的变更详情,请见 What's new in location [4]和 Design for location privacy[5]。
QuickType 会从本地设备的通讯录数据库中读取联系人的详情数据。开发者可以在 textfield 的 textContentType 属性设置输入字符时需要提示的是哪种类型的联系人数据。
如果只是为了填一个姓名或邮箱,大部分应用是不需要访问所有的通讯录。详情请见 AutoFill everywhere[6]。
苹果在域名追踪和网络协议两个方面进行了安全升级。
现有的 DNS 域名解析既不加密也不支持真实性查询,因此,服务器地址的查询完全可以由第三方或您的网络运营商读取甚至修改。它们可以收集、监视、保留和共享有关设备发送的 DNS 查询类型的信息。
从今年开始,苹果平台原生支持两种加密的 DNS 协议。iOS 14 还支持自动发现 DoH (DNS over HTTPS)服务器,以便设备可以自动使用加密的 DNS 协议。如果你的网站托管有网页的内容,则可以让设备通过服务器安全地解析 DNS 查询。苹果的服务器域名将使用苹果的 DoH 服务器自动解析 DNS 查询。
关于如何开启这些协议,详情请见 Enable Encrypted DNS[7]。
另一种情况是,在 TLS 握手建立连接时,可能会暴露域名。即使是在已启用上面提到的加密 DNS 解析的情况下,TLS 会话建立时仍会显示明文的服务器名称指示(Server Name Indication,SNI)。就像 DNS 查询一样,SNI 可以被网络上的第三方嗅探到正在连接的服务器的名称。苹果目前正在与国际互联网工程任务组(Internet Engineering Task Force,IETF)合作,对加密 TLS 握手的方法进行标准化,防止第三方对流量的窥探。
更多关于 iOS 14 涉及的安全性话题,详情请见 Secure your app: threat modeling and anti-patterns[8] 和 Build an Endpoint Security app[9]。
除了给开发者提供更好的方法来请求访问他们需要的内容之外,苹果还让用户能了解应用是何时访问了哪些数据。
目前,应用商店已经要求所有的应用都必须有隐私政策。从 2020 年秋季开始,当开发者向应用商店提交应用时,需要填写一份问卷来描述你的应用是如何使用用户数据的。同时,用户能够在下载应用之前,查看到提供的这些信息。
如果您引入了任何的第三方代码,例如分析或广告 SDK,那么还需要声明它们收集的数据以及是如何使用这些数据的。请牢记,运行在应用中的 SDK 是与当前应用拥有相同的权限的。
从 iOS 11 和 Safari 11 以来,智能预防追踪(Intelligent Tracking Prevention,ITP)一直在保护用户。现在,可以从 Safari 的工具栏中看到 ITP 是如何保护用户的了。而且,还可以详细查看 Safari 在过去 30 天内阻止的所有追踪的完整报告。
在 iOS 上,用户可以复制和粘贴许多敏感信息,如密码、照片,甚至他们的信用卡号码。只有当用户希望与应用共享其剪贴板数据时,应用才应访问此信息。
在 iOS 14 中,当应用访问了在其它应用中写入的粘贴板内容时,苹果会向开发人员和用户提示这种行为。触发方式包括利用代码访问以及当用户使用键盘、菜单项或标注栏手动粘贴时。这种提示的方式可以为用户在粘贴时提供一种确认,以及警告用户当前应用可能存在过度访问粘贴板信息的情况。
当应用打开摄像头或麦克风时,状态栏中将显示一个指示灯,以提示用户当前是否有应用在录制。控制中心还将显示当前正在使用相机或麦克风的应用,或者哪个应用最近使用过它。同样地,这也适用于网页上访问相机和麦克风的情况。
只在应用需要访问权限的时候才请求访问权限。
提供足够的用户界面提示,用于明确何时以及为什么应用需要访问粘贴板或开始录制。
SDK 也是应用的一部分。如果应用中的其它 SDK 使用了粘贴板、麦克风或照相机,用户看来就是当前的应用在使用。
今年,苹果增加了对局域网内访问的控制。当应用尝试访问局域网时,比如通过 Bonjour 或 mDNS 扫描,系统将提示用户进行授权。同样地,开发者应该在应用的 info.plist 中声明所需的具体 Bonjour 服务,以便让系统知道提供怎样的信息。与之前一样,请确保提供一段描述文案来阐述为什么应用需要访问这个权限。同时,建议展示对应的 UI 提示,否则会很出人意料的。有关 iOS 14 中本地网络的更多信息,请参阅 Support local network privacy in your app[10]。
MAC 地址是一个用于网络寻址特定设备的标识符,它们并不是为了追踪设备而创建的。在 iOS 8 中,苹果引入了 MAC 地址的随机化。这虽然可以防止用户在未连接 Wi-Fi 时从 MAC 地址上被追踪,但是当用户连接到网络时,设备的物理 Wi-Fi MAC 地址会留下连接的痕迹,因为 MAC 地址不会改变。当设备在多个网络间移动并连接时,网络运营商还是可以将 Wi-Fi MAC 地址的数据组合起来,建立一个更完整的用户配置文件,其中就包含了用户去过的地方以及网络活动的详细信息。
所以,今年苹果推出了私有 Wi-Fi 地址。iOS14 将在用户加入网络时自动管理 Wi-Fi MAC 地址。这样,MAC 地址就不会绑定到用户的身份,也不能用于不同网络间的追踪。而且,每隔 24 小时,系统还将生成一个新的 Mac 地址,当用户断开并重新加入网络时会使用新的私有地址。用户可以在设备的 Wi-Fi 设置中对该功能进行调整。
NearbyInteraction 框架可以帮助搭载 U1 芯片的设备感知彼此的距离和方向信息,比如,可以用于寻找你附近的手机。在使用此框架时,不会提示访问蓝牙或网络。相反地,应用将提示当前有一个基于会话的访问。而且,只有当应用继续在前台使用时,数据才是可用的。同样地,请确保在请求用户授权时包含明确且清晰的用途说明。相关详细信息,请参阅 Meet Nearby Interaction[11]。
iOS14 中,App Clip 是让用户体验应用的一个新方式。用户在试用时,可以不用担心自己的隐私被泄漏。如果用户没有从 App Clip 升级到完整的应用,iOS 会清理所有无用的 App Clip。
苹果还专门为 App Clip 这种特殊场景设计了对位置访问足够友好的方式,以实现数据最小化。用户通过地理位置的手动确认即可,而不需要授权完整的地理位置访问权限。即使应用在特定地理位置询问系统是否 App Clip 有被调用时,也是没有额外的提示的。但是,失败的回调可能并不表示用户不在附近,有可能只是用户关闭了位置服务,或者可能拒绝允许位置的确认。开发者应该为用户提供额外的确认方式等。相关的更多信息,请参阅 Streamline your app clip[12] 和 Design great app clips[13]。
Safari 14 中,提供了 Safari 网页扩展插件这一新功能,可以让用户直接控制扩展插件及其数据的使用。用户可以选择哪些网站可以让网页扩展插件访问,并根据自己的需要进行自定义。当然,开发者应该配置请求所需的最少权限。要了解有关 Safari 网页扩展插件和隐私的更多信息,请查看 Meet Safari Web Extensions[14]。
今年,苹果将很多在 iOS 上熟悉的技术和隐私保护带到 macOS 上。比如,用户现在可以控制 macOS 应用的蓝牙访问权限。如果您使用 Catalyst 构建应用,用户还可以利用 Limited Photos Library,HomeKit(与 iOS 相同的授权模式)访问媒体、 Apple Music 以及 CNCopyCurrentNetworkInfo 信息。同样地,需要提供一个描述文案来帮助用户理解当前应用为什么需要这些数据。
通常情况下,虽然应用没有直接追踪用户的姓名,但往往是与用户相关的 UserID、IDFA、设备 ID、指纹 ID 或配置文件。当然,还是存在不需要追踪用户授权的特定场景,比如只在用户手机上就能完成的、用于反欺诈或其它安全目的的数据分享等。
出于用户本意的数据分享,可以请求 App Tracking Transparency 框架的权限进行追踪。该框架需要在 info.plist 中设置 NSUserTrackingUsageDescription 这个 key 对应请求授权时显示的描述文案。在用户不同意追踪用户时,获取到的 IDFA 会全是 0。App Tracking Transparency 框架只在 iOS 14 上可用,这就意味着,如果没有在 iOS 14 上使用这个框架,同样地,IDFA 也只会返回 0。
另外,用户可以通过 Limit Ad Tracking 这个开关选择不被任何应用询问是否授权追踪。这个开关在儿童账户和共享的 iPad 上都会处于关闭状态。
用户随时都可以关闭是否授权追踪的开关,建议在每次启动应用时调用 App Tracking Transparency 框架进行判断;
不要缓存之前获取到的 IDFA;
尝试思考在用户关闭授权追踪时,如何停止追踪。
随着追踪用户的工作方式发生重大改变,苹果提供了一个创新的解决方案,用于解决涉及用户追踪、广告归属等关键问题。对于许多开发者来说,追踪通常是为了回答诸如哪种广告活动最有效的业务问题的。目前,苹果的搜索广告归因系统(SearchAds attribution system)并不能追踪所有广告活动的用户。
现阶段的追踪是这样的。当用户单击广告时,广告 SDK 向其广告网络服务端发送一条消息,其中包含活动 ID 和与用户相关联的标识符,如 IDFA。然后,当用户安装并启动了该应用时,该应用中的广告 SDK 会发送相同的标识符来告诉广告网络服务端。广告网络服务端将这些片段组合在一起,并通知购买广告活动的开发者,某个活动发生了成功的转换。此时,如果用户拒绝追踪权限,用户 ID 将无法获取,广告网络服务端将无法知晓有关转换的任何信息。这对于传统的换算测量方法来说是一个难题。
今年,苹果对 SKAdNetwork 框架进行了重大改进,它是一个以隐私为核心的、解决有关广告表现问题的框架。它能够了解转换信息,而不需要用户的具体信息。
它的工作原理是这样的。SKAdNetwork 框架会调用设备上的 StoreKit 框架并将活动 ID 传递给它,而不是广告 SDK 直接给广告网络服务端发消息。此信息由 App Store 客户端存储,同时该客户端还会将记录应用的下载。当下载好的应用启动时,应用中的广告 SDK 需要告诉 StoreKit 它已成功启动,而后者将通知 App Store 客户端当前应用已打开。同时,转换数据会被发送给苹果,而苹果会检查是否有足够数量的用户进行了相同的转换。如果检查通过,设备将收到相应的通知,以便于将当前活动的成功转换消息发送到广告网络服务端。为了确保这些信息的完整性,加密签名贯穿始终。
如果你是以下几种情形的开发者,那你可以尝试去接入 SKAdNetwork 框架。
如果您的应用中有广告,或者您的应用在另一个应用中打广告,请选择一个支持 SKAdNetwork 的广告网络供应商,这样您就不需要提示用户进行授权,并且无论如何都能获得转换数据。
如果你是一家广告网络供应商,去 developer.apple.com 学习如何采用 SKAdNetwork 框架吧,可查看 What’s new with in-app purchase[15] 了解详情。
我们是「老司机技术周报」,每周会发布一份关于 iOS 的周报,也会定期分享一些和 iOS 相关的技术。欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2020」,领取学习大礼包。
这篇文章的内容来自于 《WWDC20 内参》。在这里给大家推荐一下这个专栏,专栏目前已经创作了 108 篇文章,只需要 29.9 元。点击【阅读原文】,就可以购买继续阅读 ~
WWDC 内参 系列是由老司机周报、知识小集合以及 SwiftGG 几个技术组织发起的。已经做了几年了,口碑一直不错。 主要是针对每年的 WWDC 的内容,做一次精选,并号召一群一线互联网的 iOS 开发者,结合自己的实际开发经验、苹果文档和视频内容做二次创作。
[1]
Use model deployment and security with Core ML : https://developer.apple.com/videos/play/wwdc2020/10152/
[2]Get models on device using Core ML Converters: https://developer.apple.com/videos/play/wwdc2020/10153/
[3]Meet the new Photos picker: https://developer.apple.com/videos/play/wwdc2020/10652/
[4]What's new in location : https://developer.apple.com/videos/play/wwdc2020/10660/
[5]Design for location privacy: https://developer.apple.com/videos/play/wwdc2020/10162/
[6]AutoFill everywhere: https://developer.apple.com/videos/play/wwdc2020/10115
[7]Enable Encrypted DNS: https://developer.apple.com/videos/play/wwdc2020/10047/
[8]Secure your app: threat modeling and anti-patterns: https://developer.apple.com/videos/play/wwdc2020/10189/
[9]Build an Endpoint Security app: https://developer.apple.com/videos/play/wwdc2020/10159/
[10]Support local network privacy in your app: https://developer.apple.com/videos/play/wwdc2020/10110/
[11]Meet Nearby Interaction: https://developer.apple.com/videos/play/wwdc2020/10668/
[12]Streamline your app clip: https://developer.apple.com/videos/play/wwdc2020/10120/
[13]Design great app clips: https://developer.apple.com/videos/play/wwdc2020/10172/
[14]Meet Safari Web Extensions: https://developer.apple.com/videos/play/wwdc2020/10665/
[15]What’s new with in-app purchase: https://developer.apple.com/videos/play/wwdc2020/10661/