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

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

self.contentHandler(nil);

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

6 ответов

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

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

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

Вызов блока с нулем просто отображает оригинальное уведомление?

Теперь это возможно, начиная с 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 { ///...

Ссылка: https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_usernotifications_filtering

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

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

Apple Doc: настроить молчание уведомления

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

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

Я думаю, что самым простым способом было бы отправлять каждое 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, не находятся под вашим контролем.

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

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

Другие вопросы по тегам