[Android]リアルタイムデベロッパー通知をFirestoreに保存


少し前に、Androidのサブスクリプションについて、GooglePlayから更新情報を取得しFirestoreに保存する実装をしたので、思い出しながらまとめてみた。

前提

  • Firebaseでプロジェクトを作成している
  • FirebaseでCloud Functionsを編集できる権限を持つ
  • Google Play Consoleで編集できる権限を持つ
  • Cloud PubSubを設定する権限を持つ

実装手順

Cloud PubSubでトピックの作成

参考:トピック作成手順

  • Cloud Pub/Sub設定ページに移動
  • (必要であれば)プロジェクトを変更
  • 「トピックを作成」を押すと、作成ダイアログが表示される
  • トピックIDを入力
  • 暗号化は「Googleが管理する鍵」 -「トピックを作成」を押す

Cloud PubSubでサブスクリプションの作成

参考:サブスクリプションの追加

  • Cloud Pub/Sub設定ページに移動
  • 対象のトピックのメニュー>サブスクリプションを作成
  • サブスクリプションIDを入力
  • 配信タイプはpull
  • 「作成」を押す

Cloud PubSubで公開権限を付与

参考;公開権限を付与

  • Cloud Pub/Sub設定ページに移動
  • 対象のトピックのメニュー>権限の表示
  • 「メンバーを追加」を押す
  • [email protected]を入力
  • 役割は「Pub/Subパブリッシャー」を選択する
  • 「追加」を押す

※Cloud Pub/Subの「トピックの名前」をコピーしておく。

GooglePlayConsoleでトピックの設定

参考:トピックの設定

  • Consoleに移動する
  • 該当のAndroid アプリを選択
  • [開発ツール] > [サービスと API] ページに移動
  • ページ下部の [リアルタイム デベロッパー通知] までスクロール
  • Cloud Pub/Subの「トピックの名前」をコピーし、入力する
  • 「保存」を押す

Cloud Functionの実装

参考:Firebase Cloud FunctionsとCloud Pub/Subの連携
Firebase Cloud Functionsを使い、Firestoreに保存する。コレクションの名前はgoogleplayとする。

Cloud Functionsのindex.jsに以下を追加する。

//GooglePlayからの通知
exports.androidUpdateNotification = functions.pubsub.topic('[subscription]').onPublish((message) => {    
  try {
    var json = message.json;
    json.timestamp = admin.firestore.FieldValue.serverTimestamp();  
    json.date = new Date().getTime();

    let ref = admin.firestore().collection("googleplay").doc();
    ref.set(json).then(ref => {
      console.log("success to add");
    }).catch(error => {
      console.log(error);
    });

  } catch (e) {
    console.error('PubSub message was not JSON', e);
  }
});

[subscription]のところには、Cloud Pub/SubのトピックID(トピック名でない)を入力する。
編集が終わったらDeployする。

テスト

GooglePlayConsoleからテストの通知を送ることができます。

  • Consoleに移動する
  • 該当のAndroid アプリを選択
  • [開発ツール] > [サービスと API] ページに移動
  • ページ下部の [リアルタイム デベロッパー通知] までスクロール
  • 「テスト通知を送信」を押す

終わりに

リアルタイムデベロッパー通知を利用し、Firestoreに保存するところまでできました。
これで、ユーザーのサブスクリプション状態の変更を受け取ることができます。