Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

リアルタイム デベロッパー通知を追加する

概要

Google Play 請求サービスのサーバーのプッシュ通知を使用すると、Play で管理される定期購入の状態変化を監視できます。また、リアルタイム デベロッパー通知を有効にすると、既存の定期購入にアップデートがある場合に Cloud Pub/Sub から購入トークンが直接送信されます。

リアルタイム デベロッパー通知では、定期購入の状態に関する詳細情報(ユーザーが定期購入のコンテンツに現在アクセスできるかどうかなど)は提供されません。トークンを受け取ったら、必ず購入トークンを使用して Google Play Developer API にクエリを実行し、詳細情報を取得して、ユーザーの現在の登録ステータスでバックエンドを更新する必要があります。

通知タイプは将来変更される可能性があります。そのため、不明な通知タイプに対処できるようにしてください。また、重要なビジネス ロジックには必ず Google Play Developer API を使用する必要があります。

この機能を有効にする手順は次のとおりです。

  1. 自身の Google Cloud Platform(GCP)プロジェクトで Cloud Pub/Sub を設定します。
  2. Android アプリに対するリアルタイム デベロッパー通知を有効にします。

Cloud Pub/Sub をセットアップする

Cloud Pub/Sub はフルマネージドのリアルタイム メッセージング サービスであり、個別のアプリ間でメッセージを送受信できます。Cloud Pub/Sub を使用することで、耐久性に優れた低遅延のメッセージングを実現できるため、Google Cloud Platform および外部でホストされているシステムを簡単に統合できます。

Google Play 請求サービスでは、定期購入しているトピックに関するプッシュ通知を公開するために Cloud Pub/Sub を使用しています。

前提条件の設定

Cloud Pub/Sub を使用するには、Cloud Pub/Sub API が有効化されている Google Cloud Platform(GCP)上にプロジェクトが存在する必要があります。GCP と Cloud Pub/Sub の使用経験がない場合は、クイックスタート ガイドをご覧ください。

プッシュ通知を受信するには、安全なバックエンド サーバーを作成し、トピックに送信されたメッセージを消費する必要があります。サーバーでは Cloud Pub/Sub クライアント ライブラリを使用してメッセージを消費できます。

トピックの作成

通知を受信するには、Google Play 請求サービスによって通知を公開するトピックを作成する必要があります。トピックを作成する手順は次のとおりです。

  1. トピックの作成で手順を確認します。
  2. Google Cloud Platform Console を使用してトピックを作成します。

Pub/Sub サブスクリプションの作成

トピックに公開されたメッセージを受信するには、そのトピックに対する Pub/Sub サブスクリプションを作成する必要があります。Pub/Sub サブスクリプションを作成する手順は次のとおりです。

  1. Cloud Pub/Sub Subscriber Guide を確認し、サブスクリプションをプッシュ サブスクリプションプル サブスクリプションのどちらにするかを決定します。プル サブスクリプションでは、安全なバックエンド サーバーが Cloud Pub/Sub サーバーへのリクエストを開始してメッセージを取得する必要があります。プッシュ サブスクリプションでは、Cloud Pub/Sub が安全なバックエンド サーバーへのリクエストを開始してメッセージを配信する必要があります。
  2. サブスクリプションの追加で手順を確認します。
  3. Google Cloud Platform Console を使用してサブスクリプションを作成します。

トピックに関する公開権限の付与

Cloud Pub/Sub では次の手順を使用して、トピックに通知を公開する権限を Google Play 請求サービスに付与する必要があります。

  1. Google Cloud Console を開きます。
  2. プロジェクトを選択し、左側のナビゲーション メニューで [Pub/Sub] をクリックします。
  3. トピックを見つけて権限の詳細を開きます。
    図 1. トピックの権限の設定にアクセスする
  4. サービス アカウント google-play-developer-notifications@system.gserviceaccount.com を追加して、Pub/Sub パブリッシャーの役割を付与します。
    図 2. Google Play サービス アカウントを Pub/Sub パブリッシャーとして追加する
  5. 保存してトピックの設定を完了します。
    図 3. トピックの設定完了

アプリに対するリアルタイム デベロッパー通知を有効にする

