userNotificationCenter:willPresentNotification:withCompletionHandler:が呼ばれないとき

Firebaseに渡すcontent_availableというパラメータがtrueになっていないかを確認する。

Firebase公式ドキュメント

iOS では、このフィールドを使用して APNs ペイロードで content-available を表します。通知やメッセージの送信時にこのフィールドが true に設定されている場合、アクティブでないクライアント アプリのスリープ状態が解除されます。Android では、既定でデータ メッセージによってアプリのスリープ状態が解除されます。Chrome では現在サポートされていません。

上記の記述からして一見フォアグラウンド通知とは関係なさそうだが、実際の挙動を確認してみると、これがtrueの場合はアプリがフォアグラウンドだろうがバックグラウンドだろうが同じメソッドが呼ばれるということのようだ。

で、なぜかデフォルトのwillPresentNotification…ではなく、iOS10ではバックグラウンド通知時に呼ばれるdidReceivedNotificationResponse…がフォアグラウンドでも呼ばれてしまう。willPresentNotification…は呼ばれない。

content_availableをfalseにしたら無事willPresentNotification…が動いた。

ものすごく分かりにくい。これのせいで丸一日くらい悩んだ。

しかもcontent_availableをfalseにしても普通にスリープ中でも通知が表示されるし。。何のためのパラメータなのかわからない。