是否可以在一个应用程序中添加多通知服务扩展?如果是,那么如何识别将使用哪一个以及如何使用?
基本上我的应用程序有两个服务提供商,他们都有自己的通知服务扩展有效负载,所以有什么方法可以添加两个不同的通知服务扩展并根据 serviceProvider == "1" 我的有效负载中的值可以告诉app运行serviceProvider 1的扩展
是否可以在一个应用程序中添加多通知服务扩展?如果是,那么如何识别将使用哪一个以及如何使用?
基本上我的应用程序有两个服务提供商,他们都有自己的通知服务扩展有效负载,所以有什么方法可以添加两个不同的通知服务扩展并根据 serviceProvider == "1" 我的有效负载中的值可以告诉app运行serviceProvider 1的扩展
文档对此没有任何说明。在我的测试中它不起作用。所有通知都通过一个NotificationServiceExtension
.
对于NotificationContentExtension
文档说:
您可以向您的项目添加多个通知内容应用扩展,但每个都必须支持一组唯一的通知类别。您可以在其 Info.plist 文件中指定应用扩展的类别,如声明支持的通知类型中所述。
我验证了☝️并且成功了!FWIW,您可以将单个通知内容扩展用于多个类别。
UNNotificationExtensionCategory(必填)
一个字符串或字符串数组。每个字符串都包含应用程序使用 UNNotificationCategory 类声明的类别的标识符。
还值得一提的是 a 的默认 plist 设置NotificationServiceExtension
如下所示:
它不与任何给定的类别相关联。我尝试添加NSExtensionAttributes
以及UNNotificationCategoryExtension
键值。但即使它编译,它也没有工作!我认为 Apple 决定如何使用通知服务扩展的方式基于以下两个字段:
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。