diff --git a/YuMi/E-P/NewLogin/Services/EPLoginManager.swift b/YuMi/E-P/NewLogin/Services/EPLoginManager.swift index 513f4e3..e48c144 100644 --- a/YuMi/E-P/NewLogin/Services/EPLoginManager.swift +++ b/YuMi/E-P/NewLogin/Services/EPLoginManager.swift @@ -41,8 +41,8 @@ import UIKit let epTabBar = EPTabBarController.create() epTabBar.refreshTabBarWithIsLogin(true) - // 设置为根控制器 - if let window = getKeyWindow() { + // 设置为根控制器(统一从 ObjC inline 函数获取) + if let window = kGetKeyWindow() { window.rootViewController = epTabBar window.makeKeyAndVisible() @@ -63,7 +63,7 @@ import UIKit let epTabBar = EPTabBarController.create() epTabBar.refreshTabBarWithIsLogin(true) - if let window = getKeyWindow() { + if let window = kGetKeyWindow() { window.rootViewController = epTabBar window.makeKeyAndVisible() @@ -87,27 +87,7 @@ import UIKit // MARK: - Helper Methods - /// 获取 keyWindow(iOS 13+ 兼容) - /// - Note: Swift 实现,与 YUMIMacroUitls.h 的 kWindow 宏逻辑保持一致 - /// ObjC 代码应直接使用 kWindow 宏,避免重复 - private static func getKeyWindow() -> UIWindow? { - if #available(iOS 13.0, *) { - for windowScene in UIApplication.shared.connectedScenes { - if let windowScene = windowScene as? UIWindowScene, - windowScene.activationState == .foregroundActive { - for window in windowScene.windows { - if window.isKeyWindow { - return window - } - } - return windowScene.windows.first - } - } - } else { - return UIApplication.shared.keyWindow - } - return nil - } + // Swift 侧不再重复实现 keyWindow 获取,统一调用 ObjC inline 函数 kGetKeyWindow() /// 检查并显示专属颜色引导页 private static func checkAndShowSignatureColorGuide(in window: UIWindow) { diff --git a/YuMi/Global/YUMIMacroUitls.h b/YuMi/Global/YUMIMacroUitls.h index 43ee2dc..64a3cf1 100644 --- a/YuMi/Global/YUMIMacroUitls.h +++ b/YuMi/Global/YUMIMacroUitls.h @@ -6,6 +6,7 @@ // ///一些宏 #import +#import #import "../Tools/Bundle/NSBundle+Localizable.h" #ifndef YUMIMacroUitls_h @@ -49,29 +50,35 @@ isPhoneXSeries = [[UIApplication sharedApplication] delegate].window.safeAreaIns #define kWeakify(o) try{}@finally{} __weak typeof(o) o##Weak = o; #define kStrongify(o) autoreleasepool{} __strong typeof(o) o = o##Weak; -/// 兼容 iOS 13+ 的 keyWindow 获取 -/// 使用此宏统一获取 keyWindow,避免在各处重复实现 +/// 兼容 iOS 13+ 的 keyWindow 获取(Swift & ObjC 通用) +/// 使用此函数统一获取 keyWindow,避免在各处重复实现 /// 自动处理 iOS 13+ 的 UIWindowScene 和旧版本的兼容性 -/// Swift 代码请使用 EPLoginManager.getKeyWindow() 等效方法 -#define kWindow ({\ - UIWindow *window = nil;\ - if (@available(iOS 13.0, *)) {\ - for (UIWindowScene *scene in [UIApplication sharedApplication].connectedScenes) {\ - if (scene.activationState == UISceneActivationStateForegroundActive) {\ - for (UIWindow *w in scene.windows) {\ - if (w.isKeyWindow) {\ - window = w;\ - break;\ - }\ - }\ - if (window) break;\ - }\ - }\ - } else {\ - window = [UIApplication sharedApplication].keyWindow;\ - }\ - window;\ -}) +static inline __attribute__((unused)) UIWindow * _Nullable kGetKeyWindow(void) { + UIWindow *window = nil; + if (@available(iOS 13.0, *)) { + for (UIWindowScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive) { + for (UIWindow *w in scene.windows) { + if (w.isKeyWindow) { + return w; + } + } + if (scene.windows.firstObject) { + return scene.windows.firstObject; + } + } + } + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + window = [UIApplication sharedApplication].keyWindow; +#pragma clang diagnostic pop + } + return window; +} + +// 兼容旧代码:保留宏入口 +#define kWindow kGetKeyWindow() #define kImage(image) [UIImage imageNamed:image]