← 所有文章

自律 App 能看到你手机里装了什么、用了什么吗?

在 iPhone 上,一个建立在苹果屏幕时间框架上的屏蔽应用,看不到你选了哪些 App。 这不是政策问题,而是架构问题:你点的那个选择器是 iOS 画的,回传给应用的是一组不透明令牌——封好的句柄,里面没有名字、没有 bundle ID、没有图标。应用可以把令牌交回系统去升起一道屏蔽,但它打不开这个令牌,也拿不到你的分应用用量。这是极少数你不必凭信任接受的隐私说法之一,而且值得在装任何东西之前先弄明白。

iPhone 的设置页面,正显示屏幕时间相关的选项

你在屏蔽 App 里点“选择应用”的时候,到底发生了什么?

几乎没有一件事和你想的一样。

每一个正经的 iPhone 屏蔽应用,都建立在三个苹果框架上:FamilyControls 负责授权和选择,ManagedSettings 负责那道屏蔽,DeviceActivity 负责时间表和阈值。流程是这样的:

  1. 应用申请屏幕时间授权。你用面容 ID 或密码同意——一次看得见的授权。
  2. 应用弹出一个选择器。关键在于,这个选择器不是应用画的,它是一个系统视图。你的 App 列表由 iOS 在一道第三方应用读不过去的边界后面渲染出来,开发者提供的是外面那个框,框里的东西一概不归他。
  3. 你选完,关掉选择器。应用收到的是一个 FamilyActivitySelection:一袋令牌。

第三步是直觉断裂的地方。感觉上你把一份名单交给了这个应用。你没有。你把名单交给了 iOS,而 iOS 递给应用的是一叠取件凭条。

说人话,不透明令牌到底是什么?

想象寄存处的号码牌。它精确对应一件外套,也让你能对这件外套采取行动——把牌交回去,外套就取出来。但这张牌本身什么都没说:不说颜色,不说牌子,也不说是谁的。

ApplicationToken 就是这么工作的。应用可以把它交给 ManagedSettings屏蔽这个,交给 DeviceActivity这个用满十五分钟的时候通知我,可以数一数自己手里有几个,也可以存下来明天照样施加同一道屏蔽。它没法把令牌变成名字、图标、bundle ID 或者一个用量数字。令牌还有作用域:你手机上同一个 App,在另一个屏蔽应用里会得到一个不同的令牌,所以没法被拿来在不同服务之间关联到你。

可我的屏蔽 App 明明显示了 App 名字和图标,这怎么解释?

这是最能让人觉得“隐私说法只是营销”的一个反问,而答案相当漂亮。SwiftUI 提供了一个 Label 视图,它接受一个令牌,然后在屏幕上渲染出正确的 App 名字和图标,整个过程发生在一个由系统控制的视图里。像素出现在应用的界面上,而底下那个字符串从来没有进入应用的代码,无法被记录,也无法被发送到任何地方。

所以你看到的是小红书,开发者的代码看到的是一个指向它的、读不开的令牌。两件事同时为真。这就是一扇窗和一份复印件之间的区别。

屏蔽应用能看到什么,永远看不到什么?

它能看到它永远看不到
你授予了屏幕时间授权你选了哪些 App,无论是名字还是 bundle ID
你选了几个 App、几个类别、几个域名任何一项选择的图标或所属类别
它注册的某个阈值被跨过了每个 App 的精确分钟数,或分应用的使用历史
某道屏蔽被施加或被解除了你在任何一个 App 里做了什么
你在这个应用里自己输入的东西:目标、笔记、设置你的浏览记录、聊天消息或网络流量

正确的心理模型是:这个屏蔽应用眼睛看不见,手里握着一个开关。它知道开关被扳动过,也大致知道它自己设的那个计数器上累积了多少时间。墙那边是什么,它不知道。

为什么第三方屏幕时间 App 的数字只能是估算?

