使用 Google 推送通知时,我可以指定一个 collapse_key 值,这样设备就不会收到同一个 collapse_key 的多个通知。APNS 是否有类似的功能,或者有人知道模拟此功能的方法吗?
5 回答
从 iOS 10 开始,使用 HTTP/2.0 APNS API,您可以指定apns-collapse-id
标题并处理应用程序中的折叠逻辑。
折叠的通知将在设备上显示为一个通知,并不断更新新数据。每次更新通知时,它都会被推送到未读通知的顶部。
apns-collapse-id
取自https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html的描述:
具有相同折叠标识符的多个通知作为单个通知显示给用户。该值不应超过 64 个字节。有关详细信息,请参阅服务质量、存储转发和合并通知。
当设备在线时,您发送的所有通知都会传递给用户并可供用户使用。但是,您可以通过在多个相同的通知中使用折叠标识符来避免显示重复的通知。折叠标识符的 APNs 请求标头键是 apns-collapse-id,并在表 6-2 中定义。
例如,连续两次发送相同标题的新闻服务可以对两个推送通知请求使用相同的折叠标识符。然后,APN 将负责将这些请求合并为一个通知,以便传送到设备。
在 iOS 10 中,有一个新的“apns-collapse-id”看起来可以满足这种需求。如果您有 Apple 开发者帐户,您可以查看 WWDC 2016 通知会话视频(707 介绍视频https://developer.apple.com/videos/play/wwdc2016/707/)。
Doody P 的答案适用于远程通知,但对于本地触发的通知也有一个等价物:当您创建 UNNotificationRequest 时,您可以将identifier
参数设置为您一直用作折叠键的任何内容。触发后,推送通知将仅显示您使用该标识符发送的最新版本。
(我们通过 APN 静默发送推送通知,然后作为本地通知重新触发,因为我们需要确保我们的用户已登录。)
在这个 WWDC 演讲中有方便的代码示例和管理传递的通知的演示- 关键部分是从 ~18:00 - 21:00。
如果 APNs 尝试发送通知但设备处于离线状态,则通知会存储一段有限的时间,并在可用时发送到设备。
仅存储特定应用程序的一个最近通知。如果在设备离线时发送了多个通知,则每个新通知都会导致先前的通知被丢弃。这种只保留最新通知的行为称为合并通知。
collapse_key
所以在iOS中不需要。
仅供参考,collapse_key
仅在设备离线/不活动时有用:
此参数标识可以折叠的一组消息(例如,使用collapse_key:“可用更新”),以便在可以恢复传递时仅发送最后一条消息。这是为了避免在设备重新联机或变为活动状态时发送太多相同的消息(请参阅 delay_while_idle)。
https://developers.google.com/cloud-messaging/server-ref#downstream
更新:
对于 iOS 和 Android(使用 collapse_key),如果设备离线(即 Apple/Google 推送服务器无法访问它),推送服务器会覆盖之前的任何通知,并且只保留最后一个。
如果设备在线,那么我想您可以根据收到的通知做任何您想做的事情。至少在 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);
iOS中没有这样的功能。但是,由于推送通知是由您控制的服务器发送的,因此您可以跟踪已发送到特定设备的通知,并决定是否发送新通知。换句话说,您将逻辑放在您的服务器代码中,而不是您的 iOS 应用程序代码中。