Iganinのブログ

日頃の開発で学んだ知見を中心に記事を書いています。

【Flutter】AWS SNSからFlutterで作成したAndroidアプリにPush通知を送った際に「Unable to handle incoming background message.」が発生した際の解決方法

FlutterでPush通知を実装する場合、firebase_messagingライブラリを使用するかと思います。 私も使用していたのですが、AWS SNSと組み合わせたところ、バックグラウンドでPush通知を受け取ることができませんでした。

AndroidのPush通知に不慣れなこともあり、解決に時間を要したため備忘もかねて記録します。

発生した事象

バックグラウンドの状態でPush通知を送ると、下記のエラーが発生しPush通知を正常に受け取ることができませんでした。 なお、Firebase Cloud Messagingから送信した場合は問題なくPush通知を受け取れています。

I/flutter ( 7845): Unable to handle incoming background message.
I/flutter ( 7845): NoSuchMethodError: The method 'call' was called on null.
I/flutter ( 7845): Receiver: null
I/flutter ( 7845): Tried calling: call(_LinkedHashMap len:1)

本エラーメッセージで検索をかけたところ、Firebase Messagingのライブラリ内でエラーが起きていることがわかりました。 github.com

なおAWS SNSからは下記のペイロードで送っています。 こちらは、 AWS SNSからFirebase Cloud Messaging (FCM)のApplication Platformを作成して、GUI上からメッセージを送ろうとし、 「配信プロトコルごとにカスタムペイロード。」を選択した際にデフォルトで表示される内容です。

f:id:Iganin:20200909143318p:plain

解決方法

送信するペイロードを下記のような形式に変更することで解消しました。

{ 
"GCM": "{ \"notification\": { \"body\": \"body\", \"title\": \"title \" } , \"data\" : {\"key1\" : \"value1\", \"key2\" : \"value2\" } }""
}

dataのpayloadが無視されてしまっていることが原因のようです。 notificationのpayloadに変更し、カスタムのdataはnotification payload内に含ませることでバックグランド状態でもPush通知を受け取れるようになります。

まとめ

AWS SNSで自動生成されたpayloadではうまく動作しないというところがはまりポイントかなと思います。 どなたかのお役に立ちましたら幸いです。

参考