Apple 推送通知折叠键等效

Posted

技术标签:

【中文标题】Apple 推送通知折叠键等效【英文标题】:Apple Push Notification Collapse Key Equivalent 【发布时间】:2012-09-06 23:12:21 【问题描述】:

在使用 Google 推送通知时,我可以指定一个 collapse_key 值,这样设备就不会收到同一个 collapse_key 的多个通知。 APNS 是否有类似的功能,或者有人知道模拟此功能的方法吗?

【问题讨论】:

我们刚刚开始对此进行调查,但使用“内容可用”APNS 密钥发送“静默通知”理论上会在后台唤醒您的应用程序片刻,让您使用现有消息,并使用新的/更新的内容发出新的“本地通知”。您可以在自定义键中隐藏实际消息,并在发出本地通知时使用它。 developer.apple.com/library/ios/documentation/… 从 iOS 10 开始,有一个完全相同的版本。看我的回答***.com/a/39666412/365580 【参考方案1】:

从 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 字节。有关详细信息,请参阅服务质量, 存储转发和合并通知。

来自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。

例如,一个新闻服务在同一时间发送两次相同的标题 行可以为两个推送使用相同的折叠标识符 通知请求。 APNs 将负责合并这些 将请求发送到单个通知中以发送到设备。

【讨论】:

【参考方案2】:

在 iOS 10 中,有一个新的“apns-collapse-id”看起来可以满足这种需求。如果您有 Apple 开发者帐户,您可以观看 WWDC 2016 通知会议视频(707 介绍视频https://developer.apple.com/videos/play/wwdc2016/707/)。

【讨论】:

【参考方案3】:

Doody P 的答案适用于远程通知,但本地触发的通知也有一个等价物:当您创建 UNNotificationRequest 时,您可以将 identifier 参数设置为您一直用作折叠键的任何内容。触发后,推送通知将仅显示您使用该标识符发送的最新版本。

(我们通过 APN 静默发送推送通知,然后作为本地通知重新触发,因为我们需要确保我们的用户已登录。)

this WWDC talk 中有方便的代码示例和管理已发送通知的演示 - 关键部分是从 ~18:00 - 21:00。

【讨论】:

如果用户强制关闭应用/禁用后台应用刷新,您的应用将无法启动以供您检查用户是否登录,您如何处理这种情况? @Hannele @Patrick oof 这是个好问题。老实说,已经很久了,我真的不知道最好的答案:/ @Patrick 您可以为此使用通知服务扩展:developer.apple.com/documentation/usernotifications/… 很好的建议@DanVanWinkle,这似乎很管用!【参考方案4】:

如果 APNs 尝试发送通知但设备处于离线状态, 通知在有限的时间段内存储,并交付 当设备可用时发送到设备。

只存储一个特定应用的最近通知。如果 设备离线时发送多个通知,每个新的 通知导致先前的通知被丢弃。这 仅保留最新通知的行为称为 合并通知。

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

所以在 iOS 中不需要collapse_key

仅供参考,collapse_key 仅在设备离线/不活动时有用:

此参数标识一组消息(例如,带有 collapse_key: "Updates Available") 可以折叠,这样只有 可以恢复交付时发送最后一条消息。这是 旨在避免在 设备重新联机或变为活动状态(请参阅 delay_while_idle)。

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

更新:

对于 iOS 和 android(使用 collapse_key),如果设备离线(即 Apple/Google 推送服务器无法访问它),推送服务器会覆盖任何之前的通知 strong>,只保留最后一个。

如果设备在线,那么我想您可以根据收到的通知做任何您想做的事情。至少在 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 版本而改变)。 Google collapse_key 可能仅在设备处于非活动状态时才起作用,但我相信这也涵盖了屏幕处于睡眠状态的情况,这是我的问题所指的场景。 @David:查看更新后的答案。不过我不确定在 iOS 上到底是如何工作的,所以我不知道是否有可能类似于我为 Android 编写的内容。【参考方案5】:

iOS 中没有这样的功能。但是,由于推送通知是由您控制的服务器发送的,因此您可以跟踪已发送到特定设备的通知,并决定是否发送新通知。换句话说,您将逻辑放在您的服务器代码中,而不是您的 iOS 应用程序代码中。

【讨论】:

但是服务器无法覆盖之前的推送消息。 不,不能。您只是一开始就不发送它们。 谷歌用例是用于状态更新之类的,您只想查看最新的。 APNs HTTP/2 API 不再是这种情况。查看@doody-p 的回答 这个答案不再有效

以上是关于Apple 推送通知折叠键等效的主要内容,如果未能解决你的问题,请参考以下文章

Apple 推送通知的用户定义声音?

如何使用 Firebase 在 Xamarin 中实现推送通知和使用 C# 后端的 Apple 推送通知

Apple 推送通知 - 查看按钮操作

从 Apple 推送通知中解析数据

使用 APNS 的 Apple 推送通知是不是免费?

Apple 推送通知令牌