macos需通过轮询或日志监听捕获网络变化,再用terminal-notifier发送结构化通知,并以launchd实现开机自启与后台常驻,辅以点击跳转设置、网络类型识别和静音时段过滤提升实用性。
macos 本身不提供“自动推送网络状态变化”的原生系统通知流,但你可以通过组合系统能力与轻量工具,构建一个响应网络切换、连接中断或 ip 变更等事件的智能通知提示流。关键在于:捕获网络状态变化 + 触发终端通知 + 保持低侵入、可维护。
监听网络状态变化的核心方法
macOS 没有内置的网络事件钩子,但可通过以下两种稳定方式感知变化:
-
watch-network.sh 脚本轮询:用
networksetup -getinfo或ipconfig getifaddr en0检查主接口状态,配合ping -c1 1.1.1.1 &>/dev/null验证连通性,每5–10秒执行一次(适合大多数桌面场景) -
使用 networksetup 的通知机制:运行
networksetup -listallhardwareports获取接口名后,监听system_profiler SPNetworkDataType输出差异,或结合launchd监控/private/var/log/system.log中 “network changed” 类日志(需开启详细网络日志)
用 terminal-notifier 发送结构化通知
这是最直接、无需开发的方案。先确保已安装:
brew install terminal-notifier
在检测到网络变化时,调用如下命令生成带上下文的通知:
- 连接恢复:
terminal-notifier -title "✅ 网络已恢复" -subtitle "$(ipconfig getifaddr en0)" -message "Wi-Fi 已重连,延迟正常" - 断开提醒:
terminal-notifier -title "⚠️ 网络中断" -message "当前无互联网连接,请检查 Wi-Fi 或以太网" - IP 变更(如从 DHCP 切换):
terminal-notifier -title "? IP 地址更新" -subtitle "$(hostname)" -message "en0 新地址:$(ipconfig getifaddr en0)"
让通知流持续运行且开机自启
避免手动运行脚本,推荐用 launchd 实现后台常驻:
- 新建
~/Library/LaunchAgents/local.networkwatcher.plist - 配置
StartInterval为 10(每10秒检查一次),并设置RunAtLoad为true - 脚本路径指向你存放检测逻辑的 shell 文件(例如
~/bin/check-network.sh) - 加载服务:
launchctl load ~/Library/LaunchAgents/local.networkwatcher.plist
增强实用性的小技巧
让通知不只是“弹一下”,而是真正有用:
- 点击通知打开网络设置:
terminal-notifier -message "点击进入网络偏好设置" -activate com.apple.systempreferences -execute 'open -b com.apple.systempreferences "/System/Library/PreferencePanes/Network.prefPane"' - 区分网络类型:用
networksetup -getinfo Wi-Fi | grep "IP address"判断是否为 Wi-Fi;用route get default | grep interface区分 en0/en1,避免误报 - 静音时段跳过:在脚本中加入时间判断,例如
[[ $(date +%H) -ge 22 || $(date +%H) -lt 7 ]] && exit 0,夜间不打扰











