アプリのサーバー → APNs / FCM → 端末と届く。デバイストークンの管理と、失敗の扱いが要。
プッシュ通知は、アプリが閉じているときにも利用者に知らせを届けられる、アプリならではの機能です。一方で「通知が届かない」は問い合わせの多い不具合で、原因はアプリの許可・トークンの登録・サーバーからの送信・配信サービス・端末の設定のどこにでもありえます。
経路を分けて知っておくと、どこで止まったかを順に調べられます。
プッシュ通知は、アプリのサーバーから直接端末に送るのではなく、OS の会社が持つ配信の窓口を通して届けます。iOS は APNs(Apple Push Notification service)、Android は FCM(Firebase Cloud Messaging)です。iOS にも FCM を使う場合は、FCM が裏で APNs に渡します。
流れ
- iOS は
UNUserNotificationCenterで許可を求め、registerForRemoteNotificationsでトークンを受け取ります。サーバーから APNs へは HTTP/2 で、認証は .p8 の鍵から作るトークンが一般的です。 - Android は FCM の登録トークンを受け取り、サーバーからは FCM の HTTP v1 API(サービスアカウントの認証)で送ります。Android 13 以降は通知に実行時の許可(
POST_NOTIFICATIONS)が必要です。 - トークンは変わることがあるので、起動のたびや変更の通知(
onNewTokenなど)でサーバーに送り直します。中身の大きさは APNs・FCM とも 4KB までです。
下の「ブラウザで試す」の図では、許可をもらった端末がデバイストークンを受け取って自社のサーバーに送り、出来事が起きたらサーバーが APNs に HTTP/2 で送信を頼み、APNs から端末に届くまでを順に追えます。APNs が 200 を返しても「受け付けた」だけで、端末に届いたとは限らないこと、410 Unregistered のときは保存しているトークンを消すことに注目してください。上の「トークンは変わることがある」とあわせて、トークンの管理が届く・届かないを左右します。
面接ではこう答える
プッシュ通知は、アプリのサーバーから直接端末に送るのではなく、iOS なら APNs、Android なら FCM という OS の会社の配信の窓口を通して届けます。アプリは起動時に許可を求めてデバイストークンを受け取り、自社のサーバーに登録します。サーバーはそのトークンあてに窓口へ送り、窓口が端末に届けます。トークンは変わることがあるので、起動のたびや変更の通知で送り直し、中身は 4KB までに収めます。
Appとの関わり通知の機能の実装と、届かないという問い合わせの調査の出発点になります。
ネットワーク図を読み込んでいます…