【问题标题】:Handling UserNotification when app is opened from the incoming notification从传入通知打开应用程序时处理 UserNotification
【发布时间】:2021-12-23 05:22:26
【问题描述】:

我见过很多类似的问题,但在 Mac 上运行时我还没有找到这个特定场景的答案。 如果应用程序关闭并且用户通知进入并且用户点击它,则应用程序被打开。应用打开后,如何捕获通知以便处理其内容。

据我所知,无法从[[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:[[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler: 检索通知。

当用户点击通知打开应用程序时,它似乎也没有通过UNUserNotificationCenterDelegate 函数打开。我在 willPresentNotificationdidReceiveNotificationResponse 中都没有看到它,并且它不是由 appDelegate 的 didReceiveRemoteNotification:fetchCompletionHandler 处理的。

在这种情况下,在 iOS 上,通知从application:didFinishLaunchingWithOptions 到达launchOptions。有键UIApplicationLaunchOptionsRemoteNotificationKey 包含通知数据。在 Mac 上运行的同一个应用程序包含一个 nil launchOptions 字典。

这些都是我看过的所有地方,但我确定我一定错过了什么。

【问题讨论】:

    标签: ios objective-c mac-catalyst unusernotificationcenter usernotifications


    【解决方案1】:

    虽然操作系统知道它需要唤醒应用程序,因为某些人点击了通知,但您的应用程序可能设置得太晚,无法成为 UserNotificationCenterDelegate

    docs:

    您必须将您的委托对象分配给UNUserNotificationCenter 在您的应用程序完成启动之前创建对象。例如,在 iOS 应用程序中, 您必须在 application(_:willFinishLaunchingWithOptions:)application(_:didFinishLaunchingWithOptions:) 应用程序的方法 代表。在系统调用这些方法后分配委托 可能会导致您错过收到的通知

    就像你现在发生的事情是:

    • 用户点击通知
    • 应用启动
    • 在应用程序的 didFinishLaunching 中,尚未设置委托,因此未调用 didReceiveNotificationResponse

    对于任何可以唤醒应用程序的委托/回调(例如 UserNotification、CoreLocation 等)的 tldr,回调的设置/注册需要在 didFinishLaunching 之前进行

    【讨论】:

    • 这是一个很好的观点,但在我的情况下似乎并非如此。我将 appDelegate 设置为didFinishLaunching 中的UNUserNotificationCenterDelegate。为了进行实验,我将其移至 willFinishLaunching,但在 Mac 上我没有看到任何差异。
    • 我从未做过 mac-catalyst。我不知道事情是否会有所不同。 FWIW,您可以使用 UIApplicationLaunchOptionsRemoteNotificationKey 获取通知,然后自己将其传递给您的委托函数,但在我看来这不是一个非常理想的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多