Apple推送通知折叠关键等效

时间:2012-09-13 19:31:34

标签: ios apple-push-notifications collapse

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

5 个答案:

答案 0 :(得分:24)

从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

  

当设备在线时,您发送的所有通知都会发送   并可供用户使用。但是,您可以避免显示重复   通过使用多个崩溃标识符进行通知,   相同的通知。 APN请求崩溃的标头密钥   identifier是apns-collapse-id,在表6-2中定义。

     

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

答案 1 :(得分:5)

对于iOS 10,有一个新的" apns-collapse-id"看起来它会处理这种需求。如果您有Apple开发者帐户,可以查看WWDC 2016通知会话视频(707简介视频https://developer.apple.com/videos/play/wwdc2016/707/)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

  

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

     

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

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

所以iOS中不需要collapse_key

仅供参考,collapse_key仅在设备离线/无效时才有用:

  

此参数标识一组消息(例如,使用   collapse_key:"可用的更新")可折叠,仅限于此   在可以恢复交付时发送最后一条消息。这是   旨在避免在发送时发送过多相同的消息   设备重新联机或变为活动状态(请参阅delay_while_idle)。

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

<强>更新

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

如果该设备在线,那么我猜您可以根据收到的通知做任何您想做的事。至少在Android中,您可以决定是否要填充&#34;,是否要覆盖通知区域中的任何先前通知,或者是否要覆盖任何先前相同类型的通知。< / p>

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);

答案 4 :(得分:0)

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

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

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