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

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

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

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

Что не так или отсутствует?


comment
Попробуйте добавить это: ‹key›UNNotificationExtensionDefaultContentHidden‹/key› ‹true/› в NSExtensionAttributes   -  person Or Arbel    schedule 07.10.2016
comment
Вы когда-нибудь находили решение? Если да, не могли бы вы описать это или поделиться ссылкой, так как мы сталкиваемся с похожей проблемой...   -  person electronix384128    schedule 20.12.2016
comment
@BenMarten, наконец-то у меня это работает правильно, и вот что я помню из этой проблемы:   -  person Rodrigo.C    schedule 20.12.2016
comment
комментарий ниже в качестве ответа, это было слишком долго, чтобы поместить его в качестве комментария...   -  person Rodrigo.C    schedule 20.12.2016
comment
Немного оффтоп, но как получить лог трамплина? 31 дек 21:00:00 iPhone SpringBoard   -  person Juan Pedro Lozano    schedule 28.12.2016
comment
@JuanPedroLozano Это из журналов устройства — вы можете найти его в «Окно» -> «Устройства» -> «Выбрать текущее устройство».   -  person Teffi    schedule 13.01.2017
comment
По-видимому, расширение работает как отдельное приложение (поэтому точки останова не срабатывают). Но я узнал, что отправка категории с вашим уведомлением делает так, что приложение не отображает кнопки действий или изображения.   -  person Sean Calkins    schedule 27.04.2018


Ответы (19)


Что также может помочь, так это проверить цель развертывания на наличие расширения. Мой был установлен на 10.2, в то время как устройство, на котором я тестировал, (все еще) использовало 10.1

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

person basvk    schedule 02.02.2017
comment
Отлично. Я сделал ту же ошибку. Большое спасибо. - person Vijay; 31.03.2017
comment
Боже мой! Это действительно красивое и простое решение. Я даже не подумал это проверить. - person S. Matsepura; 02.06.2017
comment
Благодарю вас! БОЛЬШОЕ СПАСИБО @basvk Я интегрировал push-библиотеку для одной из целей, а затем на той же неделе мне пришлось повторно интегрировать вторую цель. ОБА РАЗа я потратил так много времени, не проверяя цель, и в итоге остановился на вашем ответе. - person Durdu; 29.08.2017
comment
Большое спасибо, это мне очень помогло. Я использовал устройство 10.1, когда целью развертывания расширения была версия 10.3. - person aparesidam; 13.09.2017
comment
Лицевая ладонь. Я в этом вопросе 3-й раз. Этот ответ помог мне во второй раз. В следующий раз обещаю отправить торт. ???? - person Jonny; 24.05.2018
comment
Потратив пару дней, это, наконец, исправило это. Спасибо @basvk - person NSF; 24.08.2018
comment
Я думаю, это происходит потому, что Xcode устанавливает последнюю версию SDK при создании расширения. Поэтому я столкнулся с той же проблемой на одном из моих тестовых устройств... - person Sebastian; 26.01.2019
comment
Вы молодец, но если вы прикрепите снимок экрана, это также будет очень полезно - person Shakeel Ahmed; 25.07.2019
comment
Спасибо, я работаю в учебнике, я следую точно так же, но не работаю. Ты же мои дни. @басвк - person Ilesh P; 06.07.2020

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

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

  1. Установите точку останова в расширении
  2. Выберите Отладка/Присоединение к процессу по PID или имени
  3. Введите имя цели расширения
  4. Активировать push-уведомление
person Wojtek Dmyszewicz    schedule 09.05.2017
comment
+1 Этот ответ был очень полезен, так как я забыл, что это отдельный процесс, и ожидал, что точки останова сработают, если я просто запускаю процесс приложения. - person markquezada; 15.12.2017
comment
Класс NotificationService там не отображается!! - person Basir Alam; 23.02.2018
comment
попробуйте добавить его вручную, когда вы начнете вводить имя, оно должно появиться @Basir Alam - person stan; 17.01.2019
comment
@BasirAlam из здесь Если вы Если вы пытаетесь отладить расширение, которое запускается ОС, вам нужно что-то сделать, чтобы ОС запустила его. Только после этого вы сможете подключить его к отладчику. - person Honey; 16.06.2020
comment
не знал, что так можно сделать, спасибо дружище! - person Gary O' Donoghue; 07.04.2021

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

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

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

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

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

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

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

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

