Эквивалент ключа сворачивания push-уведомлений Apple

При использовании push-уведомлений Google мне разрешено указывать значение Collar_Key, чтобы устройство не получало несколько уведомлений с одним и тем же Collar_Key. Есть ли у APNS аналогичная функция или кто-нибудь знает способ эмулировать эту функцию?


person David    schedule 13.09.2012    source источник
comment
Мы только начинаем исследовать это, но отправка тихого уведомления с использованием ключа APNS с доступным содержимым теоретически на мгновение разбудит ваше приложение в фоновом режиме, позволит вам использовать существующие сообщения и выдать новое локальное уведомление с новый/обновленный контент. Вы можете скрыть фактическое сообщение в пользовательском ключе и использовать его при выдаче локального уведомления. developer.apple.com/library/ios/documentation/   -  person Dave Martorana    schedule 18.04.2016
comment
Начиная с iOS 10 существует точный эквивалент. См. мой ответ stackoverflow.com/a/39666412/365580   -  person Doody P    schedule 24.09.2016


Ответы (5)


Начиная с iOS 10 и используя API HTTP/2.0 APNS, вы можете указать заголовок apns-collapse-id и обрабатывать логику свертывания в своем приложении.

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

Описание apns-collapse-id взято с сайта https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html:

Несколько уведомлений с одинаковым идентификатором свертывания отображаются пользователю как одно уведомление. Значение не должно превышать 64 байта. Дополнительные сведения см. в разделе Качество обслуживания, промежуточное хранение и объединенные уведомления.

и из https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1:

Когда устройство подключено к сети, все отправляемые вами уведомления доставляются и становятся доступными для пользователя. Однако вы можете избежать отображения повторяющихся уведомлений, используя идентификатор свертывания для нескольких идентичных уведомлений. Ключ заголовка запроса APNs для идентификатора свертывания — apns-collapse-id, он определен в таблице 6-2.

Например, служба новостей, которая отправляет один и тот же заголовок дважды подряд, может использовать один и тот же идентификатор свертывания для обоих запросов push-уведомлений. Затем APN позаботится об объединении этих запросов в одно уведомление для доставки на устройство.

person Doody P    schedule 23.09.2016

В iOS 10 появился новый «apns-collapse-id», который, похоже, справится с такой задачей. Если у вас есть учетная запись разработчика Apple, вы можете посмотреть видеоролики сеанса уведомлений WWDC 2016 (вступительное видео 707 https://developer.apple.com/videos/play/wwdc2016/707/).

person chadbag    schedule 29.08.2016

Ответ Doody P работает для удаленных уведомлений, но есть также эквивалент для локальных уведомлений: когда вы создаете свой UNNotificationRequest, вы можете установить identifier на то, что вы использовали в качестве ключа свертывания. После срабатывания push-уведомления будет отображаться только последняя версия, которую вы отправили с этим идентификатором.

(Мы автоматически отправляем push-уведомления через APN, а затем повторно запускаем их как локальные уведомления, потому что нам нужно убедиться, что наши пользователи вошли в систему.)

В этом докладе WWDC есть удобные примеры кода и демонстрации управления доставленными уведомлениями. - ключевой раздел с ~18:00 до 21:00.

person Hannele    schedule 11.12.2017
comment
Если пользователь принудительно закрыл приложение/отключил обновление фонового приложения, ваше приложение не запустится, чтобы вы могли проверить, вошел ли пользователь в систему, как вы справляетесь с этой ситуацией? @Ханнеле - person Patrick; 30.08.2020
comment
@ Патрик, это хороший вопрос. Честно говоря, прошло много лет, и я действительно не знаю лучшего ответа: / - person Hannele; 30.09.2020
comment
@Patrick Для этого вы можете использовать расширение службы уведомлений: developer.apple.com/ документация/уведомления пользователей/ - person Dan VanWinkle; 19.07.2021
comment
Отличное предложение @DanVanWinkle, кажется, оно отлично работает! - person Patrick; 24.07.2021

Если APN пытается доставить уведомление, но устройство находится в автономном режиме, уведомление сохраняется в течение ограниченного периода времени и доставляется на устройство, когда оно становится доступным.

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

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

Так что в iOS нет необходимости в collapse_key.

К вашему сведению, collapse_key полезен только тогда, когда устройство отключено/неактивно:

Этот параметр определяет группу сообщений (например, с Collar_key: «Доступные обновления»), которые можно свернуть, чтобы при возобновлении доставки отправлялось только последнее сообщение. Это сделано для предотвращения отправки слишком большого количества одинаковых сообщений, когда устройство возвращается в сеть или становится активным (см. delay_while_idle).

https://developers.google.com/cloud-messaging/server-ref#downstream

ОБНОВЛЕНИЕ:

Как для iOS, так и для Android (с помощью функции crush_key), если устройство находится в автономном режиме (т. е. сервер push-уведомлений Apple/Google не может связаться с ним), сервер push-уведомлений перезаписывает все предыдущие уведомления, и сохраняет только последний.

Если устройство подключено к сети, то, я думаю, вы можете делать с полученным уведомлением все, что хотите. По крайней мере, в Android вы можете решить, хотите ли вы «складывать вещи», хотите ли вы перезаписать любое предыдущее уведомление в области уведомлений или хотите ли вы перезаписать любое предыдущее уведомление того же типа.

NotificationManager notificationManager = ...;
String appName = ...;
NotificationCompat.Builder builder = ...
// Always use the same id, so only the last notification will be displayed in the notification area.
int notId = 0;
// Always use a different id, so all notifications will pile up in the notification area
notId = new Random().nextInt(100000);
// Uses the type of notification as id, so you'll only have up to one notification per type
// in the notification area. It's like using collapse_key, but on the app itself.
// That type should should be some additional data in the notification you sent.
notId = notificationType;
Notification notification = builder.build();
notificationManager.notify(appName, notId, notification);
person user276648    schedule 20.07.2015
comment
Это происходит только тогда, когда устройство iOS находится в автономном режиме. Если пользователь какое-то время не проверял свое устройство, но оно находится в сети (даже когда экран спит), уведомления будут накапливаться (по крайней мере, когда я впервые опубликовал это, эта политика могла измениться с более новыми версиями iOS). Клавиша коллапса Google может работать только тогда, когда устройство неактивно, но я полагаю, что это касается и случаев, когда экран спит, что является сценарием, на который ссылался мой вопрос. - person David; 28.07.2015
comment
@David: см. обновленный ответ. Я не уверен, как именно все работает на iOS, поэтому я не знаю, возможно ли что-то похожее на то, что я написал для Android. - person user276648; 29.07.2015

В iOS такой функции нет. Однако, поскольку push-уведомления отправляются сервером, который находится под вашим контролем, вы можете отслеживать, какие уведомления вы отправили на конкретное устройство, и решать, отправлять ли новые. Другими словами, вы помещаете логику в код сервера, а не в код приложения для iOS.

person jsd    schedule 13.09.2012
comment
Но сервер не может перезаписывать предыдущие push-сообщения. - person Mike; 09.08.2013
comment
Нет, не может. Вы просто не отправляете их в первую очередь. - person jsd; 09.08.2013
comment
Вариант использования Google предназначен для таких вещей, как обновления статуса, когда вы хотите видеть только самое последнее. - person Mike; 07.10.2013
comment
Это больше не относится к API HTTP/2 APN. Смотрите ответ @doody-p - person Josh; 08.05.2017
comment
этот ответ больше не актуален - person Naresh; 20.01.2020