// // Copyright 2022 New Vector Ltd // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // import SwiftUI @main struct Application: App { @UIApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate @Environment(\.openURL) private var openURL private var appCoordinator: AppCoordinatorProtocol! init() { if ProcessInfo.isRunningUITests { appCoordinator = UITestsAppCoordinator() } else if ProcessInfo.isRunningUnitTests { appCoordinator = UnitTestsAppCoordinator() } else { appCoordinator = AppCoordinator(appDelegate: appDelegate) } SceneDelegate.windowManager = appCoordinator.windowManager } var body: some Scene { WindowGroup { appCoordinator.toPresentable() .statusBarHidden(shouldHideStatusBar) .environment(\.openURL, OpenURLAction { url in if appCoordinator.handleDeepLink(url) { return .handled } return .systemAction }) .onOpenURL { if !appCoordinator.handleDeepLink($0) { openURLInSystemBrowser($0) } } .task { appCoordinator.start() } } } // MARK: - Private /// Hide the status bar so it doesn't interfere with the screenshot tests private var shouldHideStatusBar: Bool { ProcessInfo.isRunningUITests } /// https://github.com/vector-im/element-x-ios/issues/1824 /// Avoid opening universal links in other app variants and infinite loops between them private func openURLInSystemBrowser(_ originalURL: URL) { guard var urlComponents = URLComponents(url: originalURL, resolvingAgainstBaseURL: true) else { openURL(originalURL) return } var queryItems = urlComponents.queryItems ?? [] queryItems.append(.init(name: "no_universal_links", value: "true")) urlComponents.queryItems = queryItems guard let url = urlComponents.url else { openURL(originalURL) return } openURL(url) } }