Показать представление после получения APNS с SwiftUI - PullRequest
1 голос
/ 02 марта 2020

Я хочу показать представление после того, как мое приложение получило уведомление APNS-Pu sh. Я использую SwiftUI. Я следовал этому руководству (https://blckbirds.com/post/how-to-navnigate-between-views-in-swiftui-by-using-an-environmentobject/), чтобы создать motherView и ViewRouter.

MotherView выглядит так:

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

class ViewRouter: ObservableObject {

    let objectWillChange = PassthroughSubject<ViewRouter,Never>()

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

AppDelegate вызывает эту функцию после получения Pu sh -Notification:

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

Что бы вы посоветовали для решения этой проблемы?

1 Ответ

1 голос
/ 02 марта 2020

Здесь возможен подход.

1) Использовать собственную публикацию Combine в ViewRouter как

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

2) Создать экземпляр элемента ViewRouter в AppDelegate

class AppDelegate {
   var viewRouter = ViewRouter()

...

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

}

3) В SceneDelegate используйте viewRouter из AppDelegate в качестве объекта среды для ContentView (или MotherView, если вы используете его как root представление)

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)

Таким образом, вы используете один ViewRoute объект, измененный в AppDelegate и обработанный в MotherView.

...