Show HN:自动关闭 Mac OS "允许<应用>在本地网络中查找设备?"

Hacker News Top 工具

摘要

Show HN 介绍开源工具 dontallow,一个用 Swift 编写的 macOS 代理,可自动点击拒绝反复出现的"允许应用在本地网络中查找设备"提示,并支持暂停、允许列表和规则解码等功能。

这个弹窗困扰我很多年了。我几乎从不想允许这个权限,而且没有任何系统设置可以全局禁用它、防止弹窗打断你打字等操作。我用 Swift 写的这个小应用可以在四分之一秒内自动关闭它,并留下一条小通知告诉你它已经这么做了。非常期待听到大家的反馈!
查看原文
查看缓存全文

缓存时间: 2026/10/30 03:10

johncassil/dontallow

来源:https://github.com/johncassil/dontallow

dontallow

自动关闭 macOS 弹窗:

允许“Google Chrome“查找本地网络上的设备吗? 这将允许该 App 发现、连接你网络上的设备并收集相关数据。

它会在不到一秒的时间内替你点击不允许。空闲时 CPU 占用为零,重启后依然有效。仅两个简短的 Swift 文件,无任何依赖。

为什么会有这个项目

macOS(Sequoia 及更高版本)会在 App 首次访问本地网络时弹出此提示。这个决定本应被记住。但对很多 App 来说并没有,于是每次启动都会再次弹窗,而且往往是那些你根本没在用的 App:

  • Chromium 系浏览器(Chrome、Brave、Edge、Island、Arc)在启动时会把自身的应用包拷贝到一个随机临时目录,以便代码签名在原地更新后仍然有效。macOS 将本地网络权限的决定绑定到那个随机路径,因此下次启动时系统会认为这是一个全新的 App。你的隐私设置里会不断堆出重复的“Google Chrome.app“条目,而这些条目早已指向不存在的位置。
  • 安装路径带版本号的 App(任何安装到 .../versions/1.2.3/ 路径下的 App),每次更新都会新增一行。
  • 弹窗归属错误。 macOS 会把对话框归到它认为“应负责“的那个 App 上,所以你会看到一些根本没在运行的 App 的提示。
  • 确实有 App 合法使用该权限:浏览器和媒体播放器中的 Chromecast 与 AirPlay 发现、游戏的局域网联机、打印机和扫描仪工具。如果你用这些功能,就为该 App 选择允许(操作期间可以用 dontallow pause 10m 暂停),只要该 App 的路径保持稳定,选择就会一直有效。如果你从不使用这些功能,就永远不需要被打扰。

目前没有官方支持的方法来清理这个列表,没有 MDM 配置描述文件可以预先拒绝该权限,tccutil reset 也不覆盖它。所以:让一个小代理来替你回答“不“。

安装

sh brew install johncassil/tap/dontallow # 或者:make && make install dontallow install

dontallow install 会写入一个按用户的 launchd 代理、启动它、打开“系统设置 > 隐私与安全性 > 辅助功能“,如果 macOS 没有自动弹出提示,它会打印需要添加的确切路径。辅助功能权限是让它能够点击按钮的权限。它会等待你完成授权,并在代理激活后进行确认。任何时候缺少授权,dontallow status 都会重复这些说明。

使用

命令作用
dontallow status查看代理状态、暂停状态、允许列表、最近的关闭记录
dontallow pause [1h]暂时不管弹窗(30m、2h、1d、forever)
dontallow resume恢复关闭弹窗
dontallow rules解码系统的本地网络规则存储,显示每条隐私记录实际对应什么,包括孤立条目
dontallow uninstall停止并移除代理
dontallow run --dry-run前台运行,记录它将要执行的操作,但不实际点击

每次关闭弹窗都会发送一条通知,标明 App 名称和对应的 pause 命令,因此你无需记住如何关闭它。如果不想看到通知,可在系统设置中静音。

当某个 App 确实需要本地网络访问时

三个方案,任选其一:

  • dontallow pause 10m,然后启动该 App 并自己点击允许。
  • 把该 App 的名称添加到 ~/.config/dontallow/allowlist(每行一个,不区分大小写的子串匹配)。它的弹窗将永远不会被处理。
  • 在“系统设置 > 隐私与安全性 > 本地网络“中切换开关。被关闭的弹窗会记录为拒绝,你可以在那里撤销。

如果希望在代理执行前留出点击允许的时间窗口,可将 ~/.config/dontallow/grace 设置为秒数(默认为 0.25)。

工作原理

弹窗是一个由系统进程 UserNotificationCenter 拥有的窗口。dontallow 在该进程上为窗口创建注册一个辅助功能观察器,然后休眠直到有事件触发。它读取对话框文本,确认这是一个本地网络提示而非其他内容,检查暂停状态和允许列表,然后对不允许按钮执行辅助功能的按下操作。如果按下操作被拒绝,它会回退到在按钮位置进行合成点击。

它从不修改系统文件,从不禁用保护机制,也从不选择允许。

企业托管的 Mac

本地网络权限无法通过 MDM 预先设置,但辅助功能可以。对于设备集群:只需构建一次,用 Developer ID 签名,分发二进制文件加一个 PPPC(隐私偏好策略控制)配置描述文件以授予其代码签名要求对应的辅助功能权限,然后每个用户运行一次 dontallow install。无需手动操作“设置“。

升级之后

macOS 将辅助功能授权绑定到二进制文件的代码签名上,而每次构建(包括 brew upgrade)都会生成新的签名。升级后运行 dontallow status。如果提示授权缺失,在辅助功能设置中移除 dontallow 条目,然后按照它打印的路径重新添加。代理会在十秒内自动重新挂载。未来使用 Developer ID 签名的版本将免除这一步骤。

测试

sh make test

单元测试覆盖纯逻辑部分(对话框文本解析、时长与暂停解析、允许列表匹配、launchd plist 生成,以及针对固定夹具存档的本地网络规则解码器)。它们使用普通的 swiftc 构建,无需 Xcode 或 SwiftPM。端到端流程(真实弹窗、真实点击)只能在已授予辅助功能权限的 Mac 上验证;手动测试步骤见 Tests/INTEGRATION.md。

兼容性

  • 仅使用 Apple 的 Command Line Tools 即可构建,无需 Xcode。
  • Apple Silicon 与 Intel:Homebrew 会在各自平台上原生编译。
  • 构建需要 macOS 13 或更高版本;弹窗本身仅存在于 macOS 15 Sequoia 及更高版本。
  • 目前已测试:Intel、macOS 26.6。欢迎反馈其他版本的情况。
  • 目前仅支持英文版 macOS。匹配器依赖对话框文本和“不允许“按钮标题,本地化字符串已在计划中。

许可证

MIT

相似文章

@Manorgw: 每台设备都得单独配代理,烦不烦?OpenSurge for Mac 或许能省掉这堆活儿。 它能将 Mac 变成局域网里的透明代理网关,手机、电视、游戏机等设备接进来后,基本不用再一台台折腾。 ① 旁路由、DHCP 接管、独立下游 LAN,…

X AI KOLs Timeline

OpenSurge for Mac 可将 Mac 变成局域网的透明代理网关,支持旁路由/DHCP 接管/独立下游 LAN 三种模式,可直接导入 Mihomo 配置与订阅,并自带 Web GUI 管理每台设备的分流规则,免去逐台设备配置代理的麻烦。

Assist

Product Hunt

Assist 是一款在 Product Hunt 上发布的 macOS 会议助手,隐藏在 MacBook 刘海区域,可监听会议并实时建议回复,在屏幕共享时不可见,并支持完全在本地 Mac 上运行以保护隐私。