这来自同一套设计,也是隐私红利诚实的另一面。屏蔽应用拿不到一个实时的分钟计数器。它向 DeviceActivity 注册的是阈值——在这个时间区间里,选中的这些 App 用满五分钟时通知我——iOS 在阈值被跨过时回调它,所以用量是从“哪些阈值已经触发”反推出来的。另外 iOS 统计的是一个时间区间内的累计用量,不是按单次算的,所以对第三方应用来说,根本不存在一个干净的“这一次”的概念。

任何一个在 iPhone 上给出秒级、分应用精度的应用,要么用的是苹果自己的设备端报告扩展(它被沙盒得极严,那份数据送不出去),要么是通过某条值得你追问一句的路径拿到的这些数字。粗糙的数字是好隐私模型的症状,不是 bug。

为什么有些 App 要你装 VPN 或者描述文件?

因为它们在做 FamilyControls 做不到的事——而这里,信任的账才真的变了。

VPN 或内容过滤描述文件。 屏蔽网站必须拦截浏览器请求,而苹果的应用屏蔽伸不进 Safari 的流量里。一个 VPN 配置会把你的网络活动导过一层过滤器,那层过滤器可以检查你访问了哪些域名。同时覆盖 Windows、安卓和 iOS 的跨平台工具一般都得这么做,因为苹果的框架只存在于苹果的平台上。它有效,也正当,但这是一个根本上大得多的暴露面:运行那层过滤器的一方有可能看到你去了哪里

配置描述文件或 MDM 描述文件。 这是为公司和学校自有设备设计的设备管理载荷。取决于载荷内容,一份描述文件可以强制用户无法移除的限制,并暴露关于这台设备的大量信息。一个消费级应用要求个人用户安装它,是在索取一种从未为这种关系设计过的东西。

两者都不是天然可疑的——家长控制类产品,或者一个必须覆盖工作电脑的屏蔽工具,可能真的别无选择。但你要清楚自己在做哪一笔交易:基于 FamilyControls 的屏蔽应用在结构上就学不到关于你的多少东西,而基于 VPN 的屏蔽应用是在请求你信任它。

一个前提要说明:这是一篇讲 iOS 的文章。在安卓上,屏蔽类应用通常依赖无障碍服务和 UsageStatsManager,这两者都会明文交出包名和分应用用量。不透明令牌这个保证是苹果平台的属性,不会平移过去。

“我在医院上班,手机里一半东西都是工作——科室群、排班表、值班安排。我一直默认这类专注 App 在悄悄给我建档,所以从来没装过。让我改主意的是搞清楚那个选择器到底怎么工作:应用看不到我的选择,因为 iOS 压根没给过它。这和一份隐私政策是完全不同性质的承诺。” —— 莫琳,医院临床药师,38 岁

怎么评估一个屏幕时间类 App 的隐私说法?

一份五分钟就能跑完的清单,适用于这个品类里的任何应用:

  1. 它申请了哪些权限? 只要屏幕时间授权,是一次窄而清晰的授权。VPN 描述文件、配置描述文件、无障碍权限或者完整的网络访问,每一个都会显著放大它。多问一句:这项额外权限换来了什么?
  2. 用屏蔽功能必须注册账号吗? 如果你必须先登录才能屏蔽一个 App,说明有状态被送到了别处。这未必有问题——同步就需要它——但这是一个选择,不是必需。
  3. 它的数字有多精确? 在 iOS 上,精确到分钟的分应用图表是一个该去细看的信号,而不是一个该被奖励的功能。
  4. 读一读 App Store 的隐私标签,特别是与你关联的数据那一栏。统计分析和崩溃报告是正常的;和身份绑在一起的使用数据,或者被列在“用于跟踪你的数据”(英文原文 Data Used to Track You)下面的任何东西,就是另一回事了。
  5. 看它关于第三方的条款。 广告 SDK 和归因合作方,是行为数据从一个本来做得不错的应用里流出去的现实路径。
  6. 问一句:这家公司哪天没了会怎样? 设备端模型退化成“这个应用不能用了”;云端模型意味着你的历史记录躺在某一笔收购里。

如果你想横向比较,重点不是谁的界面好看,而是上面这六项里,各家分别站在哪一边。

Unscrol 能帮上什么?

