IOS10 UNNotificationServiceExtension не вызывается

Я внедряю новое расширение iOS10 для использования богатых уведомлений. Я пытаюсь проверить его на push-уведомлениях, но не работает, я просто получаю простое уведомление и не прохожу через расширение.

Я сделал все, что он указал на официальных сайтах и ​​в некоторых других местах:

  • У меня есть приложение, которое работает с push-уведомлениями и профилем профилирования
  • Я добавил новую цель для своего приложения, расширение службы уведомлений
  • Реализован мой собственный код (это не имеет значения, потому что он даже не входит в новый класс)
  • Также мне пришлось установить профиль подготовки для этого расширения, я просто использую его с подстановочным знаком, я не вижу никакой документации, указывающей, должна ли цель расширения включать функцию push-уведомлений, в этом случае мне понадобится конкретная для этого, на данный момент я просто использую подстановочный знак, в любом случае он соответствует (он должен соответствовать) профилю, который я использую в целевой программе, и возможность push-уведомлений включена только для целевой цели приложения.
  • Я добавил UNNotificationExtensionCategory и NSExtensionPointIdentifier. Также Im отправляет категорию как часть полезной нагрузки push с сервера.

Как я уже сказал, я получаю уведомление, но никогда не просматриваю расширение. Я вижу, как ОС пытается загрузить расширение, но затем выдает ошибку без соответствующего описания для выявления проблемы:

Dec 31 21:00:00 iPhone SpringBoard(libextension.dylib)[51] <Notice>: calling plugIn beginUsing:   
Dec 31 21:00:57 iPhone pkd[86] <Notice>: assigning plug-in com.test.app.NotificationWithAttachmentExtension(1.0) to plugin sandbox   
Dec 31 21:03:57 iPhone pkd[86] <Notice>: enabling pid=51 for plug-in com.test.app.NotificationWithAttachmentExtension(1.0) 38BB5FF1-2597-42E0-B950-169DBFA80573 /private/var/containers/Bundle/Application/A8C47706-C0EC-4FB1-ABA7-0118372F6900/testapp.app/PlugIns/NotificationWithAttachmentExtension.appex   
Dec 31 21:00:53 iPhone SpringBoard(PlugInKit)[51] <Notice>: plugin com.test.app.NotificationWithAttachmentExtension interrupted   
Dec 31 21:03:56 iPhone SpringBoard(PlugInKit)[51] <Notice>: Hub connection error Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.test.app.NotificationWithAttachmentExtension" UserInfo={NSDebugDescription=connection to service named com.test.app.NotificationWithAttachmentExtension}   
Jun 29 13:33:36 iPhone SpringBoard(libextension.dylib)[51] <Notice>: PlugInKit error in beginUsing:   
Jun 17 23:33:04 iPhone SpringBoard(libextension.dylib)[51] <Notice>: killing invalid plugIn   
Dec 31 21:00:00 iPhone SpringBoard(UserNotificationsServer)[51] <Error>: Extension error whilst trying to modify push notification F502-9B36: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.test.app.NotificationWithAttachmentExtension" UserInfo={NSDebugDescription=connection to service named com.test.app.NotificationWithAttachmentExtension}   
Dec 31 21:00:00 iPhone SpringBoard(UserNotificationsServer)[51] <Notice>: [com.test.app] Saving notification F502-9B36   
Dec 31 21:00:00 iPhone SpringBoard(libextension.dylib)[51] <Notice>: completed calling plugIn beginUsing: for pid: 0  

Соответствующее расширение .plist:

  <dict>
    <key>NSExtensionAttributes</key>
    <dict>
      <key>UNNotificationExtensionCategory</key>
      <string>attachmentCategory</string>
      <key>UNNotificationExtensionInitialContentSizeRatio</key>
      <real>1</real>
    </dict>
        <key>NSExtensionPointIdentifier</key>
        <string>com.apple.usernotifications.service</string>
        <key>NSExtensionPrincipalClass</key>
        <string>$(PRODUCT_MODULE_NAME).NotificationService</string>
  </dict>

Что не так или нет?

Заранее спасибо

Ответ 1

Наконец, я правильно работаю, и это то, что я помню из этой проблемы.

1) Не используйте устройства с бета-версией iOS10, потому что одна из проблем у меня была, потому что я использовал бета-версию.

2) только приложение требует права доступа APNS, это не требуется для секретности, используемой для расширения.

3) Я использовал профиль подготовки, соответствующий идентификатору расширения (не подстановочный знак), так или иначе, я не могу подтвердить, работает ли он отлично или нет с подстановочным знаком.

4) NSExtensionAttributes не требуется, просто используйте NSExtensionPointIdentifier и NSExtensionPrincipalClass для расширения .plist. Если вы не используете свой собственный макет

5) Это работает даже с использованием методов регистрации токенов IOS 9.

