能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

Firebase Cloud Messasingでのサイレント通知とアラート通知の送り分け方法

端的に言うと

Clound Messasingのプッシュ通知がiOS13以降のAPNs仕様に準拠 〜の通知書式組み合わせによっては通知が送信されないパターンが発生する 〜でのサイレントプッシュ通知最小構成は宛先のみ

1) プッシュ通知が届かない

2021年4月7日に充電報告さんアプリで使用しているサイレントプッシュ通知が届かなくなる問題が発生していた。

Firebase Cloud MessagingはFirebaseブランドでGoogleが展開しているサービスとなっている。Clound Messasing経由でAppleの通知サービスAPNs(Apple Push Notification service)機能を使用している。

Firebase Cloud Messaging

iOSの通知についてはAppleよりプッシュ通知サービスの刷新が2021年3月5日にアナウンスされているので、Firebase Cloud MessagingがAppleの仕様変更に対応以後、2021年4月7日以後プッシュ通知が届かなくなったと考えられる。

再度のご案内:APNs Provider APIの要件、3月31日に開始 - ニュース - Apple Developer https://developer.apple.com/jp/news/?id=uzyxiriy

2018年ごろにFirebase Cloud Messasingの通知仕様はHTTP v1に変更されている。今回のトラブルは古い仕様のままだったのが問題だった。すでにHTTP v1に対応済みの場合は通知が届かない様な問題は発生しない。

現行仕様(HTTP v1 API)

旧仕様(Firebaseドキュメント中ではLegacy HTTP protocol)

現行仕様(HTTP v1 API)に通知設定を修正したところ通知が届かない問題は解消した。

具体的にはFirebase Clound Functions 上でFirebase Admin SDKを経由してプッシュ通知を送る際、使用した通知設定を、

	var message = {
		apns: {
			payload: {
				aps: {
					'content-available': 1,
					'priority' : 'high',
				},
			},
		},
		topic: topic
	};

から、

var message = {
	topic: topic
};

に変更した。apns定義を削除した形となっている。

プッシュ通知についてCloud MessasingとAPNsの時系列の動きは以下となっている。

APNsAndFCM

2) Cloud Messasing のHTTP v1 APIの傾向

旧仕様から現行仕様に対応する経緯から現行仕様の特徴をとらえることができたのでまとめてみる。

現行仕様、Cloud Messasing TTP v1 APIは以下の特徴を持つ。

・HTTP v1 APIの基本指定でアラート付き/サイレントプッシュ通知の切り分け可能 ・最低限の記述は宛先(device token, topic, condition)のみ ・最低限の記述の場合はサイレントプッシュ通知(Androidだとデータ通知)扱い ・iOS固有通知設定を上書き可能(取扱注意)

アラート/サイレント プッシュ通知になる条件は以下の表となる。

FCMMessagePattern2

上書きが必要なiOS固有通知設定はいくつかある(通知種類にVoIPを指定するとか通知の期限など)が、不必要な記述を書いてしまうと送信失敗の原因となるので最低限の指定で送信確認できた後、カスタマイズを試みることをおすすめする。

参考