iOS10 UNNotificationServiceExtension не вызывается
Im реализации нового расширения iOS10 для использования богатых уведомлений. Я пытаюсь проверить его на push-уведомлениях, но не работает, я просто получаю простое уведомление и не проходит через расширение.
Я сделал все, что указано на официальных сайтах и в некоторых других местах:
- у меня есть мое приложение и работает с push-уведомлениями и правильным профилем подготовки
- я добавил новую цель в мое приложение, службу уведомлений Расширение
- реализован мой собственный код (это не имеет значения, потому что даже не входит в новый класс)
- также мне пришлось установить профиль подготовки для этого расширения, я просто использую один с подстановочным знаком, я не вижу никакой документации, указывающей, должна ли цель расширения включать возможность push-уведомлений, в этом случае мне понадобится конкретная подготовка для этого, на данный момент я просто использую подстановочный знак prov, в любом случае он соответствует (он должен соответствовать) профилю I используйте в целевом приложении, и функция 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>
что не так или не хватает?
спасибо заранее
9 ответов
что также может сделать трюк, это проверить вашу цель развертывания для расширения. Мой был установлен на 10.2
в то время как устройство, на котором я тестировал, было (все еще) с помощью 10.1
после изменения цели развертывания 10.0
на UNNotificationServiceExtension
экземпляр был вызван совершенно
и если вы все сделали правильно, не забудьте прикрепить ее к обработке.
после запуска приложения, содержащего расширение:
- установите точку останова в расширении
- выберите Debug / Attach to Process по PID или name
- введите имя целевого объекта расширения
- вызвать push-уведомление
наконец, у меня это работает правильно, и это то, что я помню из этой проблемы.
1) Не используйте устройства с бета-версией iOS10, потому что одна из проблем у меня была, потому что я использовал бета-версию.
2) только приложение запрашивает права APNS, это не требуется для privisoning, используемого для расширения.
3) я использовал профиль подготовки, соответствующий идентификатору расширения (не подстановочный знак), в любом случае я не могу подтвердить, работает ли он хорошо или нет с подстановочным знаком.
4) NSExtensionAttributes не требуются, просто используйте nsextensionpointidentifier и NSExtensionPrincipalClass для расширения .файл plist. Если вы не используете свой собственный макет
5) это работает даже с использованием методов регистрации токенов iOS 9.
6) Не забудьте значение изменяемого содержимого в полезной нагрузке, поступающей в push-уведомлении, это единственное обязательное значение, которое вам нужно от сервера, чтобы пройти расширение.
Я думаю, что это охватывает все проблемы, которые у меня были
пришел сюда во второй раз. В первый раз, ответ помог мне, во второй раз, это не помогло. После многих (внутренних) ругательств я обнаружил, что каким-то образом случайно удалил расширение из встроенных двоичных файлов в моей основной цели приложения. Когда я добавлю расширение обратно, мое расширение будет вызвано снова.
Так что проверьте это:
- нажмите на свой проект приложения слева.
- нажмите на приложение цель.
- Выбрать "Общие".
- во встроенных двоичных файлах убедитесь, что ваше расширение указано, если нет, добавьте его.
похоже, что ваш plist смешивает 2 plist. В игре есть 2 расширения:
- расширение содержимого уведомлений-отвечает за отображение содержимого с помощью контроллера вида
- расширение службы уведомлений-отвечает за извлечение контента в фоновом режиме, прежде чем уведомление отображается
вот plist для Notification Content Extension
цель:
вот plist для Notification Service Extension
цель:
на 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)
убедитесь, что у вас нет набора конфигурации. Посмотрите на скриншот. С другими параметрами didReceive
не работает.
после попытки многих из возможных исправлений, уже данных без успеха, меня осенило, что фреймворк был ошибочно добавлен к нашей цели расширения, а не к цели модульного теста.
удаление фреймворка и таргетинг 10.2 позволили моему расширению быть вызванным еще раз.
Если вам интересно, по какой причине вы можете найти его здесь:https://github.com/plu/JPSimulatorHacks
моя проблема была в два раза. Первым, вероятно, было то, что я установил Info.plist
свойство NSExtensionPrincipalClass в bundle.identifier.NotificationService
вместо ProductModuleName.NotificationService
. Имя модуля по умолчанию, но я ошибочно изменил идентификатор при отладке некоторых других вещей, связанных с разными схемами и разными целями.
вторая проблема заключалась в том, что я тестировал, запустив целевой объект Службы уведомлений. Для меня это работало намного лучше при запуске целевого приложения. Я видел других людей. рекомендуется использовать целевой объект Службы notification service для включения отладки. Но это прекрасно работает и при запуске целевого приложения. Однако вам придется подключить отладчик к службе уведомлений вручную.
способ, которым я обнаружил выше, состоял в создании нового тестового проекта с минимальным кодом. Оглядываясь назад, я определенно рекомендую этот подход, вместо того, чтобы опробовать все различные решения, найденные на StackOverflow и т. д.