声明你允许使用的通知类型

区分你的通知,并将操作按钮添加到通知界面。

概述

可操作的通知使用户无需启动相应的应用程序即可响应已发送的通知。其他通知会在通知界面中显示信息,但是用户唯一的操作方法是启动应用程序。对于可操作的通知,系统除显示通知界面外,还显示一个或多个按钮。 轻击按钮会将选定的动作发送到应用程序,然后该应用程序在后台处理该动作。

要支持可行的通知,你必须:

  • 在启动时从你的iOS应用声明一个或多个通知类别。
  • 将适当的操作分配给你的通知类别。
  • 处理你注册的所有操作。
  • 生成通知时,将category标识符分配给通知有效负载。

注意

系统还使用category来确定是启动通知服务应用扩展还是通知内容应用扩展。有关如何创建Notification Service应用程序扩展的信息,请参阅在新发送的通知中修改内容。有关如何创建通知内容应用程序扩展的信息,请参阅自定义通知的外观

声明您的自定义操作和通知类型

因为你的应用程序必须处理所有操作,所以你必须在启动时声明应用程序支持的操作。你可以使用categoryaction对象的组合来声明操作。UNNotificationCategory对象定义你的应用程序支持的通知类型,UNNotificationAction对象定义每种类型显示的按钮。例如,会议邀请的通知可能包括接受或拒绝邀请的按钮。

每个UNNotificationCategory对象都有一个唯一的标识符和用于处理该类型通知的选项。标识符属性中的字符串是category对象的最重要部分。生成通知时,必须在通知的有效负载中包含相同的字符串。系统使用该字符串来找到相应的category对象和对应的操作。

要将操作与通知类别关联,请为其分配一个或多个UNNotificationAction对象。每个action对象都包含要向用户显示的本地化字符串和指示你要如何处理该操作的选项。例如,当你将一个动作标记为破坏性动作时,系统会以不同的高亮显示该动作以指示其行为。

下面代码显示了如何通过两个操作来注册自定义类别。除了标题和选项外,每个动作还具有唯一的标识符。当用户选择操作时,系统会将该标识符传递给你的应用。

  1. // Define the custom actions.
  2. let acceptAction = UNNotificationAction(identifier: "ACCEPT_ACTION",
  3. title: "Accept",
  4. options: UNNotificationActionOptions(rawValue: 0))
  5. let declineAction = UNNotificationAction(identifier: "DECLINE_ACTION",
  6. title: "Decline",
  7. options: UNNotificationActionOptions(rawValue: 0))
  8. // Define the notification type
  9. let meetingInviteCategory =
  10. UNNotificationCategory(identifier: "MEETING_INVITATION",
  11. actions: [acceptAction, declineAction],
  12. intentIdentifiers: [],
  13. hiddenPreviewsBodyPlaceholder: "",
  14. options: .customDismissAction)
  15. // Register the notification type.
  16. let notificationCenter = UNUserNotificationCenter.current()
  17. notificationCenter.setNotificationCategories([meetingInviteCategory])

重要

你所有的action对象都必须具有唯一的标识符。 在处理动作时,标识符是区分一个动作与另一个动作的唯一方法,即使这些动作属于不同的类别。

大多数操作只是允许用户选择,但是文本输入操作也允许用户键入基于文本的自定义响应。然后,你的应用可以将用户键入的响应传递到你对操作的处理中。例如,消息传递应用程序可以将键入的文本作为对传入消息的响应进行发送。 若要创建文本输入操作,请创建UNTextInputNotificationAction对象而不是UNNotificationAction对象。 当用户点击按钮进行文本输入操作时,系统将显示一个可编辑的文本字段。向你的应用报告操作时,系统会包含用户键入的文本作为响应的一部分。

在有效负载中包括通知类别

系统仅针对其有效负载包含有效类别标识符字符串的通知显示其对应的操作。系统使用类别标识符来查找你应用程序的已注册的类别及其相关操作。然后,它使用该信息将操作按钮添加到通知界面。

要将类别分配给本地通知,请将适当的字符串分配给UNMutableNotificationContent对象的categoryIdentifier属性。 下面代码显示了本地通知内容的创建。 除了基本信息之外,此代码还将自定义数据添加到通知的userInfo字典中,以供以后处理邀请。

  1. let content = UNMutableNotificationContent()
  2. content.title = "Weekly Staff Meeting"
  3. content.body = "Every Tuesday at 2pm"
  4. content.userInfo = ["MEETING_ID" : meetingID,
  5. "USER_ID" : userID ]
  6. content.categoryIdentifier = "MEETING_INVITATION"

要将类别标识符添加到远程通知中,请在JSON有效负载的aps字典中包括category关键字,如下面代码所示。将此关键字的值设置为适当的类别字符串。在示例中,类别设置为与先前定义的会议邀请类别相同。与本地通知示例一样,有效负载包括带有会议ID和用户ID的自定义键,这些自定义键被放入有效负载的userInfo字典中。 该应用可以使用该信息来接受或拒绝邀请。

  1. {
  2. aps : {
  3. category : MEETING_INVITATION
  4. alert : {
  5. title : Weekly Staff Meeting
  6. body : Every Tuesday at 2pm
  7. },
  8. },
  9. MEETING_ID : 123456789”,
  10. USER_ID : ABCD1234
  11. }

处理选定的操作

你的应用必须处理其定义的所有操作。 当用户选择一个操作时,系统会在后台启动你的应用程序,并通知共享的UNUserNotificationCenter对象,该对象将通知其delegate。使用delegate对象的userNotificationCenter(_:didReceive:withCompletionHandler:)方法来标识选定的操作并提供适当的响应。

下面的代码显示了用于管理会议邀请的应用程序的delegate方法的实现。该方法使用响应的actionIdentifier属性来确定是接受还是拒绝给定邀请。它还依靠来自通知有效负载的自定义数据来成功处理通知。完成操作后,请始终调用完成处理程序。

  1. func userNotificationCenter(_ center: UNUserNotificationCenter,
  2. didReceive response: UNNotificationResponse,
  3. withCompletionHandler completionHandler:
  4. @escaping () -> Void) {
  5. // Get the meeting ID from the original notification.
  6. let userInfo = response.notification.request.content.userInfo
  7. let meetingID = userInfo["MEETING_ID"] as! String
  8. let userID = userInfo["USER_ID"] as! String
  9. // Perform the task associated with the action.
  10. switch response.actionIdentifier {
  11. case "ACCEPT_ACTION":
  12. sharedMeetingManager.acceptMeeting(user: userID,
  13. meetingID: meetingID)
  14. break
  15. case "DECLINE_ACTION":
  16. sharedMeetingManager.declineMeeting(user: userID,
  17. meetingID: meetingID)
  18. break
  19. // Handle other actions…
  20. default:
  21. break
  22. }
  23. // Always call the completion handler when done.
  24. completionHandler()
  25. }

重要

如果你对某个操作的响应涉及访问磁盘上的文件,请考虑使用其他方法。用户可以在设备锁定时对操作做出响应,这会使使用complete选项加密的文件对你的应用程序不可用。如果发生这种情况,你可能需要暂时保存更改,然后将其集成到应用程序的数据结构中。