Google I/O 2016で新しいFirebaseが発表されましたね。
iOSアプリでのプッシュ通知が実現したかったので、早速Firebase Cloud Messaging(FCM)を中心に使ってみました。
その中で、私がハマったところと解決方法を紹介します。
そもそも Firebase Notification と FCM は違うもの
- Firebase Notificationとは、FCMの上に実装された軽量でサーバレスのメッセージサービスです。Webコンソールからプッシュ通知を送ることで、アプリのグロースのために簡単にキャンペーンを行うことができます。
- FCMとは、HTTPやXMPPを通して使う多機能なメッセージサービスです。
というわけで、似てるけど使い方が異なるサービスなわけです。
ドキュメントを読み進める上で、この違いは重要です。
以下は、それぞれを比較した表になります。
(FirebaseのFAQ https://firebase.google.com/support/faq/ から引用)
外部のサーバからFCMを使ってプッシュ通知を送る
HTTP API経由でプッシュ通知
Webコンソールからだけでなく、API経由でプッシュ通知を行いたい場合には、FCMの機能を用います。
以下がcurlでプッシュ通知リクエストを送ってみる例です。
curl --header "Authorization: key=$api_key" \
--header Content-Type:"application/json" \
https://fcm.googleapis.com/fcm/send \
-d "{\"to\": \"/topics/news\",\"notification\": {\"text\": \"メッセージ\"}}"
$api_key
には、Firebase コンソールからダウンロードしたGoogleService-Info.plist
から、API_KEY
をコピーしてください。
コマンドを実行する前に、受信したい端末のアプリから/topics/news
をSubscribeしてください。
サンプルアプリにはその機能が実装されているので、まずはこれからテストするのが良いと思います。 https://github.com/firebase/quickstart-ios/tree/master/messaging
FCMについて、詳しくは https://firebase.google.com/docs/cloud-messaging/server をご覧ください。
ユーザ全体にプッシュ通知を送るにはどうするの?
アプリ起動時に一つのTopicを登録し、そのTopicに対してプッシュ通知を行うことで実現できます。
アプリが終了しても通知を行う
FCMでAPIからプッシュ通知を行う場合、実際に通知が到達するまで遅延があります。また、アプリを終了している場合は、プッシュ通知が届きません。
一方で、コンソール(Firebase Notification)からプッシュ通知を行う場合、そのような問題は起こりません。
そこで、FCMのリクエストでPriorityデータを追加します。
指定がなければnomal
となるPriorityの設定を、high
にすることで、遅延が少なく・アプリが終了していてもプッシュ通知を行うことができます。
https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message
以下がPriorityを設定したPOSTデータのサンプルです。
{
"to": "/topics/news",
"notification": {
"text": "プッシュ通知"
},
"priority": "high"
}
バッテリーの消耗があるため、ユーザのためにも適切な場所に使っていきましょう。
Firebase Notificationでメッセージを作成するときにTopicがでてこない
iOS Firebase SDKからFCMのTopicに登録しようと、ドキュメントにある通りに subscribeToTopic
メソッドを実行しても、すぐにはWebコンソールに選択肢として表示されません。
(多分Android, Web SDKの場合も一緒)
これは、Topicの反映に時間がかかっているためです。私の場合は1日ほど待てばコンソールに反映されて、以下のように選択できるようになりました。
ドキュメント通りにやっているのにうまくいかないのでびっくりしましたが、きっとそのうち修正されるでしょう。
まとめ
すでに多くの場所で紹介されているように、新しくなったFirebaseはAnalyticsなどの機能が非常に有用そうです。
開発を楽をするために積極的に使っていきたいと思います。