Как я могу отменить или остановить push-уведомление от клиента?

У меня есть веб-сервер, который отправил клиенту push-уведомление. Клиент может перехватить push-уведомление с помощью UNNotificationServiceExtension на iOS 10 и изменить содержимое. Теперь я хочу отменить push-уведомление, отображающее на стороне клиента определенные уведомления. Как мне это сделать? Я пытался сделать

self.contentHandler(nil);

но это не сработало. Как это сделать?

Ответ 1

Похоже, что это будет невозможно, но не уверен. Из документов:

Вы можете изменить любое содержимое из исходного запроса. Ты мог бы настроить контент для текущего пользователя или полностью его заменить. Вы можете использовать этот метод для загрузки изображений или фильмов и добавления их в качестве вложения в контент. Вы также можете изменить текст предупреждения как долго так как вы его не удаляете. Если объект содержимого не содержит предупреждающий текст, система игнорирует ваши изменения и оригинальное содержание уведомлений.

https://developer.apple.com/reference/usernotifications/unnotificationserviceextension/1648229-didreceivenotificationrequest?language=objc

Вызов блока с помощью nil показывает только исходное уведомление?

Ответ 2

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

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any])

Вы проверяете свое уведомление и определяете, должно ли оно отображаться пользователю. Если нет, вы ничего не делаете с этим. Если это нужно показать, создайте локальное уведомление и покажите его UILocalNotification (iOS 9 и ранее) или UNNotification (iOS 10).

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

Ответ 3

На iOS 10 и выше вы можете отправить вам "молчащее" уведомление:

Apple doc: настроить тихое уведомление

Затем вы можете решить, следует ли показывать уведомление пользователю, если это так, просто создайте уведомление пользователя и покажите его:

Документ Apple: локальные и push-уведомления

Ответ 4

@Jorge Arimany ответ - отправить молчаливое уведомление, чтобы устройства проснулись, чтобы что-то сделать, я думаю, что это не решение, которое хочет этот пользователь. И я думаю, что мы все равно получим общее уведомление, если мы ничего не будем делать в нашем классе UNNotificationServiceExtension

Ответ 5

Пред iOS 10: я не думаю, что это возможно. Вот причины. Однажды, когда сервер отправляет push-уведомление клиенту на сервер Apple APNS для отправки его клиентам, вы теряете контроль над push-уведомлениями. Это одна из причин, по которой Apple не всегда обещает 100-процентную доставку уведомлений. Это подразумевает, что push-уведомления на iPhone обрабатываются операционной системой iPhone, а не вашим приложением.

Даже push-уведомления, отображаемые на Apple iPhone Springboard/dashboard, не находятся под вашим контролем.

Пользователи могут контролировать, хочет ли он получать уведомления или нет.

Поэтому я не думаю, что вы можете частично контролировать уведомления после того, как они отправлены с вашего сервера.