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通知を利用するために、開発者が事前に証明書を登録します。

  1. Push通知用のトークン鍵または証明書を Apple Developer サイトより取得する。
  2. 取得したトークン鍵または証明書を デベロッパーコンソール より登録する。

その後、以下の手順でインスタレーションの登録を行います。

  1. iOS端末へのアプリインストール後にDeviceTokenが払い出される。
  2. DeviceToken 情報を含むインスタレーションをモバイルバックエンド基盤へ登録する。
_images/APNs_1_Regist.png

APNs 経由のPush通知

APNsに紐付くインスタレーションに対するPush通知は以下のように行われます。

  1. 送信者からモバイルバックエンド基盤へPush通知要求を行う。
  2. モバイルバックエンド基盤からAPNsサーバへPush通知要求を行う。この要求には、インスタレーションのDeviceToken情報が付加される。
  3. APNsサーバよりiOS端末へPush通知が送信される。
_images/APNs_2_SendPush.png

FCM の場合

FCM に対応するインスタレーション登録

FCM のPush通知を利用するために、開発者が事前にFCMのサーバーキーを登録します。

  1. サーバーキーを Firebase コンソールより取得する
  2. 取得したサーバーキーをモバイルバックエンド基盤デベロッパーコンソールに登録する

その後、以下の手順でインスタレーションの登録を行います。

  1. Android端末へのアプリインストール後に Registration ID が払い出される
  2. Registration ID 情報を含むインスタレーションをモバイルバックエンド基盤へ登録する
_images/FCM_1_Register.png

FCM 経由のPush通知

FCMに紐付くインスタレーションに対するPush通知は以下のように行われます。

  1. 送信者からモバイルバックエンド基盤へPush通知要求を行う。
  2. モバイルバックエンド基盤からFCMサーバへPush通知要求を行う。この要求には、サーバーキー及びインスタレーションのRegistrationID情報が付加される。
  3. FCMサーバよりAndroid端末へPush通知が送信される。
_images/FCM_2_SendPush.png

SSE Push の場合

SSE Push に対応するインスタレーション登録

SSE Push通知を利用するためには、モバイルバックエンド基盤サーバ管理者の他に SSE Push サーバおよび RabbitMQ サーバを立ち上げ、接続設定を行っておく必要があります。

設定の詳細は、「SSE Push サーバのセットアップ」 を参照ください。

その後、以下の手順でインスタレーションの登録を行います。

  1. デバイス情報を記載したインスタレーションをモバイルバックエンド基盤へ登録
  2. モバイルバックエンド基盤から RabbitMQ を経由して SSE Pushサーバへデバイス/認証情報が登録される
  3. 端末へ認証情報が返却され、SSE Pushサーバへの接続が可能となる
_images/SSE_1_Register.png

SSE Push 経由のPush通知

SSE Push に紐付くインスタレーションに対するPush通知は以下のように行われます。

  1. クライアントは事前に SSE Push サーバに対し接続を行っておく。
  2. 送信者からモバイルバックエンド基盤へPush通知要求を行う。
  3. モバイルバックエンド基盤から SSE PushサーバへPush通知要求を行う。
  4. SSE PushサーバよりクライアントへPush通知が送信される。
_images/SSE_2_SendPush.png

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通知が行われます。
_images/Push_Channels.png

補足: チャネルの実体について

本 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 はクエリ式ではなく別の方法で指定する形になります。