From 6bebfda4643cf85555fdfc99e8e34a974ebd5df7 Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 18:31:31 +0100 Subject: [PATCH 01/11] Improve main window detection for iOS 13+ Refactor scene handling to ensure main window is correctly identified in iOS 13 and later. --- SVProgressHUD/SVProgressHUD.m | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index 21af1eae..29e6f2d5 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -82,7 +82,7 @@ + (UIWindow *)mainWindow { __block UIWindow *mainWindow = nil; if (@available(iOS 13.0, tvOS 13.0, *)) { [sharedApplication.connectedScenes enumerateObjectsUsingBlock:^(UIScene *scene, BOOL *stop1) { - if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:UIWindowScene.class]) { + if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:UIWindowScene.class] && [scene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { UIWindowScene *windowScene = (UIWindowScene *)scene; [windowScene.windows enumerateObjectsUsingBlock:^(UIWindow *window, NSUInteger idx, BOOL *stop2) { if (window.isKeyWindow && !window.isHidden) { @@ -93,6 +93,20 @@ + (UIWindow *)mainWindow { }]; } }]; + if (!mainWindow) { + [sharedApplication.connectedScenes enumerateObjectsUsingBlock:^(UIScene *scene, BOOL *stop1) { + if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:UIWindowScene.class]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + [windowScene.windows enumerateObjectsUsingBlock:^(UIWindow *window, NSUInteger idx, BOOL *stop2) { + if (window.isKeyWindow && !window.isHidden) { + mainWindow = window; + *stop1 = YES; + *stop2 = YES; + } + }]; + } + }]; + } } if (!mainWindow) { [sharedApplication.windows enumerateObjectsUsingBlock:^(UIWindow *window, NSUInteger idx, BOOL *stop) { @@ -1419,6 +1433,20 @@ - (UIWindow *)frontWindow { // For iOS 13 and later, we first find the active scene. if (@available(iOS 13.0, tvOS 13.0, *)) { for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && [scene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { + if ([scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + // The isKeyWindow property is often a reliable way to find the main window, + // but we also check other properties for robustness. + if (window.isKeyWindow && window.alpha > 0) { + return window; + } + } + } + } + } + for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { if (scene.activationState == UISceneActivationStateForegroundActive) { if ([scene isKindOfClass:[UIWindowScene class]]) { UIWindowScene *windowScene = (UIWindowScene *)scene; From 583be204f5c434fab4234cee0618e8c98b890e0d Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 18:58:16 +0100 Subject: [PATCH 02/11] Improve keyboard window detection in multi-scene environments Refine keyboard window detection logic for iOS 13+ support. --- SVProgressHUD/SVProgressHUD.m | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index 29e6f2d5..90f0624c 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -1381,7 +1381,7 @@ - (CGFloat)visibleKeyboardHeight { if (@available(iOS 13.0, tvOS 13.0, *)) { for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { // only handle UIWindowScene - if ([scene isKindOfClass:[UIWindowScene class]]) { + if ([scene isKindOfClass:[UIWindowScene class]] && [scene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { for (UIWindow *testWindow in ((UIWindowScene *)scene).windows) { if(![testWindow.class isEqual:UIWindow.class]) { keyboardWindow = testWindow; @@ -1393,6 +1393,22 @@ - (CGFloat)visibleKeyboardHeight { break; } } + if (keyboardWindow == nil) { + for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { + // only handle UIWindowScene + if ([scene isKindOfClass:[UIWindowScene class]]) { + for (UIWindow *testWindow in ((UIWindowScene *)scene).windows) { + if(![testWindow.class isEqual:UIWindow.class]) { + keyboardWindow = testWindow; + break; + } + } + } + if (keyboardWindow != nil) { + break; + } + } + } } // Fallback to the old method if not iOS 13+ or if no window is found in a multi-scene environment From e133dad5e354de8b02b2380036ad2cdf454bcf33 Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 19:13:38 +0100 Subject: [PATCH 03/11] Update resource bundles to include PNG files --- SVProgressHUD.podspec | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/SVProgressHUD.podspec b/SVProgressHUD.podspec index a66c9d81..65a9d7dd 100644 --- a/SVProgressHUD.podspec +++ b/SVProgressHUD.podspec @@ -18,14 +18,12 @@ Pod::Spec.new do |s| s.subspec 'Core' do |core| core.source_files = 'SVProgressHUD/*.{h,m}' - core.resources = ['SVProgressHUD/SVProgressHUD.bundle'] - core.resource_bundles = {'SVProgressHUD' => ['SVProgressHUD/PrivacyInfo.xcprivacy']} + core.resource_bundles = {'SVProgressHUD' => ['SVProgressHUD/*.png','SVProgressHUD/PrivacyInfo.xcprivacy']} end s.subspec 'AppExtension' do |ext| ext.source_files = 'SVProgressHUD/*.{h,m}' - ext.resources = ['SVProgressHUD/SVProgressHUD.bundle'] - ext.resource_bundles = {'AppExtension' => ['SVProgressHUD/PrivacyInfo.xcprivacy']} + ext.resource_bundles = {'AppExtension' => ['SVProgressHUD/*.png','SVProgressHUD/PrivacyInfo.xcprivacy']} ext.pod_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'SV_APP_EXTENSIONS=1' } end end From 59bb1ad9d15cf4d3ef0a46dbb3dd69dfeb6f3bc6 Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 19:35:50 +0100 Subject: [PATCH 04/11] Bug fix: Refactor showProgress method to use main queue directly --- SVProgressHUD/SVProgressHUD.m | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index 90f0624c..5ac99bd3 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -780,7 +780,7 @@ - (void)controlViewDidReceiveTouchEvent:(id)sender forEvent:(UIEvent*)event { - (void)showProgress:(float)progress status:(NSString*)status { __weak SVProgressHUD *weakSelf = self; - void (^block)(void) = ^{ + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ __strong SVProgressHUD *strongSelf = weakSelf; if(strongSelf){ if(strongSelf.fadeOutTimer) { @@ -853,12 +853,7 @@ - (void)showProgress:(float)progress status:(NSString*)status { [strongSelf.hapticGenerator prepare]; #endif } - }; - if ([NSThread isMainThread]) { - block(); - } else { - [[NSOperationQueue mainQueue] addOperationWithBlock:block]; - } + }]; } - (void)showImage:(UIImage*)image status:(NSString*)status duration:(NSTimeInterval)duration { From c624e8d31204decf77b9c481b2a3889450026870 Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 19:50:15 +0100 Subject: [PATCH 05/11] Refactor updateViewHierarchy to simplify container check --- SVProgressHUD/SVProgressHUD.m | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index 5ac99bd3..50f45b67 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -570,14 +570,11 @@ - (void)updateViewHierarchy { // Add the overlay to the application window if necessary if(!self.controlView.superview) { // Check if containerView is set and still in the view hierarchy - if(self.containerView && self.containerView.window){ + if(self.containerView){ [self.containerView addSubview:self.controlView]; } else { #if !defined(SV_APP_EXTENSIONS) - UIWindow *window = self.frontWindow; - if (window && window.rootViewController) { - [window addSubview:self.controlView]; - } + [self.frontWindow addSubview:self.controlView]; #else // If SVProgressHUD is used inside an app extension add it to the given view if(self.viewForExtension) { From 7232b498ae7e07b6e1fee5c68453fec2531847f0 Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 21:27:31 +0100 Subject: [PATCH 06/11] Bug fix: remove extra checks from updateViewHierarchy and moveToPoint methods --- SVProgressHUD/SVProgressHUD.m | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index 50f45b67..2ce56212 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -568,16 +568,15 @@ - (void)updateMotionEffectForXMotionEffectType:(UIInterpolatingMotionEffectType) - (void)updateViewHierarchy { // Add the overlay to the application window if necessary - if(!self.controlView.superview) { - // Check if containerView is set and still in the view hierarchy - if(self.containerView){ + if (!self.controlView.superview) { + if (self.containerView){ [self.containerView addSubview:self.controlView]; } else { #if !defined(SV_APP_EXTENSIONS) [self.frontWindow addSubview:self.controlView]; #else // If SVProgressHUD is used inside an app extension add it to the given view - if(self.viewForExtension) { + if (self.viewForExtension) { [self.viewForExtension addSubview:self.controlView]; } #endif @@ -747,7 +746,7 @@ - (void)positionHUD:(NSNotification*)notification { - (void)moveToPoint:(CGPoint)newCenter rotateAngle:(CGFloat)angle { self.hudView.transform = CGAffineTransformMakeRotation(angle); - if (self.containerView && self.containerView.window) { + if (self.containerView) { self.hudView.center = CGPointMake(self.containerView.center.x + self.offsetFromCenter.horizontal, self.containerView.center.y + self.offsetFromCenter.vertical); } else { self.hudView.center = CGPointMake(newCenter.x + self.offsetFromCenter.horizontal, newCenter.y + self.offsetFromCenter.vertical); From 8e750828ab06fd9ae87c76258f2debcefea02abd Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 21:44:02 +0100 Subject: [PATCH 07/11] Check containerView and window before adding controlView --- SVProgressHUD/SVProgressHUD.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index 2ce56212..be7545f6 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -569,11 +569,14 @@ - (void)updateMotionEffectForXMotionEffectType:(UIInterpolatingMotionEffectType) - (void)updateViewHierarchy { // Add the overlay to the application window if necessary if (!self.controlView.superview) { - if (self.containerView){ + if (self.containerView && self.containerView.window) { [self.containerView addSubview:self.controlView]; } else { #if !defined(SV_APP_EXTENSIONS) - [self.frontWindow addSubview:self.controlView]; + UIWindow *window = self.frontWindow; + if (window && window.rootViewController) { + [window addSubview:self.controlView]; + } #else // If SVProgressHUD is used inside an app extension add it to the given view if (self.viewForExtension) { @@ -746,7 +749,7 @@ - (void)positionHUD:(NSNotification*)notification { - (void)moveToPoint:(CGPoint)newCenter rotateAngle:(CGFloat)angle { self.hudView.transform = CGAffineTransformMakeRotation(angle); - if (self.containerView) { + if (self.containerView && self.containerView.window) { self.hudView.center = CGPointMake(self.containerView.center.x + self.offsetFromCenter.horizontal, self.containerView.center.y + self.offsetFromCenter.vertical); } else { self.hudView.center = CGPointMake(newCenter.x + self.offsetFromCenter.horizontal, newCenter.y + self.offsetFromCenter.vertical); From 74506fad51b22fedfd2d239e6466cc92b6c1a03b Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 21:49:11 +0100 Subject: [PATCH 08/11] Update resource handling in SVProgressHUD podspec --- SVProgressHUD.podspec | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SVProgressHUD.podspec b/SVProgressHUD.podspec index 65a9d7dd..0e84caa2 100644 --- a/SVProgressHUD.podspec +++ b/SVProgressHUD.podspec @@ -18,12 +18,14 @@ Pod::Spec.new do |s| s.subspec 'Core' do |core| core.source_files = 'SVProgressHUD/*.{h,m}' - core.resource_bundles = {'SVProgressHUD' => ['SVProgressHUD/*.png','SVProgressHUD/PrivacyInfo.xcprivacy']} + core.resources = ['SVProgressHUD/SVProgressHUD.bundle/**'] + core.resource_bundles = {'SVProgressHUD' => ['SVProgressHUD/PrivacyInfo.xcprivacy']} end s.subspec 'AppExtension' do |ext| ext.source_files = 'SVProgressHUD/*.{h,m}' - ext.resource_bundles = {'AppExtension' => ['SVProgressHUD/*.png','SVProgressHUD/PrivacyInfo.xcprivacy']} + ext.resources = ['SVProgressHUD/SVProgressHUD.bundle/**'] + ext.resource_bundles = {'AppExtension' => ['SVProgressHUD/PrivacyInfo.xcprivacy']} ext.pod_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'SV_APP_EXTENSIONS=1' } end end From 8850e993b7e21ee01024376abf7a666868c515f5 Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 21:58:08 +0100 Subject: [PATCH 09/11] Comment out bundle URL retrieval code Comment out the URL retrieval for the SVProgressHUD bundle. --- SVProgressHUD/SVProgressHUD.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index be7545f6..f1de5deb 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -149,10 +149,10 @@ + (NSBundle *)imageBundle { #else NSBundle *bundle = [NSBundle bundleForClass:[SVProgressHUD class]]; #endif - NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"]; + /*NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"]; if (!url) { return nil; - } + }*/ return [NSBundle bundleWithURL:url]; } From 299e15c019e70bcd9b2eed561bf48bd50522596c Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Sun, 15 Mar 2026 22:00:27 +0100 Subject: [PATCH 10/11] Fix return statement in SVProgressHUD.m --- SVProgressHUD/SVProgressHUD.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index f1de5deb..e66fae1e 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -152,8 +152,9 @@ + (NSBundle *)imageBundle { /*NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"]; if (!url) { return nil; - }*/ - return [NSBundle bundleWithURL:url]; + } + return [NSBundle bundleWithURL:url];*/ + return bundle; } #pragma mark - Setters From 2ac5e7df682304a23e31c98fe29f3433c7c8d3b0 Mon Sep 17 00:00:00 2001 From: Pasquale Puzio Date: Mon, 16 Mar 2026 10:43:34 +0100 Subject: [PATCH 11/11] Refactor mainWindow retrieval logic for iOS 13+ --- SVProgressHUD/SVProgressHUD.m | 141 ++++++++++++++++------------------ 1 file changed, 67 insertions(+), 74 deletions(-) diff --git a/SVProgressHUD/SVProgressHUD.m b/SVProgressHUD/SVProgressHUD.m index e66fae1e..ae89d230 100644 --- a/SVProgressHUD/SVProgressHUD.m +++ b/SVProgressHUD/SVProgressHUD.m @@ -78,68 +78,77 @@ + (SVProgressHUD*)sharedView { #if !defined(SV_APP_EXTENSIONS) + (UIWindow *)mainWindow { - UIApplication *sharedApplication = [UIApplication sharedApplication]; - __block UIWindow *mainWindow = nil; if (@available(iOS 13.0, tvOS 13.0, *)) { - [sharedApplication.connectedScenes enumerateObjectsUsingBlock:^(UIScene *scene, BOOL *stop1) { - if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:UIWindowScene.class] && [scene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { - UIWindowScene *windowScene = (UIWindowScene *)scene; - [windowScene.windows enumerateObjectsUsingBlock:^(UIWindow *window, NSUInteger idx, BOOL *stop2) { + // First pass: find key window in active foreground app scenes + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (![scene isKindOfClass:[UIWindowScene class]]) { + continue; + } + + UIWindowScene *windowScene = (UIWindowScene *)scene; + if (windowScene.activationState == UISceneActivationStateForegroundActive && + [windowScene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { + for (UIWindow *window in windowScene.windows) { if (window.isKeyWindow && !window.isHidden) { - mainWindow = window; - *stop1 = YES; - *stop2 = YES; + return window; } - }]; + } + if (windowScene.windows.count > 0) { + return windowScene.windows.firstObject; + } } - }]; - if (!mainWindow) { - [sharedApplication.connectedScenes enumerateObjectsUsingBlock:^(UIScene *scene, BOOL *stop1) { - if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:UIWindowScene.class]) { - UIWindowScene *windowScene = (UIWindowScene *)scene; - [windowScene.windows enumerateObjectsUsingBlock:^(UIWindow *window, NSUInteger idx, BOOL *stop2) { - if (window.isKeyWindow && !window.isHidden) { - mainWindow = window; - *stop1 = YES; - *stop2 = YES; - } - }]; - } - }]; - } - } - if (!mainWindow) { - [sharedApplication.windows enumerateObjectsUsingBlock:^(UIWindow *window, NSUInteger idx, BOOL *stop) { + } + + // Second pass: any app scene regardless of activation state + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (![scene isKindOfClass:[UIWindowScene class]]) { + continue; + } + + UIWindowScene *windowScene = (UIWindowScene *)scene; + if (![windowScene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { + continue; + } + + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow && !window.isHidden) { + return window; + } + } + if (windowScene.windows.count > 0) { + return windowScene.windows.firstObject; + } + } + + // Third pass: check all application windows + for (UIWindow *window in [UIApplication sharedApplication].windows) { if (window.isKeyWindow && !window.isHidden) { - mainWindow = window; - *stop = YES; + return window; } - }]; - } - // delegate window - if (!mainWindow) { - if (@available(iOS 13.0, tvOS 13.0, *)) { - [sharedApplication.connectedScenes enumerateObjectsUsingBlock:^(UIScene *scene, BOOL *stop) { - if ([scene isKindOfClass:UIWindowScene.class] && [scene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { - UIWindowScene *windowScene = (UIWindowScene *)scene; - if ([windowScene.delegate conformsToProtocol:@protocol(UIWindowSceneDelegate)]) { - id sceneDelegate = (id)windowScene.delegate; - if (sceneDelegate.window) { - mainWindow = sceneDelegate.window; - *stop = YES; - } + } + + // Fourth pass: delegate windows + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if ([scene isKindOfClass:[UIWindowScene class]] && + [scene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + if ([windowScene.delegate conformsToProtocol:@protocol(UIWindowSceneDelegate)]) { + id sceneDelegate = (id)windowScene.delegate; + if (sceneDelegate.window) { + return sceneDelegate.window; } } - }]; - } - if (!mainWindow) { - id appDelegate = sharedApplication.delegate; - if ([appDelegate respondsToSelector:@selector(window)]) { - mainWindow = appDelegate.window; } } } - return mainWindow; + + // Pre-iOS 13 fallback / last resort + id appDelegate = [UIApplication sharedApplication].delegate; + if ([appDelegate respondsToSelector:@selector(window)] && appDelegate.window) { + return appDelegate.window; + } + + return nil; } #endif @@ -1444,29 +1453,13 @@ - (UIWindow *)frontWindow { // For iOS 13 and later, we first find the active scene. if (@available(iOS 13.0, tvOS 13.0, *)) { for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { - if (scene.activationState == UISceneActivationStateForegroundActive && [scene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { - if ([scene isKindOfClass:[UIWindowScene class]]) { - UIWindowScene *windowScene = (UIWindowScene *)scene; - for (UIWindow *window in windowScene.windows) { - // The isKeyWindow property is often a reliable way to find the main window, - // but we also check other properties for robustness. - if (window.isKeyWindow && window.alpha > 0) { - return window; - } - } - } - } - } - for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { - if (scene.activationState == UISceneActivationStateForegroundActive) { - if ([scene isKindOfClass:[UIWindowScene class]]) { - UIWindowScene *windowScene = (UIWindowScene *)scene; - for (UIWindow *window in windowScene.windows) { - // The isKeyWindow property is often a reliable way to find the main window, - // but we also check other properties for robustness. - if (window.isKeyWindow && window.alpha > 0) { - return window; - } + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]] && + [scene.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow && window.alpha > 0) { + return window; } } }