【问题标题】:Multiple Notification Service Extension in one app一个应用程序中的多个通知服务扩展
【发布时间】:2017-05-13 16:14:00
【问题描述】:

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

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

【问题讨论】:

  • 你找到答案了吗?
  • @Salah 仅供参考,我确实在不久前添加了一个答案

标签: ios objective-c swift apple-push-notifications unnotificationserviceextension


【解决方案1】:

NotificationServiceExtension

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

通知内容扩展

对于NotificationContentExtension,文档说:

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

Customizing the Appearance of Notifications docs

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

UNNotificationExtensionCategory(必填)

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

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

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

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

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

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


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

虽然不确定,但documentation on Signal's NotificationService class 支持这一理论。

// 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。

【讨论】:

  • 是的,你是对的 NotificationServiceExtension 通过单个有效负载,我通过检查有效负载然后执行任务解决了基于 NotificationService Extension 的用例。
  • 对我不起作用.. 使用的 NotificationServiceExtension 始终是我创建的第一个。有什么建议吗?
  • @arcangel06 什么不适合你?你有多个 NotificationServiceExtensions 吗?
  • @Honey 是的,我有 2 个通知扩展,每个都有不同的通知提供程序。第一个有 A 提供者,第二个有提供者 B。每个 plist 都使用 UNNotificationExtensionCategory 键构建。我在 aps 中使用“类别”键发送推送(值 = 到 UNNotificationExtensionCategory 值)。调用的服务总是第一个(A);第二个通知服务永远不会被调用。
  • @honey 对我有误解。谢谢? 使用通知类别名称解决。
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多