9

是否可以在一个应用程序中添加多通知服务扩展?如果是,那么如何识别将使用哪一个以及如何使用?

基本上我的应用程序有两个服务提供商,他们都有自己的通知服务扩展有效负载,所以有什么方法可以添加两个不同的通知服务扩展并根据 serviceProvider == "1" 我的有效负载中的值可以告诉app运行serviceProvider 1的扩展

4

1 回答 1

4

通知服务扩展

文档对此没有任何说明。在我的测试中它不起作用。所有通知都通过一个NotificationServiceExtension.

通知内容扩展

对于NotificationContentExtension文档说:

您可以向您的项目添加多个通知内容应用扩展,但每个都必须支持一组唯一的通知类别。您可以在其 Info.plist 文件中指定应用扩展的类别,如声明支持的通知类型中所述。

自定义通知文档的外观

我验证了☝️并且成功了!FWIW,您可以将单个通知内容扩展用于多个类别。

UNNotificationExtensionCategory(必填)

一个字符串或字符串数​​组。每个字符串都包含应用程序使用 UNNotificationCategory 类声明的类别的标识符。

还值得一提的是 a 的默认 plist 设置NotificationServiceExtension如下所示:

在此处输入图像描述

它不与任何给定的类别相关联。我尝试添加NSExtensionAttributes以及UNNotificationCategoryExtension键值。但即使它编译,它也没有工作!我认为 Apple 决定如何使用通知服务扩展的方式基于以下两个字段:

  • 一个以其 bundleID 为前缀的目标apns-topic
  • NSExtensionPointIdentifer必须始终设置为的字段com.apple.usernotifications.service。this 的值对于今天的扩展或内容通知扩展等是不同的。

因此,如果您有两个服务扩展,那么系统无法决定应该显示哪一个

但是,a 的默认 plist 设置NotificationContentExtension确实有UNNotificationCategoryExtension键,包括值:

在此处输入图像描述


还要更多地考虑这一点,如果一个应用程序有 5 个不同的类别,并且每个类别都有一个服务扩展并一次接收它们,那么它将启动 5 个不同的进程(想想 5 个并行didFinishLaunchingWithOptions回调。每个类别一个和过程),这对操作系统不利。

虽然不确定,但Signal 的 NotificationService 类的文档支持这一理论。

// Note that the NSE does *not* always spawn a new process to
// handle a new notification and will also try and process notifications
// in parallel. `didReceive` could be called twice for the same process,
// but will always be called on different threads. To deal with this we
// ensure that we only do setup *once* per process and we dispatch to
// the main queue to make sure the calls to the message fetcher job
// run serially.

对于NotificationContentExtension. 它不能一次处理 5 个 contentExtensions。因为它是一个由主线程控制的 UI。

于 2020-02-20T19:40:38.517 回答