Расширение службы уведомлений 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"
}
}
Попробуйте и посмотрите, запускается ли расширение.