最初に
FCM の Android 版にはメッセージがデバイスが1ケ月以上オフラインだったり、接続されたときに未読メッセージが100件を超えてる場合は onDeletedMessages() が呼ばれることがある とあります。
状況によっては、FCM からメッセージが配信されないことがあります。
これは、特定のデバイスが接続されたときにそのデバイスにまだ配信されていないアプリのメッセージが多すぎる(100 件を超えている)場合や、
デバイスが 1 か月以上 FCM に接続されていない場合に起こります。
このような場合、FirebaseMessagingService.onDeletedMessages() へのコールバックを受け取ることがあります。
アプリ インスタンスがこのコールバックを受け取った場合は、
アプリサーバーとの完全な同期を実行する必要があります。
過去 4 週間以内にそのデバイスのアプリにメッセージを送信していない場合、onDeletedMessages() は呼び出されません。
実験してみた
端末を機内モードに設定しインターネットに接続できない状況で、
110 件 のプッシュ通知を送信してみました。
{
"priority" : "high",
"data" : {
"title" : "{val}",
"message" : "hello",
}
}
条件:
・10秒毎に1件送信
・カスタムペイロードで送信
※{val} には「送信件数」が入るようにしています
送信内容が完全同一の場合に1通にまとめられる可能性を(念の為に)潰してます
機内モードを解除し、インターネット接続ができるように戻します。
結果、、、
何度やっても onDeleteMessages() が呼ばれません。
なぜ?
これはおかしいと思い、翻訳が間違ってるのかなと思い原文を読み直しました。
In some situations, FCM may not deliver a message.
This occurs when there are too many messages (>100) pending for your app on a particular device
at the time it connects or if the device hasn't connected to FCM in more than one month. In these cases, you may receive a callback to FirebaseMessagingService.onDeletedMessages()
When the app instance receives this callback, it should perform a full sync with your app server.
If you haven't sent a message to the app on that device within the last 4 weeks, FCM won't call onDeletedMessages().
条件として
・特定のデバイスでアプリに対して保留中のメッセージが多すぎる(> 100)場合
・接続時、またはデバイスが1か月以上FCMに接続されていない場合
とあり And 条件ではなく OR と書かれています。
ただ「必ず呼ばれる」とは書かれておらず may と表現されてるので、呼ばれないケースも普通にあるということですね。。
やり方を変えてみた
機内モードにするのと「端末の電源オフ」では内部事情が違うのではと思い、
電源を切ってる状態で110件送ることにしました。
アプリを起動後10秒ほど経過後に onDeletedMessages() がコールされました!
呼ばれないだろと思ってただけにちょっと感動しました。
結論
onDeleteMessages() は実際にテストする事ができます。
なお今回の検証では FCM バージョンは v20.2.4 を利用ました。
なお stackオーバーフロー に 2つの条件が重なったときに呼ばれる と記載してる方もいますが、
原文ではそのように記載されおらず、片方の条件だけでも呼ばれることが確認できました。