通过 Notification 打开 App 时打开特定视图

Posted

技术标签:

【中文标题】通过 Notification 打开 App 时打开特定视图【英文标题】:Open a specific view when opening the App through a Notification 【发布时间】:2020-02-19 17:31:58 【问题描述】:

当我将类别与操作一起用于通知时,我能够打开特定视图 (ToDoView)。 但我想要实现的是,当我点击通知本身时,也会打开一个特定的视图。 也许这很容易解决,但我还没有使用 SwiftUI。

顺便说一句:此代码仅在应用程序仍在后台运行时才有效,否则我会进入 ContentView,这也不是最佳选择。

AppDelegate.swift

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.
    FirebaseApp.configure()
    UNUserNotificationCenter.current().delegate = self
    return true


func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) 

    if response.actionIdentifier == "open" 
        NotificationCenter.default.post(name: NSNotification.Name("ToDoView"), object: nil)
    

NotificationManager.swift

    func scheduleNotifications() -> Void 
    for notification in notifications 
        let content = UNMutableNotificationContent()
        content.title = notification.title


        var dateComponents = DateComponents()

        dateComponents.hour = 18
        dateComponents.minute = 10
        dateComponents.weekday = notification.weekday

        let open = UNNotificationAction(identifier: "open", title: "Notizen öffnen", options: .foreground)
        let cancel = UNNotificationAction(identifier: "cancel", title: "Schließen", options: .destructive)
        let categories = UNNotificationCategory(identifier: "action", actions: [open,cancel], intentIdentifiers: [])
        UNUserNotificationCenter.current().setNotificationCategories([categories])
        content.categoryIdentifier = "action"
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
        let request = UNNotificationRequest(identifier: notification.id, content: content, trigger: trigger)

        UNUserNotificationCenter.current().add(request)  error in
            guard error == nil else  return 
            print("Benachrichtigung mit folgender ID eingerichtet: \(notification.id)")
        

ContentView.swift

.....
                  .onAppear 
                NotificationCenter.default.addObserver(forName: NSNotification.Name("ToDoView"), object: nil, queue: .main)  (_) in
                    self.showToDo = true
                 

【问题讨论】:

【参考方案1】:

顺便说一句:此代码仅在应用程序仍在运行时才有效 背景,

ContentView 中使用订阅发布者而不是.onAppear,如下所示

1) 声明发布者

struct ContentView: View 
    let todoPublisher = NotificationCenter.default.publisher(for: NSNotification.Name("ToDoView"))
    ...

2) 添加订阅者(在您添加.onAppear 的地方而不是它)

.onReceive(todoPublisher)  notification in
   self.showToDo = true

只要ContentView 存在,这将起作用。

【讨论】:

感谢您的回答,但这会导致与我上面的代码完全相同的行为:ToDoView 仅在应用程序在后台运行时打开,但当它被终止时,它让我内容视图。也许这就是您所说的“只要 ContentView 存在就可以工作”的意思?但是与我的代码相比,我不明白您想要提供的优势。 @Kuhlemann,当应用程序在点击通知操作时启动时必须调用回调userNotificationCenter(_ :didReceive...,因此应该发布您的TodoView 通知。如果它没有被处理,那么它宁愿发布 before ContentView 被构造。因此,您必须检查窗口是否存在,如果没有,则延迟发布通知。 @Asperi 我也有同样的情况。 didReceive 方法不会触发,应用程序 willFinishLaunchingWithOptions 的 launchOptions 为 nil。

以上是关于通过 Notification 打开 App 时打开特定视图的主要内容,如果未能解决你的问题,请参考以下文章

android 设置整个app的通知notification 的声音和震动用啥方法

Notification屏蔽特定应用的通知提示

如果玩家 startergui 中的值为真,我想在玩家触摸时打开一扇门

LR11录制脚本时打不开浏览器,如何解决?

每天进步一点----- Notification

android 设置整个app的通知栏Notification 的声音和震动用啥方法