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" полезной нагрузки должно быть одинаковым.