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

如何在AppDelegate与SceneDelegate之间共享对象实例

核心原因

@EnvironmentObject 是SwiftUI视图层级专属的依赖注入机制,仅对处于SwiftUI视图树内、被注入链路覆盖的视图节点生效。SceneDelegate 是UIKit层负责场景生命周期管理的对象,实例由UIKit创建管理,完全不在SwiftUI视图环境链路中,因此无法通过@EnvironmentObject读取到注入的Client实例,这就是触发运行时崩溃的直接原因。

可行实现方案

方案1:最小改动版(复用现有AppDelegate中的Client实例)

你已经在AppDelegate中完成了Client的全局唯一初始化,不需要改动现有视图层的环境注入逻辑,直接在SceneDelegate中通过UIApplication拿到AppDelegate的引用,即可访问同一份Client实例:

class SceneDelegate: NSObject, UIWindowSceneDelegate {
    // 计算属性返回和视图层同源的Client实例
    private var client: Client {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            fatalError("AppDelegate实例获取失败")
        }
        return appDelegate.client
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        client.disconnect()
        // 前台进入相关的其他逻辑可直接调用client方法
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // 其他生命周期回调中也可正常访问client
    }
}

该方案下,AppDelegate的APNs逻辑、SwiftUI视图层的环境注入、SceneDelegate的生命周期逻辑,访问的都是同一个Client实例,不会出现重复初始化、状态不同步的问题。

方案2:共享实例版(适合多模块/多类调用场景)

如果项目中还有其他UIKit层类需要访问Client,可以将Client显式设计为共享实例,减少跨类转发的冗余代码:

  1. 给Client添加静态共享实例
class Client: ObservableObject {
    static let shared = Client()
    
    // 原有Client的属性、业务方法保持不变
    func disconnect() {
        // 原有断连逻辑
    }
}
  1. 修改AppDelegate中的Client属性,直接引用共享实例
class AppDelegate: NSObject, UIApplicationDelegate {
    let client = Client.shared
    // APNs注册、推送处理相关逻辑保持不变
}
  1. App入口的环境注入逻辑不需要改动,SceneDelegate中直接访问共享实例即可
class SceneDelegate: NSObject, UIWindowSceneDelegate {
    private let client = Client.shared

    func sceneWillEnterForeground(_ scene: UIScene) {
        client.disconnect()
    }
}

注意:如果Client初始化需要依赖启动配置、用户登录态等运行时参数,可以把Client.shared的初始化时机调整到对应配置加载完成之后,避免提前初始化导致参数缺失。

避坑说明

不要尝试给SceneDelegate手动做环境注入,SceneDelegate不属于SwiftUI视图节点,所有SwiftUI环境相关的API对它都不生效,这类写法只会复现你遇到的「找不到对应ObservableObject」的运行时崩溃。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:09:16