通过 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 的声音和震动用啥方法