Многократное расширение службы уведомлений в одном приложении

Можно ли добавить несколько расширений службы уведомлений в одном приложении? Если да, то как узнать, какое из них будет использоваться и как?

По сути, для моего приложения есть два поставщика услуг, и у каждого из них есть своя полезная нагрузка для расширения службы уведомлений, поэтому есть ли способ, которым я могу добавить два разных расширения службы уведомлений и в соответствии со значением в полезной нагрузке serviceProvider == "1" I может сказать приложение, чтобы запустить Расширение serviceProvider 1

0 ответов

NotificationServiceExtension

В документации об этом ничего не говорится. В моих тестах это не сработало. Все уведомления обрабатывались через единыйNotificationServiceExtension.

NotificationContentExtension

За NotificationContentExtension в документах говорится:

Вы можете добавить в свой проект несколько расширений приложения содержимого уведомлений, но каждое из них должно поддерживать уникальный набор категорий уведомлений. Вы указываете категории для расширения вашего приложения в его файле Info.plist, как описано в разделе Объявление поддерживаемых типов уведомлений.

Настройка внешнего вида уведомлений docs

Я проверил и все заработало!

Также стоит упомянуть, что настройки plist по умолчанию для NotificationServiceExtension выглядит так:

Он не ассоциирует себя ни с какой категорией. Я попытался добавитьNSExtensionAttributesвместе с UNNotificationCategoryExtensionключ, значение. Но даже если он скомпилирован, это не сработало!. Я думаю, что способ, которым Apple решает, как использовать расширение службы уведомлений, основан на этих двух полях:

  • Целевой объект, перед которым его bundleID имеет префикс как apns-topic
  • An NSExtensionPointIdentifer поле, которое всегда должно быть установлено на com.apple.usernotifications.service. Значение этого параметра другое для сегодняшнего расширения, расширения уведомлений о содержимом и т. Д.

Таким образом, если у вас есть два служебных расширения, система не может решить, какое из них следует отображать.

Однако настройки 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 одновременно. Потому что это пользовательский интерфейс, управляемый основным потоком.