我已经在使用AppDelegate来注册APNs,但是它不支持由SceneDelegate处理的applicationWillResignActive()和applicationWillEnterForeground()函数,如这里所解释的。
我希望两个委托都能访问我的客户端实例。目前,AppDelegate将client实例化为其属性,然后将其作为environmentObject传递给场景:
import SwiftUI
@main
struct app1App: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
MainView().environmentObject(appDelegate.client)
}
}
}
class AppDelegate: NSObject, UIApplicationDelegate {
let client : Client = Client()
// other Notifications related functions
}
当我在视图中声明我的客户端时,如下所示:
@EnvironmentObject var client: Client
如果我在视图中声明,则视图可以访问客户端的方法,但是当我在SceneDelegate中声明时,同样的方法不起作用:
class SceneDelegate: NSObject, UIWindowSceneDelegate {
@EnvironmentObject var client: Client
func sceneWillEnterForeground(_ scene: UIScene) {
self.client.disconnect() // This fails in runtime!!!
}
}
错误提示说它期望一个Observable对象,但我的对象是environmentObject:
Thread 1: Fatal error: No ObservableObject of type Client found. A View.environmentObject(_:) for Client may be missing as an ancestor of this view.
如何通过SceneDelegate中的函数向客户端提供访问权限?