refactor: 统一获取 keyWindow 的实现,简化 Swift 代码

主要变更:
1. 移除 Swift 中重复实现的 getKeyWindow() 方法,统一调用 ObjC inline 函数 kGetKeyWindow()。
2. 更新 EPLoginManager 中的相关调用,确保一致性和简洁性。

此更新旨在提升代码的可维护性,减少冗余实现,确保跨语言调用的一致性。
This commit is contained in:
edwinQQQ
2025-10-20 16:12:50 +08:00
parent 9777c3de28
commit 4256e01820
2 changed files with 33 additions and 46 deletions

View File

@@ -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
/// keyWindowiOS 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) {

View File

@@ -6,6 +6,7 @@
//
///一些宏
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#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]