使用 SwiftUI 接收 APNS 后显示视图

Posted

技术标签:

【中文标题】使用 SwiftUI 接收 APNS 后显示视图【英文标题】:Display a view after receiving APNS with SwiftUI 【发布时间】:2020-03-02 14:24:54 【问题描述】:

我想在我的应用收到 APNS 推送通知后显示视图。我正在使用 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 在收到 Push-Notification 后调用该函数:

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

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

【问题讨论】:

【参考方案1】:

这是可能的方法。

1)在ViewRouter中使用原生Combine发布方式

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

2) 在AppDelegate中创建ViewRouter的成员实例

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,如果您将其用作根视图)

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 对象。

【讨论】:

以上是关于使用 SwiftUI 接收 APNS 后显示视图的主要内容,如果未能解决你的问题,请参考以下文章

登录后如何在 SwiftUI 中显示新视图

ios 应用更新后未收到 Firebase/APNS 通知

SwiftUI 接收自定义事件

SwiftUI:@Environment 未在视图层次结构中接收提供的值

成功登录后,SwiftUI ObservedObject 未更新视图

FireBase 登录过程后导航到主屏幕(内容视图)。 (SwiftUI)