MonacaでFirebase Cloud Messaging(FCM)を使ってプッシュ通知(するのはやめた)

結論的には、CordovaでFCMのプッシュ通知をする方法と同じ方法でやればできるはずですが、そのためには、結局Monacaの便利なデバッグアプリとか使えないし、ほぼ純粋にCordovaをいじってるのと変わらなくなるので、あまり意味がないと思いまいた。Monacaの便利な機能を使わないのであれば、余計なコードが入っているのも無駄だと思います。当たり前かもしれませんが、自由度高く開発するのであれば、cordovaにしておいた方がいいなと思いました。

CordovaでFirebase Cloud Messaging(FCM)を使ってプッシュ通知(Android)

cordovaでAndroidのプッシュ通知をします。
GCMを使ってプッシュ通知する方法が、Firebaseを使う仕様に変更されています。FirebaseのFirebase Cloud Messaging(FCM)です。cordova-plugin-fcmというプラグインを利用します。

まずはFirebase Notificationを使ってテスト

まずは、Firebase Notificationを使ってテストします。Firebase Notificationは、FCMの一機能で、WEB上でメッセージなどを登録することで、簡単にpush通知ができるサービスです。アプリ側での受信設定などもせずにテストできます。やることは、FCMにアプリを登録し、AndroidにFirebaseを登録して、Firebase NotificationのWEBフォームからメッセージを送信するだけです。

Firebaseでアプリを登録

Firebaseのコンソールに行きます。

  • 新規プロジェクトを作成します。
  • AndroidアプリにFirebaseを追加をクリックして、追加します。
  • 追加した際にダウンロードされる、google-services.jsonをplatforms/android直下に配置します。

config.xmlの設定

プロジェクト作成時に記載したパッケージ名とconfig.xmlに記載されている、id名が同じか確認します。異なる場合は、config.xmlを正しいパッケージ名に修正します。

実機にAndroidアプリをインストール

$ cordova run android

Firebase Notificationのテスト

Firebaseのコンソールから、アプリを選択して、左側のサイドバーからNotificationsをクリックすると、Notificationの一覧画面が表示されます。右上の新しいメッセージをクリックして、メッセージを入力し、パッケージ名を選択して、送信します。これで画面に表示されれば成功です。Firebase Notificationは、デフォルトではアプリが表示されている状態だと何もしません。一旦アプリをバックグラウンドにしてから、メッセージを送信します。

FCMを使ってみます

FCMは、端末毎やトピック毎に送信を管理できます。まずは簡単なテストからやってみます。やることは、端末側で端末IDを取得し、その端末IDをコンソールに表示させます。その端末IDをメモって、FCMにPOSTでプッシュ通知させるようにしてみます。これで動けばとりあえずプッシュ通知成功です。

cordova-plugin-fcmプラグインをインストール

$ cordova plugin add cordova-plugin-fcm

cordova.jsを読み込む

www/index.html内で、cordova.jsを読み込むようにします。

<script type="text/javascript" src="cordova.js"></script>

端末IDの取得

端末IDの取得等のコードを書くときは、devicereadyイベントが取得後にしないといけません。deviceready前だと何もせずに終わってしまいます。cordova createで作成したプロジェクトはデフォルトで、index.jsというのがあります。ここにdevicereadyイベント発火後に動作する、onDeviceReady関数がありますので、この中に、端末取得コードを書いていきます。FCMPlugin.getToken()で取得できます。使い方の説明は、https://github.com/fechanique/cordova-plugin-fcmに色々書いてあります。

onDeviceReady() {
  /* global FCMPlugin */
  FCMPlugin.getToken(
    (token) => {
      console.log(token);
      alert(token);
    },
    (err) => {
      console.log(`error retrieving token: ${err}`);
    }
  );
}

上記を追加してcordova run android を実行すると、画面にトークンが表示されますし、ログにも出力されます。長いのでログからコピーしておきます。

Firebase APIにPOSTアクセスして、メッセージ送信

まず、Firebaseのコンソールに行き、プロジェクトを選択し、設定画面に行くと、クラウドメッセージングというタブがあるので、それをクリックします。すると、Server Keyがありますので、これをコピーします。

POSTアクセスする

ここに仕様が書いてあります。ここには、送信データのパラメータの説明が書いてあります。
chrome拡張のpostmanでやってみます。

URL: https://fcm.googleapis.com/fcm/send
method: POST

[header]

Content-Type: application/json
Authorization: key=(コピーしたServer Key)

[body]

{
  "to": "(コピーしたToken)",
  "priority": "high",
  "notification": {
    "title": "Test",
    "body": "テストです",
    "icon": "icon",
    "color": "#99cc22"
  }
}

これで端末にpush通知が来れば成功です。

プッシュ通知にdataを渡してアプリで使う

アプリに受け取りコードを書く

トークン取得時と同じ場所にコードを書きます。

onDeviceReady() {
  /* global FCMPlugin */
  FCMPlugin.onNotification(
    (data) => {
      if (data.wasTapped) {
        // Notification was received on device tray and tapped by the user.
        alert(JSON.stringify(data));
      } else {
        // Notification was received in foreground. Maybe the user needs to be notified.
        alert(JSON.stringify(data));
      }
    },
    (msg) => {
      console.log(`onNotification callback successfully registered: ${msg}`);
    },
    (err) => {
      console.log(`Error registering onNotification callback: ${err}`);
    }
  );
}

Firebase APIにPOSTアクセス

プッシュ通知にdataを渡すとアプリで使えます。postデータは下記のようにdataを使います。notificationに、click_actionを追加していますが、これがないと、Androidのバックグラウンド時に、通知をタップしたあとの処理が動きませんでした。

{
  "to": "(コピーしたToken)",
  "priority": "high",
  "notification": {
    "title": "Test",
    "body": "テストです",
    "icon": "icon",
    "color": "#99cc22",
    "click_action":"FCM_PLUGIN_ACTIVITY"
  },
  "data": {
    "title": "受け取りテスト",
    "score": 30
  }
}

これで、Androidの場合、フォアグラウンド時、バックグラウンド時ともに、プッシュ通知が表示され、アプリ側でdataの内容を操作できることが確認できました。