FCMを使ってバッジを付与したい。バッジはiOSの右上についている数字であり、Androidの丸ポチのことを指す。これをChatGPT-4と相談しながら進めたのだ。
進めてから気づいたのだが、Android側はシステム的に自動で処理されていた。コードで書く必要があるのはiOS側だけらしかった。その他色々突っ込んだが、僕にアプリ側の知見がなさすぎるせいで嘘か本当か見抜けず……しかし、少なくともPush通知時にバッジを付与できることまでは確認できたので、それを記事にしたい。
イントロ
Firebase Cloud Messaging(FCM)を使用して、モバイルアプリに通知を送信する際、バッジを付与することでユーザの注意を引くことが可能です。本記事では、Pythonを使用してバックエンドからFCMを通じて通知を送信し、iOSとAndroidの両方で通知バッジを表示させる方法について詳しく説明します。
通知メッセージとデータメッセージの違い
まず、FCMには通知メッセージとデータメッセージの2つの種類のメッセージが存在します。
- 通知メッセージ:これはFCMが自動的に表示を処理するメッセージです。アプリがバックグラウンドまたは停止状態であっても、通知はユーザに表示されます。
- データメッセージ:これはアプリが自分で処理を行うメッセージです。アプリがフォアグラウンドで動作している場合、データメッセージはアプリに直接配信され、アプリが表示やその他の処理を制御します。
これらのメッセージタイプはアプリの状態(フォアグラウンド、バックグラウンド)によって異なる挙動を示します。以下、それぞれの状態(フォアグラウンド、バックグラウンド)における通知メッセージとデータメッセージのふるまいについて説明します。
これらの挙動は、アプリの状態とメッセージタイプによって異なり、それぞれのシチュエーションに応じた通知戦略を考える際に理解しておくべき重要な事項です。
通知バッジを付与する
次に、バッジを付与する方法について説明します。以下は、PythonでFCMを使用して通知を送信するためのコードスニペットです。
from firebase_admin import messaging
# 通知設定
notification = messaging.Notification(
title='Your title',
body='Your body text',
)
# APNS設定
apns_config = messaging.APNSConfig(
headers={
'apns-priority': '10'
},
payload=messaging.APNSPayload(
aps=messaging.Aps(
badge=1,
),
),
)
# メッセージを設定
message = messaging.Message(
notification=notification,
token='your-device-token',
apns=apns_config,
)
# 通知を送信
response = messaging.send(message)
print('Successfully sent message:', response)
このコードでは、messaging.Notificationを使用して通知のタイトルと本文を設定し、messaging.Apsを使用してバッジを設定します。ここではbadge=1と設定していますが、これはiOSデバイスのアプリアイコンに表示されるバッジの数を表しています。また、apns-priorityに'10'を設定することで、通知の優先度を高くしています。
ただい、データメッセージについては優先度を5に設定する必要があることに注意してください。
Apple デバイスにデータ メッセージを送信する場合は、優先度を 5(標準の優先度)に設定する必要があります。高優先度でメッセージを送信するとエラー INVALID_ARGUMENT が発生し、FCM バックエンドで拒否されます。
FCM メッセージについて | Firebase Cloud Messaging
OSごとの挙動と注意点
最後に、OSごとの挙動と注意点について説明します。
iOSとAndroidでは、バッジの挙動が異なります。iOSでは、バッジの数は通知の数を表すため、複数の通知がある場合はバッジの数が増えます。一方、Androidでは、バッジは通知が存在することを示すため、通知の数に関係なくバッジは一つしか表示されません。
また、通知の優先度は、apns-priority(iOS)とandroid.priority(Android)を使用して設定しますが、これらは各OSに特有のプロパティであり、設定値や挙動が異なります。そのため、通知の配信優先度を設定する際には、それぞれのOSの特性を理解することが重要です。
まとめ
この記事では、Firebase Cloud Messagingを用いてiOSとAndroidの両方に通知バッジを付与する方法について説明しました。また、通知メッセージとデータメッセージの違いや、各OSごとの挙動と注意点についても解説しました。これらの知識を用いて、よりユーザーにとって使いやすいアプリを作ることができます。
寸評
バッジが付与されるところまでは確認したが、優先度の違いなどは実機にてちゃんと見られていない。ChatGPTに色々書かせてみたが、どうも公式ドキュメントと見比べてみると細かいところが甚だ怪しい。
FCM メッセージについて | Firebase Cloud Messaging
自分が確認できたのはバッジがつくところまでで、アプリ側の内部的なところについては、残念ながらその真贋を評価できなかった。自分でもよくわからんし評価もできていないことを記事にするわけにはいかないので、結局細かな議論はバッサリと省くことに。うーん、やはりもっと地力が必要……。
質問は以下。
- Push通知をFCMを使ってiOSとAndroidアプリに送っている。ユーザが気づきやすくするために、バッジを付与したい
- 数までは数えなくていい。Androidだと小さい丸がアイコン右上についているが、それをやりたい。iOSは数値を出すのが必須なんだろうか?それならば1固定で良いんだが。
- データメッセージを使って送るサンプルコードを書いてくれ。
- バックエンド側のシステムなんだ。Python3と適切なライブラリを使って書いてくれ。
- Push通知も送っている。Push通知とデータメッセージは一緒に送ると挙動が複雑になるので、別々に送ったほうが良い思っているが。
- データメッセージはアプリが停止している時には配信されないのか?バッジの数を表示させたいだけなら、Push通知(notificationプロパティを使った配信)にbadgeを入れ込むだけのほうがよいのか?
- badgeのプロパティはiOS側だけで有効なのか?Android側のアプリアイコンにも小さな丸はつくのか?
- Pythonのnotificationでbadgeを使おうとしたらエラーが出た
- こんがらがってきたなぁ。状況を整理したい。
- ちょっとここはだらだら書いてるので
- apns-priorityとはなんですか?
- この優先度は、iOSとAndroidの両方で利用されるものですか?
- なるほど。android.priorityとapns-priorityでは、OSの違い以外に、挙動としてどのような違いがありますか?
- なるほど。 通知の仕様は、そのOSの考え方が反映されていますね。 完全に挙動を制御しようとするのではなく、それぞれのOSの考え方に沿って実装することが大事ですね。多少の違いがあってもそれはOSの違いであり、ひいてはそのOSを選んだユーザの意思でもあると考えて、そのうえでアプリ側の伝えたいことを適切に伝えることが重要ですね。
- ふーむ。ブログ記事としてこの話を整理してもらえますか。 お知らせやアラートをバッジと付与するシンプルな手法について、具体的なコードと一緒に書いてください。 通知メッセージとデータメッセージの概念的な違いや、各OSごとの挙動など、注意すべきことも盛り込んでください。 適切に見出しをつけて構造的に書いてください。
- アプリが大きくわけてフォアグラウンド、バックグラウンド、終了した状態があり、それぞれで挙動が違うことについて、明記したほうがいいですね
- フォアグラウンド、バックグラウンド、停止時における、通知メッセージとデータメッセージのふるまいの違いについての部分を、以下に詳述してください。
- iOSにデータメッセージを送るには、優先度を5にする必要がありますか
- アプリの停止時にデータメッセージが届かないのは本当か。公式ドキュメントを読んでいるが、フォアグラウンドとバックグラウンドの挙動しか書いていないように見える。
地力がないなりにだいぶ頑張って聞いている。最終的には、細かいところは本当かどうか判断できないから無意味と考えた。ただ、概念的なところはなんとなく掴めたきがする。以下の13回目の質問部分が、一番の学びだったかもしれない。
通知の仕様は、そのOSの考え方が反映されていますね。 完全に挙動を制御しようとするのではなく、それぞれのOSの考え方に沿って実装することが大事ですね。多少の違いがあってもそれはOSの違いであり、ひいてはそのOSを選んだユーザの意思でもあると考えて、そのうえでアプリ側の伝えたいことを適切に伝えることが重要ですね。
通知むつかしい。