仅在启动时使用代理快照的传输在网络或位置发生变化后可能仍保留旧状态。对于 macOS SystemConfiguration 订阅,请明确维持这一生命周期:

  1. 创建一个带回调的 SCDynamicStore 会话。
  2. 使用 SCDynamicStoreSetNotificationKeys 注册精确的键或模式。它们是两个独立的数组。全局代理键是 State:/Network/Global/Proxies;仅在传输使用服务专属输入的地方添加这些输入。
  3. 通过 SCDynamicStoreSetDispatchQueue 或合适的 run-loop 源来安排回调投递。只注册名称并不会运行回调。
  4. 收到通知后,重新读取生效配置并更新后续工作。变更键列表本身并不是完整的新策略。
  5. 关闭时,在释放所持有的资源之前,用空队列停用投递。在此之前保持存储和回调上下文存活。

Apple 的头文件将空的变更键列表定义为动态存储服务器重启。在这种情况下也要刷新相关状态,并丢弃基于先前内容的假设。

这是一种公开的 macOS API 做法。Apple 的头文件将相应函数标记为 iOS 的私有 SPI,因此同一订阅并不是公开的 iOS 应用接口。

相关文章