From 5b8a98f7633532a26c38332e60650f4692b42a96 Mon Sep 17 00:00:00 2001 From: Trey t Date: Fri, 20 Feb 2026 11:58:12 -0600 Subject: [PATCH] Fix feels://subscribe deep link on cold launch via app.open() When XCUITest calls app.open(url), the app relaunches (cold launch) and onOpenURL doesn't fire reliably. Capture the URL from launch options in AppDelegate and check it on appear with a short delay to ensure the view hierarchy is ready for sheet presentation. Co-Authored-By: Claude Opus 4.6 --- Shared/AppDelegate.swift | 5 +++++ Shared/FeelsApp.swift | 17 +++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Shared/AppDelegate.swift b/Shared/AppDelegate.swift index 767ef55..73c0c69 100644 --- a/Shared/AppDelegate.swift +++ b/Shared/AppDelegate.swift @@ -11,11 +11,16 @@ import UIKit import SwiftUI class AppDelegate: NSObject, UIApplicationDelegate { + static var pendingDeepLinkURL: URL? + private let savedOnboardingData = UserDefaultsStore.getOnboarding() @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system @MainActor func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + if let url = launchOptions?[.url] as? URL { + AppDelegate.pendingDeepLinkURL = url + } DataController.shared.removeNoForDates() DataController.shared.fillInMissingDates() UNUserNotificationCenter.current().delegate = self diff --git a/Shared/FeelsApp.swift b/Shared/FeelsApp.swift index ad14be3..258dd4f 100644 --- a/Shared/FeelsApp.swift +++ b/Shared/FeelsApp.swift @@ -63,9 +63,7 @@ struct FeelsApp: App { .environmentObject(iapManager) } .onOpenURL { url in - if url.scheme == "feels" && url.host == "subscribe" { - showSubscriptionFromWidget = true - } + handleDeepLink(url) } .alert("Data Storage Unavailable", isPresented: $showStorageFallbackAlert) { @@ -77,6 +75,12 @@ struct FeelsApp: App { if SharedModelContainer.isUsingInMemoryFallback { AnalyticsManager.shared.track(.storageFallbackActivated) } + if let url = AppDelegate.pendingDeepLinkURL { + AppDelegate.pendingDeepLinkURL = nil + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + handleDeepLink(url) + } + } } // Lock screen overlay @@ -141,5 +145,10 @@ struct FeelsApp: App { } } } - + + private func handleDeepLink(_ url: URL) { + if url.scheme == "feels" && url.host == "subscribe" { + showSubscriptionFromWidget = true + } + } }