1. Push通知機能¶
1.1. Push通知機能の概要¶
Push通知機能は、iOS / Android 端末に対して、ブラウザ・アプリ・外部システムから Push通知を送信する仕組みを提供するものです。
NEC BaaS では以下の方式をサポートします。
- iOS : APNs (Apple Push Notification Service)
- Android : FCM (Firebase Cloud Messaging) (旧 GCM (Google Cloud Messaging))
- Android : SSE Push (Server Sent Events Push)
- .NET : SSE Push
1.2. Push通知の概念¶
1.2.1. インスタレーション¶
端末にインストールされたアプリのインスタンスのことを「インスタレーション」と呼びます。 Push送信は、このインスタレーションに対して行います。
APNs の場合はアプリインストール後に Device Token が、 FCM の場合はアプリインストール後に Registration ID が OS側から払い出されます。 クライアントは、この Device Token や Registration ID を BaaS サーバに 送信してインスタレーションを登録します。
SSE Push の場合はモバイルバックエンド基盤経由でサーバへ登録し、登録時の認証情報を元にPushサーバへ接続する流れとなります。
APNs の場合¶
APNs に対応するインスタレーションの登録
APNs のPush通知を利用するために、開発者が事前に証明書を登録します。
- Push通知用のトークン鍵または証明書を Apple Developer サイトより取得する。
- 取得したトークン鍵または証明書を デベロッパーコンソール より登録する。
その後、以下の手順でインスタレーションの登録を行います。
- iOS端末へのアプリインストール後にDeviceTokenが払い出される。
- DeviceToken 情報を含むインスタレーションをモバイルバックエンド基盤へ登録する。
APNs 経由のPush通知
APNsに紐付くインスタレーションに対するPush通知は以下のように行われます。
- 送信者からモバイルバックエンド基盤へPush通知要求を行う。
- モバイルバックエンド基盤からAPNsサーバへPush通知要求を行う。この要求には、インスタレーションのDeviceToken情報が付加される。
- APNsサーバよりiOS端末へPush通知が送信される。
FCM の場合¶
FCM に対応するインスタレーション登録
FCM のPush通知を利用するために、開発者が事前にFCMのサーバーキーを登録します。
- サーバーキーを Firebase コンソールより取得する
- 取得したサーバーキーをモバイルバックエンド基盤デベロッパーコンソールに登録する
その後、以下の手順でインスタレーションの登録を行います。
- Android端末へのアプリインストール後に Registration ID が払い出される
- Registration ID 情報を含むインスタレーションをモバイルバックエンド基盤へ登録する
FCM 経由のPush通知
FCMに紐付くインスタレーションに対するPush通知は以下のように行われます。
- 送信者からモバイルバックエンド基盤へPush通知要求を行う。
- モバイルバックエンド基盤からFCMサーバへPush通知要求を行う。この要求には、サーバーキー及びインスタレーションのRegistrationID情報が付加される。
- FCMサーバよりAndroid端末へPush通知が送信される。
SSE Push の場合¶
SSE Push に対応するインスタレーション登録
SSE Push通知を利用するためには、モバイルバックエンド基盤サーバ管理者の他に SSE Push サーバおよび RabbitMQ サーバを立ち上げ、接続設定を行っておく必要があります。
設定の詳細は、「SSE Push サーバのセットアップ」 を参照ください。
その後、以下の手順でインスタレーションの登録を行います。
- デバイス情報を記載したインスタレーションをモバイルバックエンド基盤へ登録
- モバイルバックエンド基盤から RabbitMQ を経由して SSE Pushサーバへデバイス/認証情報が登録される
- 端末へ認証情報が返却され、SSE Pushサーバへの接続が可能となる
SSE Push 経由のPush通知
SSE Push に紐付くインスタレーションに対するPush通知は以下のように行われます。
- クライアントは事前に SSE Push サーバに対し接続を行っておく。
- 送信者からモバイルバックエンド基盤へPush通知要求を行う。
- モバイルバックエンド基盤から SSE PushサーバへPush通知要求を行う。
- SSE PushサーバよりクライアントへPush通知が送信される。
1.3. 配信端末(インスタレーション)の指定方法¶
1.3.1. 配信端末(インスタレーション)の絞り込み¶
Pushを送信する際、配信対象となるインスタレーションの絞り込みを行うことができます。 具体的には以下のような絞り込みが可能です。
- アプリを使用する全端末に配信
- 特定の1つのインスタレーションに配信
- 特定アプリバージョンのインスタレーションに配信
- 特定の「チャネル」を購読しているインスタレーションに配信
絞り込みは、インスタレーションに対する「クエリ」として実現しています。
1.3.2. チャネル¶
配信端末の絞り込みのために、「チャネル」という概念を用意しています。 チャネルを使用することでいわゆる「Pub/Subモデル」型の配信を実現できます。
チャネルは任意の文字列で表現することができ、各端末は任意のチャネルを 「購読(Subscribe)」することができます。Push送信時はチャネルを指定して インスタレーションの絞り込みができます。
チャネルを使用することで、特定の事項(例えば「東京都の天気」 「山手線の運行情報」「特定製品の更新情報」など)に興味がある ユーザに対して配信を行うことが可能になります。
以下の図では、channel1/channel2 というの2つのチャネルに対して送信する場合を示しています。 チャネルを指定した場合、その購読を条件としてインスタレーションのクエリを行い、対象の端末を絞り込みます。
- channel1 を指定した場合、購読している「端末A」「端末B」へPush通知が行われます。
- channel2 を指定した場合、購読している「端末A」「端末C」へPush通知が行われます。
補足: チャネルの実体について¶
本 Push 通知における Pub/Sub モデルは、メッセージキュー(MQ)の Pub/Sub モデルとは 少し異なります。 MQ では「キュー」を用意して Publisher がここにメッセージを送信し、Subscribe に 配信されます。キューの実体は MQ 内に存在しています。
これに対し、本 Push 通知では、「チャネル」は実体としては存在していません。 単に文字列としてインスタレーション内に記載されているだけの存在です。 (したがって、チャネルを作成したりするような操作はありません)。 Push を送信する際、モバイルバックエンド基盤サーバは 指定されたチャネルが記述されているインスタレーション(MongoDB内にオブジェクトとして保存されている)を「クエリ」で検索し、 見つかったインスタレーションに対して Push サーバ宛についてそれぞれ Push を送信するという動作になります。
1.3.3. ユーザを指定して配信したい場合¶
特定の「ユーザ」向けに Push を配信したい場合は、以下のような方法があります。
- ユーザごとにチャネルを1つ用意する方法
- 例えばユーザのメールアドレスをチャネル名とし、そのチャネルに対して送信することで特定ユーザのみに配信ができます。
- オプションフィールドを使用する方法
- インスタレーションには任意のオプションフィールドをJSON形式で指定することができます。
- 例えば {"email": "foo@example.com"} のようにオプションを設定しておき、クエリ式(後述)を指定することで指定ユーザに配信を行うことができます。
- allowedReceivers(受信可能ユーザ/グループ)を使用する方法
- Push送信時に allowedReceives にユーザIDまたはグループ名を指定することで、特定のユーザまたは特定グループに所属するユーザに対して配信を行うことができます。
- この方法を使用する場合は、インスタレーションの登録時にログイン状態になっている必要があります。
1.3.4. クエリ式¶
送信先は MongoDB のクエリ式で指定します。
いくつか例を示します。
// チャネル "chan1" を指定する場合
{ "_channel": "chan1" }
// チャネル "chan1", "chan2" の両方を指定する場合
{ "_channel": {"$in": ["chan1", "chan2"] } }
// オプションフィールド "email" に対する指定を行う場合
{ "email": "foo@example.com" }
// Android 端末のみに送信する場合
{ "_osType": "android" }
// アプリバージョンコード 6 以下の端末を指定する場合
{ "_appVersionCode": { "$lte": 6 } }
"_" で始まるフィールドの詳細については、REST API リファレンスの「Push通知」-「インスタレーションの登録・再登録」の節に記載されていますのでそちらを参照してください。
なお、allowedReceives はクエリ式ではなく別の方法で指定する形になります。