用 AI Coding 打造原生 macOS 加密 DNS App:DNS Security Pro

把 iOS 產品開發經驗延伸為原生 SwiftUI 系統 DNS 管理工具,支援 DoH 與 DoT。

English繁中
用 AI Coding 打造原生 macOS 加密 DNS App:DNS Security Pro

DNS Security Pro for macOS 可以切換 DNS over HTTPS(DoH)與 DNS over TLS(DoT)profiles,並顯示目前啟用的設定。我以 SwiftUI、AppKit lifecycle 與 Apple NetworkExtension APIs 建立獨立的 macOS App,沒有透過 Mac Catalyst 移植 iOS 介面。

需求來自我開發與維護 iOS 版 DNS Security 的經驗。AI 協助整理需求、實作與修訂文件;其中最需要處理的是系統 DNS 狀態是否正確,以及 profile 套用前的驗證。

加密 DNS 保護哪一段連線

輸入網站名稱後,裝置會先透過 DNS 查詢 IP。即使網站使用 HTTPS,傳統 DNS 查詢仍可能沒有加密,讓網路路徑上的其他人看見查詢內容或干擾回應。

DoH 透過 HTTPS 傳送 DNS 查詢,DoT 則使用專用的 TLS 連線。兩者加密的是裝置到所選 resolver 之間的查詢。App 只改變系統 DNS,不會把所有流量導向 VPN,也不會隱藏 IP 或讓瀏覽自動匿名;仍須選擇信任的 DNS 供應商。

系統狀態與 profile 管理

App 支援 macOS 14 以上。Dashboard 顯示系統 DNS 狀態、目前選用的 profile,以及 Connect/Disconnect。狀態尚未載入或讀取失敗時,畫面會顯示載入或重試狀態,避免把「讀不到」誤報成「已停用」。

NEDNSSettingsManager 負責套用系統 DNS 設定,涵蓋 Wi-Fi、Ethernet 等網路介面,不會建立傳統 VPN tunnel。

內建 profiles 包含 Cloudflare、Google Public DNS、Quad9 與 AdGuard DNS,依供應商支援的協定提供 DoH 或 DoT。內建資料維持唯讀;只有自訂 profiles 可以編輯或刪除。

新增自訂 profile 時,App 會檢查:

  • DoH endpoint 必須是有效的 https:// URL。
  • DoT 必須包含 TLS server name 與至少一個 bootstrap IP。
  • 每個 bootstrap IP 都必須是有效的 IPv4 或 IPv6。
  • 名稱與協定都相同的重複 profile 不能儲存。

自訂資料以 JSON 存在使用者的 Application Support 目錄,不需帳號,也不會上傳設定到遠端服務。

啟用 menu bar control 後,可以直接查看狀態、切換 profile、連線、斷線或重新整理。關閉 App 不會停用已安裝的系統 DNS 設定;要恢復一般系統 DNS,須在 App 裡選擇 Disconnect。

Dashboard、DNS Profiles、Tutorial、Settings 與 About 都有英文及繁體中文介面。初次連線需要系統核准時,Tutorial 會引導至「系統設定 → 網路 → VPN 與過濾器 → DNS Security Pro」。

先定義 AI 實作需要遵守的規則

我依照這些條件檢查架構、功能與錯誤狀態:

  1. 使用獨立的原生 macOS 專案。
  2. 由單一 service 寫入系統 DNS,避免 views 各自管理狀態。
  3. 內建 profiles 唯讀,只有自訂資料能編輯或刪除。
  4. 儲存前驗證 DoH endpoint、DoT 設定與 bootstrap IP。
  5. 讀不到系統狀態時,不能顯示「DNS 已停用」。
  6. UI、錯誤訊息、Tutorial 與 README 使用一致的系統設定路徑。

在這些條件下,AI 協助拆分 SwiftUI screens、建立 profile model、整理本機儲存、補上多語系字串,以及執行建置與靜態檢查。每輪修改都依照上述規則確認。

程式碼的責任分配如下:

  • DNSProfile:資料模型與輸入驗證。
  • DNSProfileRepository:自訂 profiles 與本機選擇的保存。
  • SystemDNSManager:唯一修改 macOS DNS preferences 的元件。
  • AppModel:協調 UI 狀態、profile 切換與錯誤處理。
  • SwiftUI views:Dashboard、profile 管理、Tutorial 與 menu bar 介面。

建置並啟用 macOS 版本

原始碼在 GitHub repository。開啟 DNSSecurityProMac.xcodeproj,選擇 DNS Security Pro macOS scheme 建置。

  1. 在 DNS Profiles 選擇內建 resolver,或新增自訂 DoH/DoT profile。
  2. 回到 Dashboard,按下 Connect。
  3. 若 macOS 要求核准,前往「系統設定 → 網路 → VPN 與過濾器 → DNS Security Pro」完成授權。
  4. 回到 App 重新整理狀態;綠色盾牌與「Encrypted DNS is active」代表設定已啟用。

安裝系統 DNS 設定需要 Network Extension 的 dns-settings entitlement。自行簽署與散布版本的開發者,需使用具備對應 capability 的 Apple Developer Team 與 provisioning profile。原始碼採 MIT License;產品名稱、logo 與 App icon 不在該授權範圍內。

iPhone 與 iPad 版本

兩個 iOS 版本同樣使用 Apple 的系統 DNS 功能提供 DoH/DoT,不會為了加密 DNS 而把其他流量送往 App 自己的 VPN server。

DNS Security 提供免費的加密 DNS 基本功能,可透過 App 內購買解鎖自訂 DNS、Wi-Fi SSID 規則與自動化功能。

DNS Security Pro 採付費下載,包含自訂 DoH/DoT profiles、Wi-Fi SSID 啟用與停用規則、內建 profiles 更新,以及 Shortcuts 或 URL schemes 快速切換。