一款应用程序中的多通知服务扩展

10

一个应用程序中是否可以添加多个通知服务扩展?如果可以的话,如何识别将使用哪一个并且怎么做呢?

基本上我的应用有两个服务提供商,他们都有自己的通知服务扩展的有效负载,那么是否有办法可以添加两个不同的通知服务扩展,并根据serviceProvider ==“1”的有效负载值告诉应用运行serviceProvider 1的扩展?


你找到答案了吗? - Salah
@Salah FYI 我之前添加了一个答案。 - mfaani
1个回答

6

NotificationServiceExtension

文档中没有提到这个。在我的测试中它并不起作用。所有通知都会通过一个单一的 NotificationServiceExtension 处理。

NotificationContentExtension

对于NotificationContentExtension,文档说:

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

自定义通知外观文档

我进行了验证 ☝️,它有效!值得一提的是,您可以使用单个通知内容扩展来处理多个类别。

UNNotificationExtensionCategory(必需)

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

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

enter image description here

它本身不与任何给定的类别相关联。我尝试添加了NSExtensionAttributes和一个UNNotificationCategoryExtension键值对。但是,即使编译通过,它也没有起作用!我认为Apple决定如何使用通知服务扩展是基于这两个字段:

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

因此,如果您有两个服务扩展,则系统无法确定应显示哪一个

然而,默认的NotificationContentExtension的plist设置确实包括UNNotificationCategoryExtension键值对:

enter image description here


此外,更深入地考虑,如果一个应用程序有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.
< p > 对于 NotificationContentExtension 来说,情况并非如此。它无法同时处理 5 个 contentExtensions。因为它是一个由主线程控制的 UI 功能。


是的,你说得对。NotificationServiceExtension 会通过单个负载,我通过检查负载并执行任务来解决我的用例。 - user1169079
对我不起作用...使用的NotificationServiceExtension始终是我创建的第一个。有什么建议吗? - arcangel06
@arcangel06,你遇到了什么问题?你有多个NotificationServiceExtensions吗? - mfaani
@Honey 是的,我有两个通知扩展,每个扩展都有不同的通知提供程序。第一个扩展使用 A 提供程序,第二个扩展使用 B 提供程序。 每个 plist 都使用 UNNotificationExtensionCategory 键构建。 我在 aps 中使用“category”键发送推送(值为 UNNotificationExtensionCategory 值)。始终调用的服务是第一个(A);第二个通知服务从未被调用。 - arcangel06
@honey,这是我的误解。谢谢你,我已经通过通知类别名称解决了这个问题。 - arcangel06

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接