You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:03:18