YMWindowUtils.m 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //
  2. // YMWindowUtils.m
  3. // MSYOUPAI
  4. //
  5. // Created by YoMi on 2024/2/4.
  6. // Copyright © 2024 MS. All rights reserved.
  7. //
  8. #import "YMWindowUtils.h"
  9. @implementation YMWindowUtils
  10. + (nullable UIWindowScene *)activeScene NS_AVAILABLE_IOS(13.0) {
  11. NSSet<UIScene *> *connectedScenes = UIApplication.sharedApplication.connectedScenes;
  12. for (UIScene *scene in connectedScenes) {
  13. if (scene.activationState == UISceneActivationStateForegroundActive) {
  14. return (UIWindowScene *)scene;
  15. }
  16. }
  17. return nil;
  18. }
  19. + (nullable UIWindowScene *)activeWindowScene NS_AVAILABLE_IOS(13.0) {
  20. NSSet<UIScene *> *connectedScenes = UIApplication.sharedApplication.connectedScenes;
  21. for (UIScene *scene in connectedScenes) {
  22. if (scene.activationState == UISceneActivationStateForegroundActive &&
  23. [scene isKindOfClass:UIWindowScene.class]) {
  24. return (UIWindowScene *)scene;
  25. }
  26. }
  27. return nil;
  28. }
  29. + (UIWindow *)keyWindow {
  30. if (@available(iOS 13.0, *)) {
  31. UIWindow *window = [self keyWindowFromSceneAPI];
  32. return window != nil ? window : UIApplication.sharedApplication.keyWindow;
  33. } else {
  34. return UIApplication.sharedApplication.keyWindow;
  35. }
  36. }
  37. + (nullable UIWindow *)keyWindowFromSceneAPI NS_AVAILABLE_IOS(13.0) {
  38. NSDictionary *infoDic = NSBundle.mainBundle.infoDictionary[@"UIApplicationSceneManifest"];
  39. // 通过infoDic,判断是否使用UIScene
  40. if (infoDic) {
  41. // 通过supportsMultipleScenes,判断是否支持多个场景
  42. if (UIApplication.sharedApplication.supportsMultipleScenes) {
  43. // 获取所有已链接Scenes
  44. NSSet <UIScene *> *connectedScenes = [UIApplication sharedApplication].connectedScenes;
  45. for (UIScene *scene in connectedScenes) {
  46. UISceneActivationState activationState = scene.activationState;
  47. // 通过activationState,获取当前场景window对象
  48. if (activationState == UISceneActivationStateForegroundActive &&
  49. [scene isKindOfClass:UIWindowScene.class]) {
  50. for (UIWindow *window in [(UIWindowScene *)scene windows]) {
  51. if (window.isKeyWindow) {
  52. return window;
  53. }
  54. }
  55. }
  56. }
  57. }else{
  58. UIWindow *window = ((id<UIWindowSceneDelegate>)[UIApplication sharedApplication].connectedScenes.anyObject.delegate).window;
  59. if (window.isKeyWindow) {
  60. return window;
  61. }
  62. }
  63. }
  64. return nil;
  65. }
  66. @end