person Rodrigo.C    schedule 20.12.2016
comment
нам нужно создать отдельный идентификатор пакета и профиль обеспечения в центре участников для UNNotificationServiceExtension? - person Mahesh Cheliya; 02.08.2017
comment
Для расширения приложения требуется APN, иначе оно НЕ скомпилируется. - person DawnSong; 27.02.2018
comment
то же самое не работает, пожалуйста, может кто-нибудь поделиться кодом делегата приложения, что он сделал???????? - person Shakeel Ahmed; 23.07.2019
comment
все правильно поставил. Но все равно не работает :( - person Beu; 17.05.2020

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

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

Поле mutable_content сопоставляется с полем mutable-content в APN. Чтобы получить дополнительные сведения, перейдите по этой ссылке.

person AnitaAgrawal    schedule 14.11.2018
comment
При использовании обычного API, отличного от Firebase, поле называется mutable-content и должно быть рядом с атрибутом предупреждения. - person N S; 31.05.2020
comment
@CalS правильно! По-видимому, если значение mutable-content отличается от false или 0, считается, что уведомление имеет изменяемое содержимое. - person Laura Corssac; 09.06.2020

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

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

  1. Нажмите на свой проект приложения слева.
  2. Нажмите на цель вашего основного приложения.
  3. Выберите Общие.
  4. В разделе «Встроенные двоичные файлы» убедитесь, что ваше расширение указано в списке, если нет, добавьте его.
person Jonny    schedule 15.12.2017

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

person shanizoe    schedule 12.06.2019
comment
Этот. Невероятно, но ЭТО решило это для меня. Я два дня билась головой о стену. - person Gasper; 20.05.2020
comment
После долгих часов это было для меня исправлением. Я реализовал богатый толчок много раз. Но в этот раз как-то не сработало для моего нового проекта. Этот ответ что-то изменил, теперь он работает. Спасибо. - person mkeremkeskin; 18.06.2020
comment
Невероятно, за это нужно больше голосов! Спас мой день после 4 часов ругани ^_^ - person Niko Zarzani; 01.04.2021
comment
это сумасшедшее исправление - попробуйте, у меня тоже проблема исправлена! - person Blackvenom; 06.05.2021

Свифт 5 Легкий способ

 this is very easy way just do it like this

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

person Shakeel Ahmed    schedule 25.07.2019
comment
Эта работа для меня, выставляй меня дураком :joy: - person 蘇健豪; 25.03.2021

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

  1. Расширение содержимого уведомлений — отвечает за отображение содержимого через контроллер представления.
  2. Расширение службы уведомлений — отвечает за получение содержимого в фоновом режиме перед отображением уведомления.

Вот plist для цели Notification Content Extension:

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

Вот plist для цели Notification Service Extension:

р

person Or Arbel    schedule 07.10.2016
comment
ссылка не работает. вы отправляете mutable-content: 1 в полезной нагрузке апс? - person Or Arbel; 07.10.2016
comment
да собственно ошибку я вижу в логе устройства если когда ОС уже нашла мое расширение но не запускала код. Так что изменяемый контент был проверен уже в то время (без этого даже не будет проверяться наличие расширений notif) - person Rodrigo.C; 07.10.2016
comment
ты разобрался? - person Romk1n; 11.11.2016
comment
Вы нашли какое-нибудь решение для этого? - person Priyanka Mistry; 15.11.2017

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

person Omar Basem    schedule 26.08.2020
comment
спас мой день. У меня было 14.0 в моем основном приложении и 14.1 в сервисном расширении. Не работал. Изменил сервисное расширение на 14.0 и сразу заработало. Спасибо! - person zumzum; 05.11.2020

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

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

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

person Jon Whitmore    schedule 16.08.2017
comment
Спас меня от большой беды, приятель. Спасибо! - person Quaggie; 28.01.2020

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

person Danil    schedule 03.08.2019
comment
Я потратил четыре часа своей жизни, пока не нашел это решение. Будьте здоровы! - person R. Campos; 02.04.2021

Для тех, кто хочет просто активировать точку останова в расширении уведомлений вашего приложения, процесс в Xcode 11.3 довольно прост:

  1. Выберите схему расширения (не схему родительского приложения).
  2. Выберите Edit Scheme.
  3. Выберите исполняемый файл в качестве родительского приложения.
  4. Снимите флажок Debug executable. Сняв этот флажок, вы сообщаете Xcode, что нужно отлаживать расширение вместо родительского приложения. Это ключ к тому, чтобы заставить Xcode останавливаться в точках останова расширения.
  5. Выберите Automatically под опцией Launch.
  6. Запустите схему расширения (не родительского приложения).
  7. Отправьте уведомление на ваше устройство. Выгода.

Если какие-то другие вещи не вызывают капризности Xcode, приведенные выше настройки должны гарантировать, что всякий раз, когда вы выбираете и запускаете схему расширения, точки останова внутри расширения будут срабатывать. Вы можете вернуться и проверить Debug executable на шаге 4, если хотите, чтобы Xcode останавливался в точках останова в родительском приложении.

Совет: не забудьте добавить "mutable-content": 1 в полезную нагрузку JSON уведомления, иначе у вас будет большая печаль (iOS не будет вызывать расширение без этого ключа).


Вот изображение моего диалогового окна редактора схемы для расширения уведомлений:

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

person rainypixels    schedule 14.02.2020

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

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

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

person Simon Bengtsson    schedule 15.12.2017

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

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

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

Я имел:

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

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

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

person Or Arbel    schedule 04.10.2016
comment
Спасибо за комментарий. Я только что проверил, но у меня есть правильный метод, я использую Objective-c, и у меня есть точно такой же метод, что и в интерфейсе (UNNotificationServiceExtension) - person Rodrigo.C; 04.10.2016
comment
Понятно. Вы отправляете категорию в push-полезной нагрузке (на стороне сервера)? - person Or Arbel; 05.10.2016
comment
вероятно, нет, у нас была базовая функциональность для нашего сервера APNS, и мы добавили только то, что предложила Apple (изменяемый контент и любую дополнительную информацию, которую мы хотим прочитать на клиенте). - person Rodrigo.C; 05.10.2016
comment
Я попытался установить эту категорию в соответствии со спецификациями Apple (конфигурация plist и значение на стороне сервера), но все равно не работает. Я вижу, что в спецификациях Apple упоминается NSExtensionAttribute, но во многих примерах кода используются NSExtensionAttributes (множественное число), я на всякий случай попробовал оба, но результат все равно тот же. очень неприятно иметь эту ошибку без какого-либо описания того, что не так, простого сообщения, объясняющего, что Apple пытается проверить, было бы достаточно, чтобы определить проблему ... - person Rodrigo.C; 06.10.2016
comment
Это определенно NSExtensionAttributes, можете ли вы опубликовать соответствующий список? - person Or Arbel; 07.10.2016
comment
Я добавил больше информации в свой пост - person Rodrigo.C; 07.10.2016
comment
убедитесь, что вы отправляете category: attachmentCategory в полезной нагрузке aps - person Or Arbel; 07.10.2016
comment
да, это сделано, и я вижу, что устройство правильно подходит (есть журнал, показывающий данные апс) - person Rodrigo.C; 07.10.2016
comment
необходимы ли NSExtensionAttributes? Я могу заставить его работать над сборкой разработки без него. - person Tony Friz; 07.10.2016
comment
Вы сможете создавать без проблем, просто push не вызовет расширение содержимого уведомлений. - person Or Arbel; 07.10.2016

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

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

person Dmytro Bohachevskyy    schedule 06.07.2017

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

Строковое значение «UNNotificationExtensionCategory» в plist и «category/click_action» полезной нагрузки должно совпадать.

person βhargavḯ    schedule 03.10.2019

После борьбы с этим я, наконец, сделал эту работу для меня, просто изменив 2 вещи.

  1. Идентификатор bundleID целевого объекта NotificationServiceExtension должен быть другим. Предпочтительный стиль com.companyname.appname.notificationservice(любой). Установка того же идентификатора пакета, что и для приложения, приводит к сбою сборки на устройство.
  2. Главное — цель развертывания. Я дважды проверял это с целью приложения, но мы также должны проверить цель развертывания недавно созданной цели NotificationServiceExtenion, которая по умолчанию является последней версией. Установите минимальную версию iOS, которую вы хотели бы поддерживать, но выше, чем iOS 10.

Примечание. Убедитесь, что у вас есть «изменяемый контент»: 1 в удаленной полезной нагрузке.

Надеюсь, это поможет кому-то.

person techgentsia    schedule 07.05.2020

В настоящее время я работаю над Xcode 12.3 и Swift 5.2, и когда я отменил цель основного проекта и цель расширения службы уведомлений с iOS 14.2 на iOS 13.2, это сработало!

person andy0570    schedule 21.12.2020

Система выполняет ваше расширение приложения содержимого уведомлений только в том случае, если полезная нагрузка удаленного уведомления содержит следующую информацию:

  • Полезная нагрузка должна включать ключ mutable-content со значением 1.

  • Полезная нагрузка должна включать словарь предупреждений с информацией title, subtitle или body.

Указание полезной нагрузки удаленного уведомления:

{
   “aps” : {
      “category” : “SECRET”,
      “mutable-content” : 1,
      “alert” : {
         “title” : “Secret Message!”,
         “body”  : “(Encrypted)”
     },
   },
   “ENCRYPTED_DATA” : “Salted__·öîQÊ$UDì_¶Ù∞è   Ω^¬%gq∞NÿÒQùw”
}
person NSPratik    schedule 22.04.2020