iOS: allow unicast DNS-SD discovery domain

This commit is contained in:
Peter Steinberger
2025-12-17 14:14:17 +01:00
parent c4da2afb22
commit 316a04f606
6 changed files with 134 additions and 4 deletions

View File

@@ -20,8 +20,9 @@ final class BridgeConnectionController {
self.appModel = appModel
BridgeSettingsStore.bootstrapPersistence()
self.discovery.setDebugLoggingEnabled(
UserDefaults.standard.bool(forKey: "bridge.discovery.debugLogs"))
let defaults = UserDefaults.standard
self.discovery.setDebugLoggingEnabled(defaults.bool(forKey: "bridge.discovery.debugLogs"))
self.discovery.setServiceDomain(defaults.string(forKey: "bridge.discovery.domain"))
self.updateFromDiscovery()
self.observeDiscovery()
@@ -35,6 +36,10 @@ final class BridgeConnectionController {
self.discovery.setDebugLoggingEnabled(enabled)
}
func setDiscoveryDomain(_ domain: String?) {
self.discovery.setServiceDomain(domain)
}
func setScenePhase(_ phase: ScenePhase) {
switch phase {
case .background:

View File

@@ -27,6 +27,7 @@ final class BridgeDiscoveryModel {
private var browser: NWBrowser?
private var debugLoggingEnabled = false
private var lastStableIDs = Set<String>()
private var serviceDomain: String = ClawdisBonjour.bridgeServiceDomain
func setDebugLoggingEnabled(_ enabled: Bool) {
let wasEnabled = self.debugLoggingEnabled
@@ -39,13 +40,25 @@ final class BridgeDiscoveryModel {
}
}
func setServiceDomain(_ domain: String?) {
let normalized = ClawdisBonjour.normalizeServiceDomain(domain)
guard normalized != self.serviceDomain else { return }
self.appendDebugLog("service domain: \(self.serviceDomain)\(normalized)")
self.serviceDomain = normalized
if self.browser != nil {
self.stop()
self.start()
}
}
func start() {
if self.browser != nil { return }
self.appendDebugLog("start()")
let params = NWParameters.tcp
params.includePeerToPeer = true
let browser = NWBrowser(
for: .bonjour(type: ClawdisBonjour.bridgeServiceType, domain: ClawdisBonjour.bridgeServiceDomain),
for: .bonjour(type: ClawdisBonjour.bridgeServiceType, domain: self.serviceDomain),
using: params)
browser.stateUpdateHandler = { [weak self] state in

View File

@@ -26,6 +26,7 @@ struct SettingsTab: View {
@AppStorage("bridge.manual.enabled") private var manualBridgeEnabled: Bool = false
@AppStorage("bridge.manual.host") private var manualBridgeHost: String = ""
@AppStorage("bridge.manual.port") private var manualBridgePort: Int = 18790
@AppStorage("bridge.discovery.domain") private var discoveryDomain: String = ""
@AppStorage("bridge.discovery.debugLogs") private var discoveryDebugLogsEnabled: Bool = false
@State private var connectStatus = ConnectStatusStore()
@State private var connectingBridgeID: String?
@@ -132,6 +133,20 @@ struct SettingsTab: View {
TextField("Port", value: self.$manualBridgePort, format: .number)
.keyboardType(.numberPad)
TextField("Discovery Domain", text: self.$discoveryDomain)
.textInputAutocapitalization(.never)
.autocorrectionDisabled()
.onChange(of: self.discoveryDomain) { _, newValue in
self.bridgeController.setDiscoveryDomain(newValue)
}
Text(
"Default discovery domain is “local.” (mDNS on the same LAN). "
+
"For Wide-Area Bonjour / Unicast DNS-SD (e.g. over Tailscale), set a unicast DNS zone like “clawdis.internal.” and configure Tailnet split DNS accordingly.")
.font(.footnote)
.foregroundStyle(.secondary)
Button {
Task { await self.connectManual() }
} label: {
@@ -179,6 +194,7 @@ struct SettingsTab: View {
}
.onAppear {
self.localIPAddress = Self.primaryIPv4Address()
self.bridgeController.setDiscoveryDomain(self.discoveryDomain)
}
.onChange(of: self.preferredBridgeStableID) { _, newValue in
let trimmed = newValue.trimmingCharacters(in: .whitespacesAndNewlines)