iOS 10 не вызывает расширение службы уведомлений

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

В моем файле NotificationService.swift у меня есть этот код:

class NotificationService: UNNotificationServiceExtension {

var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    self.contentHandler = contentHandler
    bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

    if let bestAttemptContent = bestAttemptContent {
        // Modify the notification content here...
        bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"

        print(bestAttemptContent.body)

        contentHandler(bestAttemptContent)
    }
}

override func serviceExtensionTimeWillExpire() {
    // Called just before the extension will be terminated by the system.
    // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
    if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
        contentHandler(bestAttemptContent)
    }
}
}

Когда я получил push-уведомление, метод didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) никогда не вызывался.

Может быть, я неправильно понял, как работает это расширение?

10 ответов

Проверьте цель развертывания на Service Extension.

У меня была цель развертывания 10.2 при тестировании на устройстве с 10.1, и расширение не вызывалось, пока я не изменил его.

Другая проблема может быть отладкой. Для того, чтобы она работала, вам необходимо прикрепить процесс расширения сервиса. В меню Xcode Отладка> Присоединить к процессу> Имя вашего расширения

  1. Вместо того, чтобы запустить приложение. Вы должны запустить расширение службы в качестве цели. Затем он спросит, для какого приложения вы запустили расширение службы, затем выберите приложение и отправит уведомление.

  2. Убедитесь, что цель развертывания меньше, чем ОС устройства в расширении службы.

  3. Убедитесь, что полезная нагрузка должна содержать "изменяемый контент": 1.

    {"aps" : {
            "alert" : {
                "title" : "Introduction To Notification",
                "subtitle" : "Session 707",
                "body" : "New Notification Look Amazing"
            },
           "sound" : "default",
            "category" : "message",
            "badge" : 1,
            "mutable-content": 1
        },
        "attachment-url": "https://api.buienradar.nl/Image/1.0/RadarMapNL"
    }
    
  4. Не добавляйте флаг "Содержимое доступно" в aps, если необходимо добавить значение 0. "Содержимое доступно": 0,

Я сходил с ума. Наконец я понял, что у меня есть deployment target из Notification Service Extension было 10.3 (мой телефон тоже). Я поменял на 10.2 и работает отлично

Если ничего не помогает, перезагрузите устройство. Я просто потратил на это 2 часа, и просто перезагрузка телефона исправила это.

Ваша полезная нагрузка push-уведомления должна содержать пару "ключ-значение-содержимое": 1.

Словарь aps удаленного уведомления включает в себя ключ изменяемого содержимого со значением, равным 1.

Из полезных данных push-уведомлений JSON:

{
  "aps":{
          "alert": {
                    "body": "My Push Notification", 
                    "title" : "Notification title"},
          "mutable-content" : 1,
          "badge":0},
}

Это прекрасно работает, и я получаю Push-уведомление следующим образом: Отправить сообщение

Также обратите внимание, что:

Вы не можете изменять уведомления без вывода сообщений или те, которые только воспроизводят звук, или отмечают значок приложения.

Вы можете попробовать Pusher или Houston для тестирования Push-уведомлений.

Если вы пытаетесь отправить push из консоли Firebase, отправить невозможно "mutable_content": true. Поэтому вы должны отправить его с сервера или postmanили любой тип терминала. И ваша полезная нагрузка должна быть такой: для firebase

      {
    "to" : "your device token/ firebase topic",
    "notification" : {
      "body" : "This is an FCM notification that displays an image.!",
      "title" : "FCM Notification"
     },
    "mutable_content": true
  }

Если не из FCM, то ваша полезная нагрузка должна быть:

      {"aps" : {
    "alert" : {
        "title" : "Your title",
        "subtitle" : "Your subtitle",
        "body" : "Your body"
    },
    "sound" : "default",
    "category" : "message",
    "badge" : 1,
    "mutable-content": 1
    },
    "attachment-url": "https://yourattachment-url.com"
}

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

У меня та же проблема, но моей проблемой было расширение уведомлений "приложение". Должно быть приложение

Из документов наUNNotificationServiceExtensionкласс:

  • Удаленное уведомление настроено для отображения alert.

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

Вы не можете изменить беззвучные уведомления или уведомления, которые воспроизводят только звук или обозначают значок приложения.

В принципе

Должен включать:

  • mutable-content: 1
  • ан alert толковый словарь.

НЕ ДОЛЖЕН включать:

  • content-available: 1

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

Это образец, если вы реализуете облачные функции Swift и Firebase (Node.js) для отправки уведомлений с вложениями с расширением службы уведомлений. Ниже я упомянул лишь некоторые важные моменты.

Образец полезной нагрузки

      const payload = {
    notification: {
        title: name,
        body: messageText,
        badge: "1",
        mutable_content: "true"
    },
    data: {
        type: "MESSAGE",
        fromUserId: name,
        attachmentUrl: imageUrl
    }};

mutable_content: "true", эта часть важна, я трачу так много времени, чтобы найти точное название, большая часть документации сейчас недействительна.

Следующее главное - это способ запуска приложения.

Выберите расширение службы уведомлений на своем устройстве.

После того, как вы запустите, вы получите всплывающее окно для выбора основного проекта.

Таким образом, он вызовет функцию NotificationService didReceive (которая находится внутри расширения службы уведомлений), когда вы получите уведомление.

Вам нужно добавить "mutable-content": 1 к вашей полезной нагрузке

Другие вопросы по тегам