Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 67 additions & 67 deletions NetBird.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -133,10 +133,10 @@
50E608132A7958B100BAF09B /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608122A7958B100BAF09B /* MainViewModel.swift */; };
50E608242A79966600BAF09B /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608232A79966600BAF09B /* AboutView.swift */; };
50E608262A79968500BAF09B /* AdvancedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608252A79968500BAF09B /* AdvancedView.swift */; };
55472AC52F59E3C000382947 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 55472AC42F59E3C000382947 /* GoogleService-Info.plist */; };
55472AC62F59E3C000382947 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 55472AC42F59E3C000382947 /* GoogleService-Info.plist */; };
55472AC72F59E3C000382947 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 55472AC42F59E3C000382947 /* GoogleService-Info.plist */; };
55472AC82F59E3C000382947 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 55472AC42F59E3C000382947 /* GoogleService-Info.plist */; };
5573F6EE2F9F523D00E63A73 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5573F6ED2F9F523D00E63A73 /* GoogleService-Info.plist */; };
5573F6EF2F9F523D00E63A73 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5573F6ED2F9F523D00E63A73 /* GoogleService-Info.plist */; };
5573F6F02F9F523D00E63A73 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5573F6ED2F9F523D00E63A73 /* GoogleService-Info.plist */; };
5573F6F12F9F523D00E63A73 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5573F6ED2F9F523D00E63A73 /* GoogleService-Info.plist */; };
55B5E81B2F39158200852AA7 /* InternetStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B5E81A2F39158200852AA7 /* InternetStatusView.swift */; };
55D865852F70982000A2EFF8 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D865842F70982000A2EFF8 /* WidgetKit.framework */; };
55D865872F70982000A2EFF8 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D865862F70982000A2EFF8 /* SwiftUI.framework */; };
Expand Down Expand Up @@ -325,8 +325,11 @@
50E608232A79966600BAF09B /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = "<group>"; };
50E608252A79968500BAF09B /* AdvancedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedView.swift; sourceTree = "<group>"; };
53CB9305A9DC6CAD1895495A /* SharedUserDefaultsTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SharedUserDefaultsTests.swift; sourceTree = "<group>"; };
55472AC42F59E3C000382947 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
5573F6ED2F9F523D00E63A73 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
55B5E81A2F39158200852AA7 /* InternetStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternetStatusView.swift; sourceTree = "<group>"; };
55D865832F70982000A2EFF8 /* NetBirdWidgetExtensionExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NetBirdWidgetExtensionExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
55D865842F70982000A2EFF8 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
55D865862F70982000A2EFF8 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
5BFDF94163AF4C32A44DB3CD /* FirstLaunchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstLaunchView.swift; sourceTree = "<group>"; };
8AA7193B3AE82DF185EDEB1B /* AppLoggerTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppLoggerTests.swift; sourceTree = "<group>"; };
8DE6A20955914E68BFADDEED /* iOSConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSConnectionView.swift; sourceTree = "<group>"; };
Expand All @@ -348,9 +351,6 @@
F1B292062EE0AC25001D91B8 /* EnvVarPackager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnvVarPackager.swift; sourceTree = "<group>"; };
F1B292092EE0BC40001D91B8 /* GlobalConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalConstants.swift; sourceTree = "<group>"; };
F8BCB110545747678AA5A9C2 /* TVServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TVServerView.swift; sourceTree = "<group>"; };
55D865832F70982000A2EFF8 /* NetBirdWidgetExtensionExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NetBirdWidgetExtensionExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
55D865842F70982000A2EFF8 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
55D865862F70982000A2EFF8 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
Expand Down Expand Up @@ -428,20 +428,20 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
5AEE671F5AD9A52DB8CAA111 /* Frameworks */ = {
55D865802F70982000A2EFF8 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1C4E6A81CD33FF6D2DEFF8D5 /* Foundation.framework in Frameworks */,
55D865872F70982000A2EFF8 /* SwiftUI.framework in Frameworks */,
55D865852F70982000A2EFF8 /* WidgetKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
55D865802F70982000A2EFF8 /* Frameworks */ = {
5AEE671F5AD9A52DB8CAA111 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
55D865872F70982000A2EFF8 /* SwiftUI.framework in Frameworks */,
55D865852F70982000A2EFF8 /* WidgetKit.framework in Frameworks */,
1C4E6A81CD33FF6D2DEFF8D5 /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -531,7 +531,7 @@
50A8910E2A792A15007C48FC = {
isa = PBXGroup;
children = (
55472AC42F59E3C000382947 /* GoogleService-Info.plist */,
5573F6ED2F9F523D00E63A73 /* GoogleService-Info.plist */,
50D402932BD9143900D4AC5B /* NetBirdSDK.xcframework */,
50245A0A2A7AA9390034792B /* NetBird-Bridging-Header.h */,
50A891192A792A15007C48FC /* NetBird */,
Expand Down Expand Up @@ -788,24 +788,6 @@
productReference = 50A891172A792A15007C48FC /* NetBird.app */;
productType = "com.apple.product-type.application";
};
C4BEBDBD1DC2C4D7764C202C /* NetBirdTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2220A9ADFD7D3298B5431E55 /* Build configuration list for PBXNativeTarget "NetBirdTests" */;
buildPhases = (
75C1F1B3030A2B3C26074DAB /* Sources */,
5AEE671F5AD9A52DB8CAA111 /* Frameworks */,
867D87D69DACEF5CF82E9A1B /* Resources */,
);
buildRules = (
);
dependencies = (
544A834AF876CA67355D4DFA /* PBXTargetDependency */,
);
name = NetBirdTests;
productName = NetBirdTests;
productReference = 50733EE9CE10FEDDA61600B8 /* NetBirdTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
55D865822F70982000A2EFF8 /* NetBirdWidgetExtensionExtension */ = {
isa = PBXNativeTarget;
buildConfigurationList = 55D8659A2F70982100A2EFF8 /* Build configuration list for PBXNativeTarget "NetBirdWidgetExtensionExtension" */;
Expand All @@ -828,6 +810,24 @@
productReference = 55D865832F70982000A2EFF8 /* NetBirdWidgetExtensionExtension.appex */;
productType = "com.apple.product-type.app-extension";
};
C4BEBDBD1DC2C4D7764C202C /* NetBirdTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2220A9ADFD7D3298B5431E55 /* Build configuration list for PBXNativeTarget "NetBirdTests" */;
buildPhases = (
75C1F1B3030A2B3C26074DAB /* Sources */,
5AEE671F5AD9A52DB8CAA111 /* Frameworks */,
867D87D69DACEF5CF82E9A1B /* Resources */,
);
buildRules = (
);
dependencies = (
544A834AF876CA67355D4DFA /* PBXTargetDependency */,
);
name = NetBirdTests;
productName = NetBirdTests;
productReference = 50733EE9CE10FEDDA61600B8 /* NetBirdTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
Expand Down Expand Up @@ -889,15 +889,15 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
55472AC52F59E3C000382947 /* GoogleService-Info.plist in Resources */,
5573F6EE2F9F523D00E63A73 /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
441C5AFB2EDF0DD20055EEFC /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
55472AC82F59E3C000382947 /* GoogleService-Info.plist in Resources */,
5573F6EF2F9F523D00E63A73 /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -907,7 +907,7 @@
files = (
501B0DCE2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */,
501B0DD22AE04DDE004BE7A7 /* logo_NetBird.json in Resources */,
55472AC62F59E3C000382947 /* GoogleService-Info.plist in Resources */,
5573F6F12F9F523D00E63A73 /* GoogleService-Info.plist in Resources */,
501B0DDC2AE04DDE004BE7A7 /* button-connected.json in Resources */,
501B0DD62AE04DDE004BE7A7 /* button-start-connecting.json in Resources */,
501B0DDA2AE04DDE004BE7A7 /* button-full.json in Resources */,
Expand All @@ -929,20 +929,20 @@
501B0DCD2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */,
501B0DD12AE04DDE004BE7A7 /* logo_NetBird.json in Resources */,
501B0DDB2AE04DDE004BE7A7 /* button-connected.json in Resources */,
55472AC72F59E3C000382947 /* GoogleService-Info.plist in Resources */,
5573F6F02F9F523D00E63A73 /* GoogleService-Info.plist in Resources */,
501B0DCF2AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */,
501B0DD72AE04DDE004BE7A7 /* button-full2.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
867D87D69DACEF5CF82E9A1B /* Resources */ = {
55D865812F70982000A2EFF8 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
55D865812F70982000A2EFF8 /* Resources */ = {
867D87D69DACEF5CF82E9A1B /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
Expand Down Expand Up @@ -1139,20 +1139,20 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
75C1F1B3030A2B3C26074DAB /* Sources */ = {
55D8657F2F70982000A2EFF8 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
94F739DA3E076313908BA6DF /* GlobalConstantsTests.swift in Sources */,
9CC0E000AE3F165CA72FD465 /* AppLoggerTests.swift in Sources */,
1C9E4E97130030CE0D6C8F59 /* SharedUserDefaultsTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
55D8657F2F70982000A2EFF8 /* Sources */ = {
75C1F1B3030A2B3C26074DAB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
94F739DA3E076313908BA6DF /* GlobalConstantsTests.swift in Sources */,
9CC0E000AE3F165CA72FD465 /* AppLoggerTests.swift in Sources */,
1C9E4E97130030CE0D6C8F59 /* SharedUserDefaultsTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -1640,30 +1640,6 @@
};
name = Release;
};
9D05AFD5853A133CCADBCC3C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = TA739QLA7A;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "";
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app.tests;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NetBird.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/NetBird";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
55D8659B2F70982100A2EFF8 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
Expand Down Expand Up @@ -1740,6 +1716,30 @@
};
name = Release;
};
9D05AFD5853A133CCADBCC3C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = TA739QLA7A;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "";
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app.tests;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NetBird.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/NetBird";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
Expand Down
43 changes: 42 additions & 1 deletion NetBird/Source/App/NetBirdApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,19 @@
import SwiftUI
import FirebaseCore
import Combine
import UserNotifications
import NetBirdSDK

#if os(iOS)
import FirebasePerformance
#endif

#if os(iOS)
class AppDelegate: NSObject, UIApplicationDelegate {
extension Notification.Name {
static let netbirdLoginNotificationTapped = Notification.Name("io.netbird.loginNotificationTapped")
}

class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
Expand All @@ -26,8 +32,40 @@ class AppDelegate: NSObject, UIApplicationDelegate {
let options = FirebaseOptions(contentsOfFile: path) {
FirebaseApp.configure(options: options)
}

let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if let error = error {
AppLogger.shared.log("Notification authorization error: \(error.localizedDescription)")
} else {
AppLogger.shared.log("Notification authorization granted: \(granted)")
}
}

return true
}

// Show notification banner even when app is in foreground
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
) {
completionHandler([.banner, .sound])
}

// Handle tap on notification — post event so the app navigates to auth flow
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
if response.notification.request.identifier == GlobalConstants.notificationLoginRequired {
NotificationCenter.default.post(name: .netbirdLoginNotificationTapped, object: nil)
}
completionHandler()
}
}
#endif

Expand Down Expand Up @@ -76,6 +114,9 @@ struct NetBirdApp: App {
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
stopActivation(viewModel: viewModel)
}
.onReceive(NotificationCenter.default.publisher(for: .netbirdLoginNotificationTapped)) { _ in
viewModel.showAuthenticationRequired = true
}
#endif
#if os(tvOS)
.onAppear {
Expand Down
Loading