Diary

Diary

日々学んだことをアウトプットする場として初めてみました

FCM を使って push 通知(iOS, Android)

今回は、push 通知の代表格である Firebase Cloud Messaging (FCM) を使って、プッシュ通知を行いました。

通知させる端末は iOS, Android を対象に、通知を行うサーバーは Go の admin-SDK を使って作成しました。

この記事を見たらなるべく迷わずに通知まで行えるように記載しました。

[目次]

環境

// Android
classpath("com.google.gms:google-services:4.3.14")
implementation("com.google.firebase:firebase-messaging:23.1.0")

// iOS
firebase-ios-sdk
  kind = upToNextMajorVersion;
  minimumVersion = 9.0.0
  FirebaseMessaging

// Go SDK
firebase.google.com/go/v4 v4.9.0
google.golang.org/api v0.96.0

Firebase プロジェクト作成

全体に共通する項目として、まずは Firebase console から、プロジェクトを追加します。

Fireabse から端末にメッセージを送る方法

Firebase から端末に対しメッセージを送るには主に次の 2 つの方法があります。

  • トピックを設定しておき、トピックグループに対し送る
  • 端末ごとに発行される FCM 登録トークンを用いて、個別のメッセージを送る

今回は FCM 登録トークンを用います。

Android

FCM setup

何はともあれ、Android で Firebase を使えるセットアップを行います。

Firebase のプロジェクトにおいて、android アプリを追加します。

Android アプリに Firebase を追加』のに従って、google-services.json をダウンロードします。

ダウンロードした json は、アプリレベルの build.gradle と同じ階層に入れてください。
(Project に切り替えると分かりやすいです)

今回は KMM としてプロジェクトを作成しているため、androidApp フォルダ配下に入れています。

続いてこちらの手順に従って、Firebase Assistant を使用して Firebase を追加します
json は Git 管理対象から外すようお願いします)

Tools > Firebase > Cloud Messaging

2. Add FCM to your app の部分で、shared のモジュールか android のメインのモジュールか選択するところがあるので、json を格納したメインモジュールを選択します。

以上でセットアップは終わりです。
お疲れ様でした。

FCM クライアントを設定する

基本的には『Android で Firebase Cloud Messaging クライアント アプリを設定する』に則って進めていきます。

やること

サービスクラスの実装では、ローカルのサーバーを呼んでいますが、iOS と共通にするため shared パッケージで実装しています。
コード

やはり Firebase は Google のサービスということもあり、Android との連携は簡単です。

iOS

公式の『Apple プラットフォームで Firebase Cloud Messaging クライアント アプリを設定する』に沿って設定を進めます。

FCM setup

まずは、Firebase を Apple のプロジェクトに追加します。

まず、先ほど作った Firebase のプロジェクトから、『Apple アプリへの Firebase の追加』を押します。

バンドル ID は、『Xcode > Targets > General > Identity』にあります。

続いて、作成された json をアプリのルートに配置します。
(Git 管理からは外してください。)

最後にパッケージマネージャから Firebase SDK を追加して設定は終わりです。

APNs Keys の登録

続いて、Firebase コンソール上で作業を行います。

『プロジェクトの設定 > Cloud Messaging > Apple アプリの構成』に、APNs 認証キーをアップロードする必要があります。

Apple サービスでは、APNs Keys

まず、以下リンクから APNs Kyes を作成します

https://developer.apple.com/account/resources/authkeys/list

+ を押して、Apple Push Notifications service (APNs) を作成します。

作成した認証キーをダウンロードし、Key ID と共に Firebase プロジェクトにアップロードします。

なお、push 通知に必要な『チーム ID』は、以下のようにして確認できます。

https://developer.apple.com/account/ > Membership > Team ID

注意
APNs を Firebase に登録し直した後は、plist を再度ダウンロードし直す必要があります。
そして、再配置を行います。

『プロジェクトの設定 > 全般 > マイアプリ > Apple アプリ』からダウンロード可能です。

これで apple の FCM の設定は終わりです。
お疲れ様でした。

XCode で設定を行う

設定終わり、と思いきや、もう1ステップ必要です。

公式の手順には書いてないと思うのですが、以下のステップをしないと正常に機能しません。
(参考: APNS device token not set before retrieving FCM Token for Sender ID

1.『プロジェクト名 > 下写真の + ボタン』をクリックする

2.Background Modes と Push Notification を追加する
3."Background fetch" と "Remote notifications" を選択する

FCM クライアントを設定する

Android 同様、FCM 登録トークンを管理サーバー側に送信したいです。

この辺を参考に実装します(github)。
Swift はのりでしか分からないので、一旦パスでお願いします。

生成された token をこちらで送信しています。

トークンを受信するサーバー

本来は、トークンを受け取り何処かで管理する用のことをやりたかったですが、眠すぎて受信するまでで諦めました。

https://github.com/kokoichi206-sandbox/FCM/tree/main/server

本題ではないため飛ばします。

Firebase-admin-sdk で通知を送信する側を実装

Firebase の『サーバー オプションの選択』には、以下の記載があります。

FCM サーバーとの対話には Firebase Admin SDK または基本的なプロトコルの 2 つの方法があり、どちらを使用するか決定する必要があります。
一般的なプログラミング言語で広くサポートされていること、認証や認可を簡単に処理できることから、Firebase Admin SDK を使用することをおすすめします。

おすすめされている Firebase Admin SDK を利用します。

Firebase Admin SDK は、Node、JavaPythonC#、Go がサポートされています。

今回は Go にしておきます。

firebase-admin-go

基本的には、go-admin-sdk のドキュメントや、snippets が参考になるので、そちらを参考にします。

setup

『サーバーに Firebase Admin SDK を追加する』を参考に進めます。

まずはプロジェクトに依存関係をインストールします。

# Install as a module dependency
$ go get firebase.google.com/go/v4

# Install to $GOPATH
$ go get firebase.google.com/go

続いて Firebase の鍵をダウンロードします。

『プロジェクトの設定 > サービスアカウント > Firebase Admin SDK』から新しい秘密鍵を生成します。

Go のプロジェクト内に配置し、後のために環境変数にセットします。

export GOOGLE_APPLICATION_CREDENTIALS="path_to.json"

サーバーサイド

実際に送ってみる

送った時のデモ動画です。
一番左が送信を行う go のプロジェクトを実行するターミナルで、真ん中が iPhone、 右が Pixel3 です。

ちょっと画質いいバージョン

詰まったところ

iOS で Firebase SDK 追加時に NOT FOUND

firebase-ios-sdk could not be resolved という警告が表示され、うまくパッケージ追加できなかった。

https://developer.apple.com/forums/thread/707322

こちらのリンクを参考にし、master から持ってくるのをやめたら解決した。

再度追加する時に、『FirebaseMessaging』のみチェック入れて依存関係を追加した。

おわりに

push 通知送れて楽しかったです!
ただ、どうしても人の作ったサービスで遊んでる感が強いよなぁ。。。