From f8b1d68d491cc22f4297075ea1f77319ab910bc1 Mon Sep 17 00:00:00 2001 From: Michael Uray <25169478+MichaelUray@users.noreply.github.com> Date: Thu, 16 Apr 2026 05:49:01 +0000 Subject: [PATCH] fix: change ForceRelay default from true to false The default was set to true as a workaround for P2P stability issues on iOS. Now that the underlying ICE issues are fixed upstream (netbirdio/netbird: guard loop fix, candidate buffering, network address discovery), P2P connections work reliably and should be enabled by default. P2P connections are more efficient than relay for both performance and battery life, making the previous "battery optimization" rationale for forcing relay incorrect. Users who have explicitly toggled this setting will not be affected as their preference is persisted in UserDefaults. --- NetBird/Source/App/ViewModels/MainViewModel.swift | 8 +------- NetBirdTests/SharedUserDefaultsTests.swift | 6 +++--- NetbirdKit/EnvVarPackager.swift | 8 +++----- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/NetBird/Source/App/ViewModels/MainViewModel.swift b/NetBird/Source/App/ViewModels/MainViewModel.swift index eb7930a..503ee05 100644 --- a/NetBird/Source/App/ViewModels/MainViewModel.swift +++ b/NetBird/Source/App/ViewModels/MainViewModel.swift @@ -108,7 +108,7 @@ class ViewModel: ObservableObject { UserDefaults.standard.synchronize() } } - @Published var forceRelayConnection = true + @Published var forceRelayConnection = false @Published var showForceRelayAlert = false @Published var connectOnDemand = false @Published var showOnDemandAlert = false @@ -616,14 +616,8 @@ class ViewModel: ObservableObject { func getForcedRelayConnectionEnabled() -> Bool { let userDefaults = UserDefaults(suiteName: GlobalConstants.userPreferencesSuiteName) - #if os(iOS) - userDefaults?.register(defaults: [GlobalConstants.keyForceRelayConnection: true]) - return userDefaults?.bool(forKey: GlobalConstants.keyForceRelayConnection) ?? true - #else - // forced relay battery optimization not need on Apple Tv userDefaults?.register(defaults: [GlobalConstants.keyForceRelayConnection: false]) return userDefaults?.bool(forKey: GlobalConstants.keyForceRelayConnection) ?? false - #endif } func setConnectOnDemand(isEnabled: Bool) { diff --git a/NetBirdTests/SharedUserDefaultsTests.swift b/NetBirdTests/SharedUserDefaultsTests.swift index c3c60bb..fef2620 100644 --- a/NetBirdTests/SharedUserDefaultsTests.swift +++ b/NetBirdTests/SharedUserDefaultsTests.swift @@ -51,11 +51,11 @@ final class SharedUserDefaultsTests: XCTestCase { XCTAssertFalse(value, "Login required flag should be false after clearing") } - func testForceRelayConnectionDefaultsToTrue() throws { + func testForceRelayConnectionDefaultsToFalse() throws { let defaults = try XCTUnwrap(userDefaults) defaults.removeObject(forKey: GlobalConstants.keyForceRelayConnection) - defaults.register(defaults: [GlobalConstants.keyForceRelayConnection: true]) + defaults.register(defaults: [GlobalConstants.keyForceRelayConnection: false]) let value = defaults.bool(forKey: GlobalConstants.keyForceRelayConnection) - XCTAssertTrue(value, "Force relay connection should default to true") + XCTAssertFalse(value, "Force relay connection should default to false") } } diff --git a/NetbirdKit/EnvVarPackager.swift b/NetbirdKit/EnvVarPackager.swift index 817d6e2..3a8487f 100644 --- a/NetbirdKit/EnvVarPackager.swift +++ b/NetbirdKit/EnvVarPackager.swift @@ -14,12 +14,10 @@ class EnvVarPackager { return nil } - #if os(iOS) - let defaultForceRelay = true - #else - // Forced relay battery optimization not needed on Apple TV + // P2P connections are more efficient than relay for both performance + // and battery life. The previous default of true was a workaround for + // ICE stability issues that have since been fixed upstream. let defaultForceRelay = false - #endif defaults.register(defaults: [GlobalConstants.keyForceRelayConnection: defaultForceRelay]) let forceRelayConnection = defaults.bool(forKey: GlobalConstants.keyForceRelayConnection)