SwiftUI中消除iOS13/iOS16下keyWindow已弃用警告的方法
解决iOS 13+中
keyWindow废弃警告的截图实现方案 在iOS 13及以后,keyWindow被废弃,因为App可能存在多个窗口场景(比如iPad的多窗口、Mac Catalyst等)。你需要通过UIApplication的connectedScenes获取当前活跃的窗口场景,再从中获取对应的窗口。
修改你的UIApplication扩展代码如下:
import Photos import UIKit extension UIApplication { func takeScreenshot() -> UIImage? { // 获取当前活跃的窗口场景 guard let windowScene = connectedScenes.first as? UIWindowScene, let window = windowScene.windows.first(where: { $0.isKeyWindow }) else { return nil } UIGraphicsBeginImageContextWithOptions(window.bounds.size, false, UIScreen.main.scale) window.drawHierarchy(in: window.bounds, afterScreenUpdates: true) let screenshot = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return screenshot } }
补充说明:
connectedScenes包含App当前所有的场景,我们筛选出UIWindowScene类型的场景,这是iOS应用的窗口场景类型。- 通过
first(where: { $0.isKeyWindow })获取场景中的主窗口,替代原来的keyWindow属性。 - 如果你的App支持多窗口场景,可根据需求调整窗口筛选逻辑(比如获取当前激活场景对应的窗口),单窗口App用上述代码即可满足需求。
另外可以优化UIImageWriteToSavedPhotosAlbum的调用,避免强制解包:
if let takenScreenshot = UIApplication.shared.takeScreenshot() { screenshot = takenScreenshot print("Screenshot taken") UIImageWriteToSavedPhotosAlbum(takenScreenshot, nil, nil, nil) showingAlert = true }
修改后,keyWindow的废弃警告会消失,代码也适配了iOS 13+的多窗口机制。
内容的提问来源于stack exchange,提问作者Pro Girl
相关产品推荐
相关产品推荐

