【问题标题】:How to access data in AppDelegate from ObservableObject class in SwiftUI如何从 SwiftUI 中的 ObservableObject 类访问 AppDelegate 中的数据
【发布时间】:2023-01-12 04:54:22
【问题描述】:

使用新的 SwiftUI 生命周期通常不再有 AppDelegate。但是,为了实现 Firebase Messaging,建议在 Firebase 文档上实现 AppDelegate 并使用以下方式附加它:

@main
struct ExampleApp: SwiftUI.App {
    
    // register app delegate for Firebase setup
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate //<--- HERE
    
    @StateObject var appState = AppState()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(appState)
        }
    }
}

在这个 AppDelegate 函数中,人们获得了一个 FCM 令牌,通过该令牌可以识别设备,以便随后向其远程发送通知。此令牌必须发送到服务器。这可以在AppDelegate 内的相应函数内完成。但是,有一个处理用户数据和写入服务器的类 AppState(ObservableObject 协议),因此将它传递给此类(或从 AppDelegate 在类中检索)更有意义?)然后从那里推动它。

如何做到这一点?

编辑:我想这可以通过在 AppDelegate 中使用 static 属性来实现,如 this answer 中所述。使用静态变量全局访问变量不是坏习惯吗?还有其他(更好)的方法吗?

【问题讨论】:

  • 请参阅链接的解决方案。它还展示了如何在没有 appdelegate 的情况下设置 firebase
  • @flatasearth 请再次阅读问题。我遇到的问题是结果使用与该链接中使用的概念完全相同的概念。

标签: ios swift swiftui appdelegate


【解决方案1】:

您可以使用访问 delegate 的“旧方法”来做到这一点

@MainActor //Required by the app delegate
class AppState: ObservableObject{
    lazy var appDelegate: AppDelegate? = {
        UIApplication.shared.delegate as? AppDelegate
    }()
}

然后你就可以使用

appDelegate?.yourToken

yourToken 引用 delegate 中的属性

【讨论】:

    【解决方案2】:

    这就是我将 AppDelegate 与 ObservableObject 协议一起使用的方式,包括发布属性:

    class AppDelegate: NSObject, UIApplicationDelegate, ObservableObject {
        
        @Published var fcmToken: String = ""
        
    /// Then set the fcmToken using the appropriate application function
        func application(
            _ application: UIApplication,
            didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
           
            fcmToken = deviceToken.hexString
        }
    }
    

    在@main 中,在顶部添加 UIApplicationDelegateAdaptor:

    @main
    struct yourApp: App {
        
        @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
        /// other code
    
    }
    

    要读取令牌,请在需要令牌的视图中分配一个环境对象:

    @EnvironmentObject var appDelegate: AppDelegate 
    

    然后根据需要引用appDelegate:

    var body: some View {
            Text("Token: (appDelegate.fcmToken)")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 2023-03-15
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多