如何通过SwiftUI中的ObservableObject类访问AppDelegate中的数据

qybjjes1  于 2023-01-12  发布在  Swift
关注(0)|答案(2)|浏览(161)

在新的SwiftUI生命周期中,通常不再有AppDelegate。但是,为了实现Firebase消息传递,建议在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中所述。使用静态全局访问变量不是坏习惯吗?有没有其他(更好的)方法?

t3irkdon

t3irkdon1#

您可以使用访问delegate的“老方法”来完成此操作

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

然后你就可以用

appDelegate?.yourToken

yourToken引用delegate中的属性

mf98qq94

mf98qq942#

下面是我如何将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
    }
}

要读取令牌,请在需要令牌的视图中分配一个environmentObject:

@EnvironmentObject var appDelegate: AppDelegate

然后根据需要引用appDelegate:

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

相关问题