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

#ios #apple-push-notifications

#iOS #apple-push-уведомления

Вопрос:

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

 self.contentHandler(nil);
  

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

Комментарии:

1. В документации по уведомлениям ( developer.apple.com/library/content/documentation / … ) вы можете видеть, что в нем говорится To support silent remote notifications, add the remote-notification value to the UIBackgroundModes array in your Info.plist file.

2. @dlbuckley Но я хочу, чтобы некоторые уведомления отображались. Я хочу, чтобы решение принималось клиентом, а не сервером. Насколько мне известно, отображение некоторых тихих уведомлений невозможно, поэтому я пытаюсь выяснить, могу ли я отключить некоторые регулярные уведомления.

3. Ах, в таком случае я не слишком уверен. Изменения в уведомлениях iOS 10 — это то, на что нужно обратить внимание в моем списке, извините!

4. Просто мысль (еще не пробовал это лично), вы пробовали отправлять автоматическое уведомление со своего сервера, а затем при необходимости создавать локальное уведомление в приложении?

5. Это правильный ответ JRG-Разработчик

Ответ №1:

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

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

https://developer.apple.com/reference/usernotifications/unnotificationserviceextension/1648229-didreceivenotificationrequest?язык = objc

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

Ответ №2:

Теперь это возможно с 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

Ответ №3:

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

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

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

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

Комментарии:

1. Это не сработает. «Расширения приложений службы уведомлений работают только с удаленными уведомлениями, которые настроены для отображения предупреждения пользователю. Если оповещения отключены для вашего приложения или если полезная нагрузка указывает только воспроизведение звука или значок с надписью, расширение не используется. » developer.apple.com/documentation/usernotifications /…

Ответ №4:

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

Apple doc: настройка автоматического уведомления

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

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

Ответ №5:

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

Ответ №6:

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

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

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

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

Комментарии:

1. Это имело место до iOS 10, но с iOS 10 вы, безусловно, можете предпринять действия после отправки в APNS. Вы даже можете изменить содержимое с помощью UNNotificationServiceExtension. Итак, вопрос в том, если вы можете изменить содержимое, почему вы можете просто отменить его? изменение содержимого на nil не помогло.