Как я могу отменить или остановить push-уведомление от клиента?
У меня есть веб-сервер, который отправил клиенту push-уведомление. Клиент может перехватить push-уведомление UNNotificationServiceExtension
на iOS 10 и изменить содержание. Теперь я хочу отменить push-уведомление от показа на стороне клиента при определенных уведомлениях. Как я могу это сделать? Я пытался сделать
self.contentHandler(nil);
но это не сработало. Как это сделать?
6 ответов
Похоже, что это не возможно, но не уверен. Из документов:
Вы можете изменить любой контент из исходного запроса. Вы можете настроить контент для текущего пользователя или полностью заменить его. Вы можете использовать этот метод для загрузки изображений или фильмов и добавления их в качестве вложений в контент. Вы также можете изменить текст предупреждения, если вы его не удалите. Если объект содержимого не содержит какого-либо текста предупреждения, система игнорирует ваши изменения и доставляет исходное содержимое уведомления.
Вызов блока с нулем просто отображает оригинальное уведомление?
Теперь это возможно, начиная с iOS 13.3. Вам необходимо передать пустой UNNotificationContent в contentHandler (не nil) и добавить новое право фильтрации.
// Determine whether you should suppress the notification.
let suppress = myShouldSuppressNotification(request: request)
if suppress {
// Don't deliver the notification to the user.
contentHandler(UNNotificationContent())
} else { ///...
Ответ @Jorge Arimany - отправить беззвучное уведомление для пробуждения устройств, чтобы что-то сделать, я думаю, что это не то решение, которое хочет этот пользователь. И я думаю, что мы все равно получим общее уведомление, если ничего не сделаем в нашем классе UNNotificationServiceExtension.
На iOS 10 и выше вы можете отправить вам "тихое" уведомление:
Apple Doc: настроить молчание уведомления
Затем вы можете решить, должно ли уведомление показываться пользователю, если это так, просто создайте уведомление пользователя и покажите его:
Я думаю, что самым простым способом было бы отправлять каждое push-уведомление как молчаливое уведомление по умолчанию и показывать только те, которые вы хотите показать. Когда вы получаете молчаливое уведомление в
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any])
Вы проверяете свое уведомление и определяете, должно ли оно отображаться пользователю. Если нет, вы ничего не делаете с этим. Если это необходимо показать, создайте локальное уведомление и отобразите его UILocalNotification (iOS 9 и более ранние версии) или UNNotification (iOS 10).
Я должен добавить, что это имеет тот недостаток, что никакие уведомления не будут отображаться, если приложение не находится в памяти (потому что приложение должно превратить автоматическое уведомление в локальное уведомление), но если вы выбрали противоположный такт, у вас есть проблема что-то может быть показано, что не должно быть показано.
Я не думаю, что это возможно. Вот причины. Однажды, когда сервер отправляет push-уведомление клиенту на сервер Apple APNS для отправки его клиентам, вы теряете контроль над push-уведомлениями. Это одна из причин, по которой Apple не всегда обещает 100-процентную доставку уведомлений. Это подразумевает, что push-уведомления на iPhone обрабатываются операционной системой iPhone, а не вашим приложением.
Даже push-уведомления, отображаемые на Apple iPhone Springboard/dashboard, не находятся под вашим контролем.
Пользователи могут контролировать, хочет ли он получать уведомления или нет.
Поэтому я не думаю, что вы можете частично контролировать уведомления после их отправки с вашего сервера.