アプリに対するリアルタイム デベロッパー通知を有効にする手順は次のとおりです。

  1. Google Play Console を開きます。
  2. Android アプリを選択します。
  3. [開発ツール] > [サービスと API] ページに移動します。
  4. ページ下部の [リアルタイム デベロッパー通知] までスクロールします。

    図 4. [リアルタイム デベロッパー通知] 欄

  5. 先ほど設定した Cloud Pub/Sub の完全なトピック名を [トピック名] に入力します。トピック名は projects/{project_id}/topics/{topic_name} の形式である必要があります(project_id はプロジェクトの一意の ID、topic_name は先ほど作成したトピックの名前です)。

  6. [テスト メッセージを送信] をクリックしてテスト メッセージを送信します。テスト公開を実行すると、設定が適切かどうかを確認できます。テスト公開が成功すると、そのことを示すメッセージが表示されます。このトピックに対して実行されているサブスクライバーが存在する場合、そのサブスクライバーはこのテスト メッセージを受信します。

    公開が失敗すると、エラーが表示されます。トピック名が正しいこと、google-play-developer-notifications@system.gserviceaccount.com サービス アカウントに Pub/Sub パブリッシャーとしてのトピックへのアクセス権が付与されていることを確認してください。

  7. [トピックを更新] をクリックします。

トピック名を変更する

メッセージを削除せずにトピック名を変更するには、次の手順を実行します。

  1. 新しいトピックとサブスクリプションを作成して設定します。
  2. 新しいトピックに対して公開されたメッセージの読み取りと処理を開始します。
  3. Play Console でそのアプリのトピック名を更新します。
  4. Stackdriver または Cloud Developer Console を使用して過去のトピックがメッセージの受信を停止するのを待ち、その一方で、新しいトピックがメッセージを受信していることを確認します。
  5. 過去のトピックがメッセージの受信を停止したら、そのトピックを削除します。

トピックを削除する

トピックを削除する手順は次のとおりです。

  1. Google Play Console を使用してアプリのトピック名を削除します。
  2. メッセージが届かなくなったら、Google または Google Cloud Platform Console を使用して Pub/Sub トピックを削除します。

注: トピック名を削除する前に Pub/Sub のトピックを削除すると、メッセージが削除されることがあります。この問題を解決するには、Pub/Sub を使用してトピックを再設定する必要があります。

通知の処理方法を増やす

Pub/Sub トピックにはさまざまな通知が送信される可能性があるため、すべての通知を一様にバイナリ処理するのは現実的ではありません。通知の処理方法をどのようにして増やすかを決める際には、さまざまなオプションを調べる必要があります。たとえば、次のようなオプションがあります。

  • プッシュおよびプル形式の通知を使用する。
  • 1 つのトピックに対して複数のサブスクリプションを設定する。
  • 通知メッセージを他の Pub/Sub プロジェクトに再公開する。

たとえば、1 つのサブスクリプションに複数のプロセスを割り当てて、そのサブスクリプションからメッセージをプルすることができます。サブスクリプションからのメッセージは自動的に読者間で分配されます。これらの各プロセスではさらに、通知を処理したり、リクエストをより専門的なサービスにルーティングしたりできます。

今後、新しい通知タイプが追加される可能性があります。新しい通知が追加されても、サブスクライバーは通常どおり受信したメッセージを確認してスムーズに処理できる必要があります。

注: プッシュ サブスクリプションを使用する場合、プッシュ エンドポイントを追加する前にエンドポイントを登録します。詳しくは、エンドポイントの登録をご覧ください。

詳しくは、Pub/Sub サブスクライバーの概要をご覧ください。

通知トラフィックを監視する

通知トラフィックを監視するには、Google Stackdriver サービスを使用します。このサービスでは、トピックのトラフィックを監視したり、特定の状態に対するアラートを設定したりできます。たとえば、未応答のメッセージ数が多すぎる場合(サブスクライバーに問題がある可能性があります)や、公開数が少なすぎる場合(トピックへの公開に問題がある可能性があります)にアラートを生成できます。

料金と割り当てを決定する

料金と割り当てについて詳しくは、料金割り当てをご覧ください。

データ使用量を見積もる

サブスクリプション通知のデータ部分は、1 つのリクエストあたり約 1 KB です。公開とプル サブスクリプションではそれぞれ別々のリクエストが必要です。つまり、各通知のデータは約 2 KB になります。1 か月あたりの通知数は、請求期間とユーザーの行動によって異なります。請求期間中、各ユーザーに関する通知を少なくとも 1 回受け取ります。

SLA

