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

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

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

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 Ответ

0 голосов
/ 19 сентября 2018

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

{
   "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"
  }
}

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

...