6) не забывайте значение изменяемого содержимого в полезной нагрузке, входящей в push-уведомление, это единственное обязательное значение, которое вам нужно от сервера, чтобы пройти через расширение.

Я думаю, что это охватывает все проблемы, которые у меня были

Ответ 2

То, что может сделать трюк, - проверить цель развертывания для расширения. Шахта была установлена ​​на уровне 10.2, в то время как устройство, которое я тестировал, было (все еще) с использованием 10.1

После изменения цели развертывания на 10.0 экземпляр UNNotificationServiceExtension был вызван отлично

Ответ 3

И если вы все сделали правильно, не забудьте присоединить его к процессам.

После запуска приложения, содержащего расширение:

  • Установите точку останова в расширении
  • Выберите Debug/Attach to Process с помощью PID или имени
  • Введите имя цели расширения
  • Запуск уведомления о нажатии

Ответ 4

Пришел сюда второй раз. В первый раз этот ответ помог мне, во второй раз этого не произошло. После большого (внутреннего) ругательства я узнал, что каким-то образом случайно удалил расширение из встроенных двоичных файлов в свою главную цель приложения. Когда я добавлю назад, мое расширение будет вызвано снова.

Итак, проверьте это:

  • Нажмите на проект приложения слева.
  • Нажмите главную цель своего приложения.
  • Выберите "Общие".
  • В разделе "Встроенные двоичные файлы" убедитесь, что ваш добавочный номер указан, если нет, добавьте его.

Ответ 5

Если вы используете Firebase, попробуйте изменить полезную нагрузку следующим образом:

{
   "aps" : {
      "category" : "SECRET",
      "mutable_content" : true,
      "alert" : {
         "title" : "Secret Message!",
         "body"  : "(Encrypted)"
     },
   },
   "ENCRYPTED_DATA" : "Salted__·öîQÊ$UDì_¶Ù∞è   Ω^¬%gq∞NÿÒQùw"
}

Поле mutable_content сопоставляется с полем изменяемого содержимого в APN. Для более подробной информации перейдите по этой ссылке.

Ответ 6

Кажется, что ваш plist смешивает 2 слоя. В игре есть 2 расширения:

  • Расширение содержимого уведомлений - отвечает за отображение содержимого с помощью контроллера вида
  • Расширение службы уведомлений - отвечает за выборку содержимого в фоновом режиме до уведомления.

Здесь находится plist для цели Notification Content Extension:

введите описание изображения здесь

Здесь находится тарелка для цели Notification Service Extension:

r

Ответ 7

После того, как многие из возможных исправлений уже заданы без успеха, мне стало ясно, что фреймворк был ошибочно добавлен к нашей цели расширения, а не к цели unit test.

Удаление фреймворка и таргетинга 10.2 позволило снова вызвать мое расширение.

Если вам интересно, в какой структуре по какой-либо причине вы можете найти ее здесь: https://github.com/plu/JPSimulatorHacks

Ответ 8

Моя проблема была в два раза. Первым, вероятно, было то, что я установил свойство Info.plist NSExtensionPrincipalClass на bundle.identifier.NotificationService вместо ProductModuleName.NotificationService. Имя модуля по умолчанию, но я ошибочно изменил его на идентификатор при отладке некоторых других вещей, связанных с различными схемами и разными целями.

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

Как я обнаружил выше, было создание нового тестового проекта с минимальным кодом. В ретроспективе я определенно рекомендую этот подход вместо того, чтобы опробовать все различные решения, найденные в stackoverflow и т.д.

Ответ 9

Swift 5 Простой способ

 this is very easy way just do it like this

enter image description here

Ответ 10

В моем случае это было то, что я забыл выбрать NotificationServiceExtension в Схеме как отдельное приложение вместо "моего приложения", где я пытаюсь его использовать. Поэтому я запустил "мое приложение" и ждал точек останова в коде другого приложения (NotificationServiceExtension) и по этой причине они так и не появились. Я попробовал все предложения до этого.

Ответ 11

Метод public func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void) в UNNotificationServiceExtension изменился между быстрыми версиями.

Некоторые онлайн-примеры не обновлены.

Убедитесь, что метод, который вы переопределяете в своем пользовательском подклассе UNNotificationServiceExtension

У меня было:

func didReceive(request: UNNotificationRequest, withContentHandler contentHandler:(UNNotificationContent) -> Void)

который не работал до тех пор, пока я не изменил на:

func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)

Ответ 12

Убедитесь, что у вас установлена ​​конфигурация "Нет". Посмотрите на скриншот. С другими параметрами didReceive не работает.

Конфигурация

Ответ 13

Если у меня возникла та же проблема, то я решил удалить расширение из Embedded Binaries и снова добавить его.

Ответ 14

Другая возможность - проверить имя категории в файле plist файла UNNotificationContentExtension.

Строковое значение "UNNotificationExtensionCategory" в plist и "category/click_action" полезной нагрузки должно быть одинаковым.