使用 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:@Environment 未在视图层次结构中接收提供的值