#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:
Похоже, что это может быть невозможно, но не уверен. Из документов:
Вы можете изменить любой контент из исходного запроса. Вы можете настроить содержимое для текущего пользователя или полностью заменить его. Вы можете использовать этот метод для загрузки изображений или фильмов и добавлять их в качестве вложений к контенту. Вы также можете изменить текст предупреждения, если не удалите его. Если объект содержимого не содержит текста предупреждения, система игнорирует ваши изменения и отправляет исходное содержимое уведомления.
Вызов блока с нулевым значением просто отображает исходное уведомление?
Ответ №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 { ///...
Ответ №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: настройка автоматического уведомления
Затем вы можете решить, следует ли показывать уведомление пользователю, если да, просто создайте уведомление пользователя и покажите его:
Ответ №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 не помогло.