先说老实话:你 iPhone 上最私密的屏幕时间工具,是苹果已经装好的那一个。 “屏幕时间”(iOS 18 及更早的系统里叫“屏幕使用时间”)、App 限额和停用时间不涉及任何第三方,一分钱不花,而且一切都留在苹果自己的系统里。如果一段停用时间加上一个由伴侣保管的密码就能解决你的问题,那就是正确答案,读到这里可以停了。

Unscrol 是给“苹果那个限额页面已经改变不了任何事”这种情况准备的 iPhone 和 Apple Watch 应用——它建在上面描述的那道边界里面,而不是绕着它走。

Unscrol 的屏蔽面板,显示今天的时间表和被屏蔽的游戏、娱乐、社交三个类别

你选两个数字,一个每日总量和一个单次上限,两个都由 iOS 执行:用掉相当于一次会话的那一块预算,你选中的 App 锁定 15 分钟;把整天的预算用完,它们锁到明天。可按时间段排的护盾覆盖睡眠或工作这类时段,而在时段中途把它关掉是刻意做慢的——一段呼吸练习加一段等待,不是一键取消。

具体到隐私:Unscrol 只申请屏幕时间授权,别的什么都不要。没有 VPN。没有配置描述文件。你看到的选择器是系统的,应用收到的只有不透明令牌,所以它读不到你选了哪些 App、它们的名字和图标,也读不到你的分应用用量。屏蔽名单和用量数据由 iOS 在设备上处理,从不会到达 Unscrol 的服务器。代价在应用里也写明了:用量数字是从跨过的阈值推出来的估算,不是秒表——因为这套架构能产出的就只有这种数字。下载免费;可选的高级版增加了漏掉一天时能用的连续记录守护,以及同时进行 5 个挑战(免费版 1 个)。

常见问题

屏蔽类 App 能看到我屏蔽了哪些 App 吗?

在 iOS 上,看不到。建立在苹果 FamilyControls 框架上的屏蔽应用,从来不会拿到 App 的身份。你选 App 时点的那个选择器是系统画的,不是这个应用画的;回传给它的是一组不透明令牌——一种封好的句柄,它可以把令牌交回 iOS 去施加屏蔽,却没有任何办法把令牌解开成名字、bundle ID 或图标。它只知道你选了几个,完全不知道那是什么。这是操作系统强制的,不是一份隐私政策里的承诺。

苹果屏幕时间 API 里的不透明令牌是什么?

不透明令牌是一个没有含义的引用,代表你选中的某个 App、某个网站域名或某个类别。苹果的 FamilyControls 框架签发它,好让第三方应用能对你的选择采取行动,却始终不知道这个选择是什么。这个令牌可以交回给 iOS,用来屏蔽某个 App 或者注册一个使用阈值,仅此而已。令牌还有作用域:同一个 App 在不同的应用里会产生不同的令牌,所以没法拿它在不同服务之间把你关联起来。

为什么有些屏蔽类 App 要你装 VPN 描述文件?

通常是因为它要屏蔽网站,或者要跨平台覆盖 Windows 和安卓,而苹果的屏幕时间框架在那些系统上并不存在。把流量导过一层过滤器,是拦截浏览器请求的唯一办法。这是一种正当的技术手段,但它要求的信任比设备上的屏蔽大得多:运行那层过滤器的一方,有可能看到你请求了哪些域名。任何要求个人用户安装配置文件或管理描述文件的消费级应用,也是同样的道理——那套技术本来是给公司自有设备设计的。

怎么判断一个屏幕时间类 App 是不是真的注重隐私?

看它要什么权限,以及它给你看什么。一个只申请屏幕时间授权、不要 VPN、不要配置文件、不要辅助功能权限的应用,在结构上就学不到多少东西。再看两件事:不注册账号能不能直接用屏蔽功能;以及 App Store 的隐私标签里,与你关联的数据那一栏写了什么。另外,对 iOS 上精确到分钟的分应用图表要保持怀疑——那种细致程度通常意味着数据被送到了操作系统保护不到的地方。