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 экземпляр был вызван совершенно


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

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

  1. установите точку останова в расширении
  2. выберите Debug / Attach to Process по PID или name
  3. введите имя целевого объекта расширения
  4. вызвать push-уведомление

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

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

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

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

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

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

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

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


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

Так что проверьте это:

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

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

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

вот plist для Notification Content Extension цель:

enter image description here

вот plist для Notification Service Extension цель:

r


на 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 и т. д.