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ではうまく動作しないというところがはまりポイントかなと思います。 どなたかのお役に立ちましたら幸いです。

参考

DroidKaigi2019に参加しました

はじめに

2/7(木)- 2/8(金)に開催されたDroidKaigi 2019に参加してきました。 その感想になります。

本文

DroidKaigiはAndroid関連の技術に関する技術カンファレンスです。 ベルサール新宿グラントで開催されました。 ざっとセッションを見渡すと、以下のような内容が多いのかなと感じました。

個人的に良いなと思ったセッション

自分は普段はiOSをメインで開発しているため、 Androidの具体的な技術の話より 思想やデザインツールとの関わり、クロスプラットフォームのFlutterに関連したセッションにより興味をそそられました。 ※もちろんAndroidの技術よりの話も大変面白かったです。マルチモジュール周辺の話はiOSにも応用できそうな点がありました。

とくに良いと思ったセッションは以下の二つです。

マテリアルデザインの起源とベースとなる哲学

マテリアルデザインの起源とベースとなる哲学 - Speaker Deck

Androidアプリのデザインガイドラインであるマテリアルデザインに関するセッションでした。 デザインの歴史を生産性/合理性と多様性/個性の軸で見直した上で、現代のデザイン環境を定義を行い、 それを元にマテリアルデザインのMatias Duarteのデザイン哲学に迫る大変意欲的な内容でした。 マテリアルデザインのドキュメントにはまだあまり目を通せていませんが、本セッションの内容を 踏まえた上ですとより理解が進むのではないかと感じています。

デザイナーとエンジニアの距離をより近づける Lottie 利用術

デザイナーとエンジニアの距離をより近づけるLottie利用術 - Speaker Deck

アニメーションを描画するライブラリであるLottieとその周辺技術および利用方法に関するセッションでした。 Lottieに関わる技術(AE, AI, bodymovin)と、 Lottieで取り込む際のJSONファイル作成までのワークフロー、 およびLottieでJSONからアニメーションがどのように生成されるかの概要を理解することができました。 Lottieは社内でも導入しているプロジェクトがいくつかあり、また個人的にも関心を持っていたので とても興味深い内容でした。iOS側のJSON -> アニメーションの変換も時間がある際にみてみたいと思います。

最後に

セッションの内容の充実度ももちろんのことですが、技術を向上していこう、よりよいものを作っていこう、 良い方法を学ぼう、そういったポジティブな気持ちで満ちた空間そのものがとても素敵だなと感じました。 企業ブースも大変充実しており、展示をみているだけでもとても楽しかったです。 バリスタさんがいれてくださったコーヒーも大変美味しかったです。

AndroidやKotlinなどに関してもっと学びたい、今回学んだことを早速プロダクトに活かしていきたいと感じました。 来年も参加したい(できればいつかはSpeakerで。。。)と思います。 主催の方々、スタッフの方々、スピーカーのみなさんありがとうございました。