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

如何关闭SwiftUI预览后终止后台运行的应用进程?

解决SwiftUI预览关闭后进程残留的问题

1. 检测预览环境

Xcode预览会在进程环境中注入专属变量,我们可以通过它区分预览和正常运行环境:

extension ProcessInfo {
    var isRunningInPreview: Bool {
        environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
    }
}

2. 监听场景状态实现自动退出

在SwiftUI的App结构体中,通过ScenePhase监听场景生命周期变化,在预览环境下触发退出逻辑:

@main
struct MyGameApp: App {
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { newPhase in
            guard ProcessInfo.processInfo.isRunningInPreview else { return }
            
            // 预览场景进入后台/非活跃状态时执行退出
            if newPhase == .background || newPhase == .inactive {
                gracefulExitInPreview()
            }
        }
    }
    
    private func gracefulExitInPreview() {
        // 先执行游戏资源清理:停止音效、注销控制器监听、释放资源等
        GameAudioManager.shared.stopAllSounds()
        GameControllerManager.shared.unregisterAllControllers()
        
        // 延迟确保清理完成后终止进程
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            exit(0)
        }
    }
}

关键说明

  • SwiftUI预览采用简化的场景生命周期,常规AppDelegate回调不会触发,因此必须使用SwiftUI原生的ScenePhase监听状态变化。
  • 直接调用exit(0)可快速终止进程,若需要优雅退出,可在清理完游戏资源后再执行终止操作。

内容的提问来源于stack exchange,提问作者keelo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:42:39