应用关闭时如何处理 UNNotificationAction?

Posted

技术标签:

【中文标题】应用关闭时如何处理 UNNotificationAction?【英文标题】:How to handle UNNotificationAction when app is closed? 【发布时间】:2016-09-23 07:34:12 【问题描述】:

当应用关闭(不在后台)时如何处理新的 ios10 通知操作?

当应用程序被最小化时,一切正常:

UNUserNotificationCenter.current().delegate = x

并处理它

class x: UNUserNotificationCenterDelegate 
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Swift.Void) 
    

但是当应用程序关闭并且用户在通知中点击操作时不会调用任何内容...也许我无法处理后台任务并且我总是必须启动应用程序?

【问题讨论】:

我发现它只发生在我的真实设备上,模拟器没问题 【参考方案1】:

通知操作按钮处理可以在ExtensionContaining App 中完成。

点击操作按钮时,句柄首先转到Extension,然后根据需要转到Containing App。如果Extension 不处理通知动作,则将句柄传递给containing app.

点击按钮启动您的应用(在前台或 背景)并让您有机会执行指定的操作。

在扩展中处理:

func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void)

     //You need to handle all the actions that appear with notification..
     completion(.dismissAndForwardAction)

完成闭包采用 UNNotificationContentExtensionResponseOption 类型的值:

enum UNNotificationContentExtensionResponseOption : UInt

    case doNotDismiss //the custom UI is not dismissed after handling the action
    case dismiss //the custom UI is dismissed after handling the action
    case dismissAndForwardAction //the custom UI is dismissed after handling the action and the control is then passed to containing app for any additional handling

在包含应用程序中的处理:

extension AppDelegate : UNUserNotificationCenterDelegate

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
    
        // Action handling - handling for all actions is not required
        completionHandler()
    

更多内容可以参考这个(https://github.com/pgpt10/RichNotificationSample)教程。

【讨论】:

我花了一段时间才明白UNNotificationContentExtension不是使用典型的didReceive 方法。相反,它使用的是签名略有不同的方法。它以completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) 结尾,并且该功能是UNNotificationContentExtension 独有的,即它不是由UNUserNotificationCenterDelegate 实现的东西【参考方案2】:

是的,它总是启动应用程序,当用户点击通知中的操作时,按钮会启动您的应用程序。 来自apple doc的一些行:

点击按钮会启动您的应用程序(在前台或后台),并让您有机会执行指定的操作。您可以使用此类指定按钮中显示的文本以及您的应用执行相应操作所需的信息。

【讨论】:

我已经创建了新项目并且它在那里工作。我通过设置通知 badgeIcon = 1 来调试它,并通过操作再次将其设为 0。但是在我的大项目中,当应用程序关闭时,将 badgeIcon 重置为 0 不起作用。没有任何工作,关闭应用程序时没有任何操作,但在后台 - 工作。我的项目有问题,但是什么? 您的应用没有问题。由于推送通知由 iOS 而非您的应用处理,因此您无法在 Notification on Killed 中接收或取消推送通知时更改应用程序徽章。 但是模拟器可以做到。我们正在谈论本地通知【参考方案3】:

“点击一个按钮启动你的应用程序(在前台或后台)并给你一个机会......” 这些行出现在 UIUserNotificationAction, 的文档中,在 iOS10 中已被弃用。

原来的问题是指 iOS 11 中的 UNUserNotificationCenterDelegate。 相关文档:Declaring Your Actionable Notification Types

引用文档:

当用户选择一个动作时,系统会在 背景并通知共享的 UNUserNotificationCenter 对象, 通知其代表。使用您的委托对象 userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler: 方法来识别选定的操作并提供适当的 回应。

【讨论】:

以上是关于应用关闭时如何处理 UNNotificationAction?的主要内容,如果未能解决你的问题,请参考以下文章

用户关闭应用程序时如何处理用户在 Xamarin iOS 上单击本地通知?

IOS,应用启动时如何处理多个本地通知?

db关闭时如何处理flyway

应用未运行时如何处理远程通知

UILocalNotification - 应用程序未运行时如何处理?

当应用程序不在后台运行时如何处理推送通知