iOS: как удалить удаленные уведомления, если приложение не активно?

Я хочу очистить удаленные уведомления, чтобы они не накапливались в Центре уведомлений (например, когда вы получаете видеозвонок в WhatsApp или Messenger, отображается только последнее уведомление).

Я пытался позвонить (в didReceiveRemoteNotification):

let center = UNUserNotificationCenter.current()
center.removeDeliveredNotifications(withIdentifiers: ["notification_identifier"])

Но он вызывается только в том случае, если приложение активно. Как я могу это сделать, если приложение находится в другом состоянии?

Спасибо за вашу помощь.


person Rob    schedule 15.10.2018    source источник
comment
Вы используете тихие уведомления? didReceiveRemoteNotificaton будет вызываться для тихих push-уведомлений во всех состояниях, кроме состояния пользователя. Чтобы быть вызванным в состоянии завершения пользователя, вам нужно будет использовать PushKit (что означает, что ваше приложение должно быть приложением VoIP).   -  person Paulw11    schedule 15.10.2018
comment
@Paulw11 Нет, нет, но если я правильно понимаю, это означает, что я получу тихий удаленный толчок, а затем запланирую локальное уведомление (в конечном итоге заменив предыдущее), верно?   -  person Rob    schedule 15.10.2018
comment
Это правильно.   -  person Paulw11    schedule 15.10.2018


Ответы (1)


После некоторых исследований и благодаря ответу Paulw1 я обнаружил, что есть два способа сделать это:

Только удаленно

Уведомления можно свернуть удаленно, вам нужно только отправить уведомление с apns-collapse-id в качестве заголовка запроса. Обратите внимание, что он поддерживается только в HTTP/2. Дополнительная информация здесь.

Тихое удаленное + локальное уведомление

Другой способ состоит в отправке скрытого удаленного уведомления с такой полезной нагрузкой:

{
  "type": "notification_type",
  "aps" : {
    "content-available": 1
  }
}

Он вызовет didReceiveRemoteNotification, даже если состояние приложения inactive или background. Затем я создаю локальный запрос на уведомление (необходимо использовать UserNotifications, доступное в iOS10):

let content = UNMutableNotificationContent()
content.body = "Notification message"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.25, repeats: false)
let request = UNNotificationRequest(identifier: "identifierToUpdate", content: content, trigger: trigger)
self.center.add(request, withCompletionHandler: nil)

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

person Rob    schedule 16.10.2018