
博客 · · 更新于 · 作者:Matt Senter
窗口后方的雨,无需屏幕录制权限
Weatherling 无需屏幕录制或其他权限,就能让雨落在窗口后方。它从不查看屏幕内容,而是使用 macOS 向所有应用公开的窗口轮廓,并在无网络访问权限的 Apple App Sandbox 中运行。
这听起来可能难以置信。看到雨滴落在标题栏、沿侧边流下,再钻到前方窗口背后,您自然会好奇应用如何知道屏幕上有什么。简短的回答是:它不知道。它只知道物体的位置,而这已经足够绘制雨景。
窗口几何信息,而非窗口内容
每个 Mac 应用都能向 macOS 请求当前屏幕窗口列表。Weatherling 使用的接口是CGWindowListCopyWindowInfo,窗口管理器和截图工具也从这个公开接口开始。它只读取每个窗口的以下五项信息:
- 边界。 窗口的位置和大小。
- 层级。 判断是普通窗口、菜单,还是系统界面的一部分。
- 透明度。 判断窗口实际可见,还是完全透明。
- 窗口编号。 用来跟踪移动窗口的标识符。
- 所属进程 ID。 一个数字,仅用于区分 Weatherling 自己的窗口与您的窗口。
列表按从前到后排列,这也是关键。当雨滴经过前方窗口边缘、落在更后面的窗口上时,只需继续检查列表中的下一个轮廓。因此,无需看到任何一个窗口的像素,雨也能出现在一个窗口前方、另一个后方。
同一列表还提供窗口标题、所属应用名称和共享状态。Weatherling 从不读取这些字段。雨景用不到它们,不读取也是无需权限的原因之一。
为什么读取窗口标题需要屏幕录制权限
从 macOS Catalina 起,其他应用的窗口标题被视为屏幕内容。标题可能包含邮件主题、文档名或正在阅读的网页,因此 macOS 只向获准屏幕录制的应用提供标题。没有权限时,标题字段返回空值。
这条界线决定了整个设计。如果应用想针对邮件和代码编辑器采取不同行为,就需要标题或屏幕捕获,并必须请求权限。Weatherling 不关心窗口是什么,只关心它在哪里,因此无需权限提示。也不请求辅助功能权限,因为它不读取其他应用内部信息,不控制它们,不监控键盘、不访问输入、不执行自动化。
在沙盒中运行,只声明必要权限
Mac App Store 应用运行于 Apple App Sandbox,通过权限声明申请额外能力,例如网络、摄像头或容器外文件访问。Weatherling 声明了com.apple.security.app-sandbox 和com.apple.security.files.user-selected.read-write。后者允许将积分卡片保存到您在“存储”对话框中选择的文件。(Apple 签名还会为每个 App Store 应用加入应用与团队标识符,这些不授予额外能力。)
没有声明的能力同样重要。未获网络客户端权限的沙盒应用无法建立传出连接,因此 Weatherling 不发出网络请求是由 macOS 强制执行的,不只是文字承诺。没有账号、分析或崩溃报告服务。雨势、风力等设置保存在 Mac 上应用自身的沙盒存储中。
雨声也是如此。录音随应用打包,通话时会淡出。Weatherling 通过检查是否有应用正在使用麦克风来识别通话,macOS 只报告设备的“是/否”状态。它从不打开麦克风、录制音频或请求麦克风权限。
亲自验证
无需只凭信任。以下三项检查约花一分钟:
- 打开“系统设置 > 隐私与安全性 > 屏幕录制”(新版 macOS 中称为“屏幕与系统音频录制”)。Weatherling 不在列表中,因为它从未申请。
- 在同一区域检查“辅助功能”和“麦克风”,它也不在这两个列表中。
- 在终端运行
codesign -d --entitlements - /Applications/Weatherling.app。除了 Apple 为所有 App Store 应用加入的应用和团队标识符外,权限只有 App Sandbox 和用于保存积分卡片的用户所选文件访问,没有网络权限。
如果未来版本需要更多权限,您会先看到提示。macOS 不允许应用悄悄获取这些能力。
跟踪窗口需要多少资源
读取窗口列表开销很小。窗口静止时,Weatherling 约每秒查询十次;移动时会暂时提高频率,让水流跟上拖动的窗口。两次查询间只保留轮廓,窗口关闭时即清除。
桌面装饰不应让您在隐私上妥协。开启雨景,调好氛围,继续原来的事情。Weatherling 无需知道您在做什么。
无需安装即可在这里体验:首页,可拖动窗口展示同样构想的浏览器版本。应用存储与不存储哪些信息,请见隐私政策;为什么值得营造这样的雨景,请见为什么桌面雨景会让人平静.