Google プッシュ通知を使用する場合、collapse_key 値を指定できるため、デバイスは同じ collapse_key の複数の通知を受信しません。APNS には同様の機能がありますか、またはこの機能をエミュレートする方法を知っている人はいますか?
5 に答える
iOS 10 以降、HTTP/2.0 APNS API を使用するapns-collapse-id
と、アプリでヘッダーを指定して折りたたみロジックを処理できます。
折りたたまれた通知は、デバイス上で 1 つの通知として表示され、新しいデータで更新され続けます。通知が更新されるたびに、未読通知の一番上にプッシュされます。
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.htmlapns-collapse-id
から取得した説明:
同じ折りたたみ識別子を持つ複数の通知は、1 つの通知としてユーザーに表示されます。値は 64 バイトを超えてはなりません。詳細については、「サービスの品質、ストア アンド フォワード、結合された通知」を参照してください。
デバイスがオンラインになると、送信するすべての通知が配信され、ユーザーが利用できるようになります。ただし、複数の同一の通知で折りたたみ識別子を使用することで、通知の重複を避けることができます。折りたたみ識別子の APNs 要求ヘッダー キーは apns-collapse-id であり、表 6-2 で定義されています。
たとえば、同じ見出しを 2 回続けて送信するニュース サービスでは、両方のプッシュ通知要求に同じ折りたたみ識別子を使用できます。その後、APN はこれらの要求を 1 つの通知にまとめてデバイスに配信します。
iOS 10 では、この種のニーズを処理するように見える新しい「apns-collapse-id」があります。Apple 開発者アカウントを持っている場合は、WWDC 2016 通知セッション ビデオ (707 イントロ ビデオhttps://developer.apple.com/videos/play/wwdc2016/707/ ) を見ることができます。
APNs が通知の配信を試みたがデバイスがオフラインの場合、通知は限られた期間保存され、利用可能になったときにデバイスに配信されます。
特定のアプリの最近の通知は 1 つだけ保存されます。デバイスがオフラインのときに複数の通知が送信されると、新しい通知ごとに前の通知が破棄されます。最新の通知のみを保持するこの動作は、合体通知と呼ばれます。
collapse_key
したがって、iOSでは必要ありません。
参考collapse_key
までに、デバイスがオフライン/非アクティブの場合にのみ役立ちます。
このパラメーターは、折りたたむことができるメッセージのグループ (collapse_key: "Updates Available" など) を識別し、配信を再開できるときに最後のメッセージのみが送信されるようにします。これは、デバイスがオンラインに戻ったとき、またはアクティブになったときに、同じメッセージを大量に送信しないようにするためです(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 アプリ コードではなく、サーバー コードにロジックを配置します。