少し前に、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設定ページに移動
- 対象のトピックのメニュー>権限の表示
- 「メンバーを追加」を押す
-
google-play-developer-notifications@system.gserviceaccount.com
を入力 - 役割は「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に保存するところまでできました。
これで、ユーザーのサブスクリプション状態の変更を受け取ることができます。