1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Androidでgoogle-services.jsonを置かずにFCMからのPushの受信

Last updated at Posted at 2021-06-03

FCM(Firebase Cloud Messaging)をつかったPush通知の際、
通常、google-services.jsonをappフォルダ以下に配置して実装しているかと思います。

google-services.jsonはFCMのアカウント(およびプロジェクト)に紐づくjsonファイルとなっており、
基本的に1つのFCMアカウントからのメッセージしか受診できません。

同じアプリでユーザーによって送信元のFCMのアカウントを切りかえたいという話があったので
その調査のメモ書きになります。

##前提事項

前提事項として、google-services.jsonを配置した状態でFCMのPush通知が届いている環境であることを想定しています。

Push通知が届かない場合の問題の切り分けとして、単純に設定不足なのか
今回の設定が効かなかったのかを区別するため上記前提となっております。
なので、google-services.jsonありの状態との差分の説明になります。

###google-services pluginのコメントアウト
google-services.jsonを探しにいくgoogle-servicesのpluginの読み込みを止めます。
こちらがあるままだと、google-services.jsonを取り除くと
google-services.jsonが見つからない旨のエラーになります。
image.png

###google-services.jsonから必要な情報を取得
後でgoogle-services pluginが行っているgoogle-services.jsonファイルの取得の代わりを実装しますので
google-services.jsonから[プロジェクトID]、[アプリケーションID]、[APIキー]をコピーするなりして保存しておいてください。
後で使います。

google-services.json
{
  "project_info": {
    "project_number": "XXX",
    "project_id": "[プロジェクトID]",
    "storage_bucket": "XXX"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "[アプリケーションID]",
        "android_client_info": {
          "package_name": "XXX"
        }
      },
      "oauth_client": [
        {
          "client_id": "XXX",
          "client_type": 3
        }
      ],
      "api_key": [
        {
          "current_key": "[APIキー]"
        }
      ],
      "services": {
        "appinvite_service": {
          "other_platform_oauth_client": [
            {
              "client_id": "XXX",
              "client_type": 3
            }
          ]
        }
      }
    }
  ],
  "configuration_version": "1"
}

###google-services.jsonの削除
google-services.jsonを探しに行く仕組みを止めて必要な情報を取得したので、
google-services.jsonファイルをapp以下から取り除きます。
appフォルダ以下にあるgoogle-services.jsonをフォルダを開いて削除します。

###FireBaseの初期化の実装

FireBaseの初期化
var options = FirebaseOptions.Builder()
    .setProjectId("[プロジェクトID]")
    .setApplicationId("[アプリケーションID]")
    .setApiKey("[APIキー]")
    .build()
FirebaseApp.initializeApp(this, options)

(ソースはkotlinのプログラムになってます。)
上記を最初に起動するActivityのonCreateなどに実装すればpushが届くかと思います。
状況に合わせて[プロジェクトID]、[アプリケーションID]、[APIキー]を変えれば、
FCMのアカウントの切替などができるかと思います。
※アプリ内の操作をトリガーに上記を呼び出して切り替えをすると、
 消したはずのFCMアカウントからもPushが届いたりするので
 初回インストール時点での切替にした用が良さげです。

###余談
FirebaseApp.initializeApp(this, options)は呼ばないでおくと
起動後しばらくしてExceptionが発生するようです。
操作後にFCMの初期化をしたい場合は、
最初に
FirebaseApp.initializeApp(this)
を呼び出しておくとExceptionは回避できました。

##参考
下記Firebaseのドキュメントを元に試した内容になります。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?