Open3

通知(web プッシュ、プッシュ通知)

ピン留めされたアイテム
expsh13expsh13

用語

プッシュ通知は、モバイル・デスクトップ・Webなど、あらゆるプラットフォームでの通知を指す広い概念です。
Webプッシュは、その中でも特に「ブラウザを介した通知」に特化したものです。

expsh13expsh13

プッシュ通知

特徴

  • オフラインとバックグラウンド処理: ユーザーがアプリを操作していない時や、端末がオフラインの時にアプリを動作させることができます。この例では、チャットアプリが開いていないときにメッセージを受信し、ユーザーに通知を表示することができます。また、ニュースアプリがバックグラウンドで更新できるため、端末がオフラインの場合でも新しいコンテンツを表示させることができます。

種類

  • ローカル通知
    ローカル通知は、既に起動している (もしくは起動していた) アプリケーションからプッシュ通知を送るものです。これは、インターネットに接続していなくても利用できます。身近なものだと、アラームアプリで時間になったら通知されるのがこれにあたります。
  • リモート通知
    リモート通知は、インターネットに接続していなければ受け取れません。
    身近なものだと、チャットのメッセージ通知がこれにあたります。

リモート通知の仕組み

リモート通知を送りたい場合、端末と直接コネクションを貼るのではなく、Apple や Google が提供するプッシュ通知サーバーに対してプッシュ通知を送信することを依頼します。Apple は APNs (Apple Push Notification service)、Google は GCM/FCM というサービス名でプッシュ通知サービスを提供しています。APNs や GCM/FCM は端末との TCP コネクションを貼っており、プッシュ通知の配信を一括して代行しています。

Apple や Google が提供するこれらのサービスを直接利用する方法がひとつの方法です。他には、これらのプッシュ通知のサーバーを一段ラップした API を提供するサービスを使う方法があります。

Firebase によるリモート通知

リモート通知を行うには、Google が公式に提供している Firebase Cloud Message (FCM) を使うのが便利です。Android に対しては直接プッシュ通知を配信、iOS 端末に対しても APNs 経由で配信ができます。

要素

APNs

Appleが提供しているPush通知基。
ユーザー端末へのPush通知の送信はここを介して行われる
Production環境とSandbox環境がある
Production環境からは、本番用証明書で配布されたアプリにのみ通知を送信できる
開発時はSandbox環境を用いることで、誤送信のリスクを最小化することができる

デバイストークン

プッシュ通知の送信対象端末を一意に識別するもの
クライアントアプリからAPNsに対してリクエストを行うことで取得できる
下記の特徴があるため、サーバーサイドではユーザーに対して複数紐付けられるようにしておくのが良い

  • 端末が変わると別のトークンになる
  • アプリやOSの再インストールによって別のトークンになる
  • バックアップからの復元時に別のトークンになる
  • ログアウト済みユーザーに間違って通知を送ってしまうことを避けるため、ログアウト時にはトークンの削除も必要

証明書 or 暗号化キー(トークン)

APNsにプッシュ通知の送信をリクエストする際に必要となるもの
Apple Developerアカウントから作成することができ、以下のような違いがある
証明書

  • アプリごとに生成
  • 1年に1度更新が必要
  • 交換によるダウンタイムなし(複数の証明書を作成可能であるため)

暗号化キー(トークン)

  • チームで共通(全アプリで共通)
  • 更新が必要ない
  • 交換によるダウンタイムあり(再生成時にダウンタイムが生まれる)
  • 現在は暗号化キーを用いた方式が推奨されている

フロー

1,2. クライアントアプリ側で通知の許諾ダイアログを表示する。通知APIを使用して行う。これにより、OS の通知システムを使用した通知の表示が可能になる。
※ あくまで「表示」の許諾なので、バックグラウンドプッシュだけを利用する場合は必要ない

3,4. APNsへのデバイス登録を行い、デバイストークンを受け取る
5,6. デバイストークンをバックエンドサーバーに送信しユーザーに紐づける
7. バックエンドサーバーは通知を送信したいタイミングで、ユーザーに紐づくデバイストークンを用い、APNsに通知の送信リクエストを行う
※ この際、アプリのBundleIDやAPNsの環境(production/sandbox)などを指定することで、通知対象をコントロールできる

https://gist.github.com/pine/8b7e58ff7fa259df17351d959c6118f7
https://zenn.dev/chocoyama/articles/5b07eead5ae0aa
https://zenn.dev/howtelevision/articles/cecdb89682fb03