本文介绍了使用 SwiftUI 接收 APNS 后显示视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的应用收到 APNS 推送通知后显示视图.我正在使用 SwiftUI.我遵循了本教程(https://blckbirds.com/post/how-to-navnigate-between-views-in-swiftui-by-using-an-environmentobject/) 创建一个 MotherView 和一个 ViewRouter.

I want to show a view, after my App received an APNS-Push Notification. I'm using SwiftUI. I followed this tutorial (https://blckbirds.com/post/how-to-navnigate-between-views-in-swiftui-by-using-an-environmentobject/) to create a motherView and a ViewRouter.

MotherView 看起来像这样:

MotherView looks like that:

struct MotherView: View {

//    MARK: - Properties
    @EnvironmentObject var viewRouter: ViewRouter
    @State private var isMenuVisible: Bool = false

    var body: some View {
        VStack {
            if viewRouter.currentPage == Constants.Views.login {
                Login_SwiftUIView()
            } else if viewRouter.currentPage == Constants.Views.main {
                MainView(withMenu: $isMenuVisible)
            } else if viewRouter.currentPage == Constants.Views.menu {
                Menu_SwiftUI(withMenu: $isMenuVisible)
            } else if viewRouter.currentPage == Constants.Views.push {
                PushView()
            }
        }
    }
}

ViewRouter 是一个 ObservableObjectClass

ViewRouter is a ObservableObjectClass

class ViewRouter: ObservableObject {

    let objectWillChange = PassthroughSubject<ViewRouter,Never>()

    var currentPage: Constants.Views = Constants.Views.login {
        didSet {
            objectWillChange.send(self)
        }
    }
}

AppDelegate 在收到推送通知后调用此函数:

The AppDelegate calls this function, after receiving a Push-Notification:

func presentView(with pushNotification: [String: AnyObject]) {
    //Here I want to set the viewRouter.currentPage = Constants.View.push
}

您对解决这个问题有什么建议?

What would be your suggestions to solve this problem?

推荐答案

这是可能的方法.

1) 在 ViewRouter 中使用本机组合发布作为

1) Use native Combine publishing in ViewRouter as

class ViewRouter: ObservableObject {
    @Published var currentPage: Constants.Views = Constants.Views.login
}

2) 在AppDelegate

class AppDelegate {
   var viewRouter = ViewRouter()

...

func presentView(with pushNotification: [String: AnyObject]) {
    // set here new value
    self.viewRouter.currentPage = Constants.View.push

}

3) 在 SceneDelegate 中使用 AppDelegate 中的 viewRouter 作为 ContentView(或 MotherView,如果你用它作为根视图)

3) In SceneDelegate use viewRouter from AppDelegate as an environment object for ContentView (or MotherView, if you use it as root view)

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {

            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            let contentView = ContentView().environmentObject(appDelegate.viewRoute)

            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)

因此,您使用在 AppDelegate 中修改并在 MotherView 中处理的一个 ViewRoute 对象.

Thus, you use one ViewRoute object modified in AppDelegate and handled in MotherView.

这篇关于使用 SwiftUI 接收 APNS 后显示视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-11 21:20