リアルタイム デベロッパー通知サービスでは、遅延に関する正式な SLA は提供していません。ただしほとんどの通知は、イベントの発生から数秒以内に公開される必要があります。すべてのメッセージがタイムリーに処理されていることを確認するには、Stackdriver ページで使用状況に関する統計情報(未応答メッセージの数など)を監視する必要があります。

JSON の仕様

Pub/Sub トピックに対して作成された各公開には、以下のフィールドからなる base64 でエンコードされた DeveloperNotification が 1 つ含まれています。

{
  "version": string,
  "packageName": string
  "eventTimeMillis": long
  "subscriptionNotification": SubscriptionNotification
  "testNotification": TestNotification
}
プロパティ名 説明
version string この通知のバージョン。最初は「1.0」に設定されます。このバージョンは他のバージョン フィールドとは異なります。
packageName string この通知に関連するアプリのパッケージ名(例: com.some.thing)。
eventTimeMillis long イベント発生時のタイムスタンプ(エポックからのミリ秒数)。
subscriptionNotification SubscriptionNotification このフィールドが存在する場合、この通知は定期購入に関連しています。定期購入に関連する追加情報が格納されます。このフィールドは testNotification と相互に排他的です。
testNotification TestNotification このフィールドが存在する場合、この通知はテスト公開に関連しています。これらは Play Developer Console でのみ送信されます。このフィールドは subscriptionNotification と相互に排他的です。

SubscriptionNotification は以下のフィールドで構成されています。

{
  "version": string
  "notificationType": int
  "purchaseToken": string
  "subscriptionId": string
}
プロパティ名 説明
version string この通知のバージョン。最初は「1.0」に設定されます。このバージョンは他のバージョン フィールドとは異なります。
notificationType int

通知のタイプ。以下のいずれかの値が設定されます。

  • (1)SUBSCRIPTION_RECOVERED - 定期購入がアカウントの一時停止から復帰した。
  • (2)SUBSCRIPTION_RENEWED - アクティブな定期購入が更新された。
  • (3)SUBSCRIPTION_CANCELED - 定期購入が自発的または非自発的にキャンセルされた。自発的なキャンセルの場合、ユーザーがキャンセルしたときに送信されます。
  • (4)SUBSCRIPTION_PURCHASED - 新しい定期購入が購入された。
  • (5)SUBSCRIPTION_ON_HOLD - 定期購入でアカウントが一時停止された(有効な場合)。
  • (6)SUBSCRIPTION_IN_GRACE_PERIOD - 定期購入が猶予期間に入った(有効な場合)。
  • (7)SUBSCRIPTION_RESTARTED - ユーザーが [Play] > [アカウント] > [定期購入] から定期購入を再有効化した(定期購入の再開にはオプトインが必要)。
  • (8)SUBSCRIPTION_PRICE_CHANGE_CONFIRMED - 定期購入の料金変更がユーザーによって確認された。
  • (9)SUBSCRIPTION_DEFERRED - 定期購入の契約期間が延長された。
  • (10)SUBSCRIPTION_PAUSED - 定期購入が一時停止された。
  • (11)SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED - 定期購入の一時停止スケジュールが変更された。
  • (12)SUBSCRIPTION_REVOKED - 有効期限前にユーザーが定期購入を取り消した。
  • (13)SUBSCRIPTION_EXPIRED - 定期購入が期限切れになった。
purchaseToken string 定期購入の購入時にユーザーのデバイスに提供されたトークン。
subscriptionId string 購入した定期購入の ID(例: 「monthly001」)。

注: 通知は、ユーザーの利用資格の変更が必要なイベントの場合にのみ送信されます。たとえば、Refund API ではユーザーの利用資格は変更されないため、通知はトリガーされません。

TestNotification は以下のフィールドで構成されています。

{
  "version": string
}
プロパティ名 説明
version string この通知のバージョン。最初は「1.0」に設定されます。このバージョンは他のバージョン フィールドとは異なります。

以下に、定期購入の通知の例を示します。

{
  "version":"1.0",
  "packageName":"com.some.thing",
  "eventTimeMillis":"1503349566168",
  "subscriptionNotification":
  {
    "version":"1.0",
    "notificationType":4,
    "purchaseToken":"PURCHASE_TOKEN",
    "subscriptionId":"my.sku"
  }
}

以下に、テスト通知の例を示します。

{
  "version":"1.0",
  "packageName":"com.some.thing",
  "eventTimeMillis":"1503350156918",
  "testNotification":
  {
    "version":"1.0"
  }
}