From 3c71bde236aa4f1b92d7b39e0d24c333c5b13e1c Mon Sep 17 00:00:00 2001 From: Francesco-Voto Date: Mon, 28 Sep 2026 12:39:16 +0200 Subject: [PATCH] fix: support scene based lifecycle for ios 27 --- .../react-native-app-auth/ios/RNAppAuth.m | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/react-native-app-auth/ios/RNAppAuth.m b/packages/react-native-app-auth/ios/RNAppAuth.m index c48163427..c637537e9 100644 --- a/packages/react-native-app-auth/ios/RNAppAuth.m +++ b/packages/react-native-app-auth/ios/RNAppAuth.m @@ -19,6 +19,37 @@ -(BOOL)resumeExternalUserAgentFlowWithURL:(NSURL *)url { return [_currentSession resumeExternalUserAgentFlowWithURL:url]; } +-(UIViewController *)topmostPresentedViewControllerFromRootViewController:(UIViewController *)rootViewController { + UIViewController *topViewController = rootViewController; + while (topViewController.presentedViewController) { + topViewController = topViewController.presentedViewController; + } + return topViewController; +} + +-(UIWindow *)keyWindowFromConnectedScenes { + UIWindow *fallbackKeyWindow = nil; + for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { + if (![scene isKindOfClass:[UIWindowScene class]]) { + continue; + } + UIWindowScene *windowScene = (UIWindowScene *)scene; + UIWindow *keyWindow = windowScene.keyWindow; + if (!keyWindow) { + continue; + } + if (windowScene.activationState == UISceneActivationStateForegroundActive) { + [keyWindow layoutIfNeeded]; + return keyWindow; + } + if (!fallbackKeyWindow) { + fallbackKeyWindow = keyWindow; + } + } + [fallbackKeyWindow layoutIfNeeded]; + return fallbackKeyWindow; +} + - (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); @@ -374,7 +405,7 @@ - (void)authorizeWithConfiguration: (OIDServiceConfiguration *) configuration rnAppAuthTaskId = UIBackgroundTaskInvalid; }]; - UIViewController *presentingViewController = appDelegate.window.rootViewController.view.window ? appDelegate.window.rootViewController : appDelegate.window.rootViewController.presentedViewController; + UIViewController *presentingViewController = [self topmostPresentedViewControllerFromRootViewController:[self keyWindowFromConnectedScenes].rootViewController]; #if TARGET_OS_MACCATALYST id externalUserAgent = nil; @@ -520,7 +551,7 @@ - (void)endSessionWithConfiguration: (OIDServiceConfiguration *) configuration rnAppAuthTaskId = UIBackgroundTaskInvalid; }]; - UIViewController *presentingViewController = appDelegate.window.rootViewController.view.window ? appDelegate.window.rootViewController : appDelegate.window.rootViewController.presentedViewController; + UIViewController *presentingViewController = [self topmostPresentedViewControllerFromRootViewController:[self keyWindowFromConnectedScenes].rootViewController]; #if TARGET_OS_MACCATALYST id externalUserAgent = nil;