Расширение службы уведомлений iOS с несколькими целями никогда не вызывает методы расширения

В настоящее время я пытаюсь использовать Notification Service Extension в качестве обходного пути для приложения, которое не получает правильное количество значков в push notification payload, Чтобы исправить это, я решил создать расширение службы уведомлений, которое будет отслеживать количество полученных сообщений и соответствующим образом отслеживать количество. Я получил эту работу на прошлой неделе, теперь я продолжил ее, и она больше не работает, и я понятия не имею, почему это так.

Notification Service Extension Идентификатор пакета изменяется в соответствии с целью. Этот сценарий предварительной сборки выглядит так для двух целей, которые у меня есть

buildID=${PRODUCT_BUNDLE_IDENTIFIER}
extId="AppPushNotification"

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $buildID.$extId" "${SRCROOT}/${extId}/Info.plist"

Код, который я использую в своем расширении

import UIKit
import UserNotifications

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...
            let userDefaults = UserDefaults.init(suiteName: "group.com.my.bundle.notification-service-extension")
            let unreadMessages = userDefaults?.integer(forKey: "unreadMessages")
            let newUnreadMessages = unreadMessages != nil ? unreadMessages! + 1 : 0

            bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"
            bestAttemptContent.badge = NSNumber(value: newUnreadMessages)
            let userInfo = bestAttemptContent.userInfo
            guard let info = userInfo["aps"] as? [AnyHashable: Any],
                let data = info["data"] as? [AnyHashable: Any],
                let chatId = data["chatId"] as? String else { return }

            let unreadMessagesInChat = userDefaults?.integer(forKey: chatId)
            let newUnreadMessagesInChat = unreadMessagesInChat != nil ? unreadMessagesInChat! + 1 : 0

            userDefaults?.set(newUnreadMessages, forKey: "unreadMessages")
            userDefaults?.set(newUnreadMessagesInChat, forKey: chatId)


            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)
        }
    }

}

Я отправляю тестовое уведомление с помощью Pusher, Полезная нагрузка, которую я отправляю:

{
   "aps":{
      "mutalbe-content":1,
      "content-available":1,
      "sound":"true",
      "alert":{
         "title":"Vera Pauw",
         "body":"test bericht"
      },
      "data":{
         "type":"test",
         "message":"test bericht",
         "chatId":"3b002aa6-1117-4206-b54f-8bc2bd689f1c",
         "fromId":"",
         "fromname":"Vera Pauw"
      }
   }
}

Я получаю уведомление успешно, но он никогда не вызывает код расширения. Я попытался отладить несколькими способами, например, выбрать цель отладки после запуска приложения или запустить приложение из цели расширения, но процесс Notification Service всегда скажу Waiting to Attach, Я попытался поиграть с полезными данными push-уведомлений, но это не изменило результат.

У кого-нибудь есть идеи, почему это происходит или где я ошибаюсь.

1 ответ

Решение

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

{
   "aps":{
      "mutalbe-content":1,
      "content-available":1,
      "sound":"true",
      "alert":{
         "title":"Vera Pauw",
         "body":"test bericht"
      },
      "data":{
         "type":"test",
         "message":"test bericht",
         "chatId":"3b002aa6-1117-4206-b54f-8bc2bd689f1c",
         "fromId":"",
         "fromname":"Vera Pauw"
      }
   }
}

aps ключ должен содержать только ключи Apple. Ваш data словарь должен быть за пределами aps ключ.

"content-available" не должен присутствовать, если alert, button, или же sound ключи есть - уведомление не может быть как тихим, так и обращенным к пользователю. content-available только для тихих уведомлений.

"mutalbe-content" ключ также написан с ошибкой, поэтому ваше расширение не активируется!

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

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

{
   "aps":{
      "mutable-content":1,
      "alert":{
         "title":"Vera Pauw",
         "body":"test bericht"
      }
   },
  "data":{
     "type":"test",
     "message":"test bericht",
     "chatId":"3b002aa6-1117-4206-b54f-8bc2bd689f1c",
     "fromId":"",
     "fromname":"Vera Pauw"
  }
}

Попробуйте и посмотрите, запускается ли расширение.

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