BlogRELATIONS株式会社の開発ブログです。Nativeあけましておめでとうございます!RELATIONS株式会社の大川です。今期目標やその達成に向けたアクションをチームメンバーで共有していました。(その様子はこちらからご覧いただけます。引き続き業務の中で得られたノウハウをどんどんオープンにしていければと思います。APIとFirebaseを組み合わせてサーバーレスでのプッシュ通知配信を検証していました。当初は新しいデータがFirestoreに保存されると、登録されているすべての端末にプッシュ通知を配信していました。今回は実際のアプリ運用を想定して、ユーザーを絞り込んで配信するように変更しました。今回検証したプッシュ通知の配信フローユーザーごとにデバイストークンを管理するデバイストークンをFirestoreに保存する処理は、以下のsaveDeviceTokenというメソッドで実装しています。前回はFirestore上のtokensコレクションにデバイストークンをただ保存しているだけだったので、アプリ起動時にsaveDeviceTokenメソッドが呼び出されると、その度にデバイストークンのデータが増えていく実装になっていました。(同じデバイストークンが何回も登録されており、その分だけ同じプッシュ通知が配信されてしまう状態でした。Authenticationも組み合わせてユーザー情報をFirestoreで管理できるようにしているので、ログイン中のユーザーが保持しているデバイストークンをFirestoreから取得し、saveDeviceTokenに渡されたトークンがすでに登録されていないかを確認しています。Functionsで実装しています。APIを利用してプッシュ通知を配信していました。doc.get('token'));(...以下略)今回はメッセージが投稿されたトピックの購読ユーザーを検索し、そのユーザーが持っているデバイストークンの端末だけにプッシュ通知を配信をしていきます。関数が起動するトリガー設定を変えてメッセージが投稿されたトピックのIDを取得します。トピックIDは、ドキュメントパスでワイルドカード指定した部分のパラメーターをコンテキストから取得しています。ワイルドカード指定したパラメーターの値を取得(...以下略)取得したトピックIDをもとに、そのトピックを購読しているユーザーを検索します。購読ユーザーが保持しているExpo用のトークン文字列からデバイストークンを組み直して、tokens配列に追加しています。APIをリクエストする部分では、配信する通知メッセージにトリガーとなったトピック名を含めるようにしました。)これで、各トピックを購読しているユーザーにだけ、新規メッセージが投稿されたときのプッシュ通知を配信することができるようになりました!配信されたプッシュ通知Firestoreで配列を扱うためのTips上記のサンプルコードでは、ユーザーが購読しているトピックやデバイストークンを配列形式ではなく、値のマップとして保存しています。することで、Firestoreからデータ検索をするためのクエリを書くときの条件指定が簡単になります。.get();ただし、フィールド名に記号が使えないので、Expoのデバイストークンはランダム文字列部分だけを保存するようにしています。}});デバイストークンの消し込み処理iOS端末に対してプッシュ通知の配信を行うAPNsでは、無効になっているデバイストークンをフィードバックするサービスがあります。これを利用することで不要なプッシュ通知配信をAPNsにリクエストせずに済みます。APIは、プッシュ通知配信をリクエストしたときに無効になっているデバイストークンが指定されてもOKが返ります。APIが、処理を完了したことを意味しているようです。]ただし、指定されたデバイストークンがAPNs側で無効になっている場合は、Expo側がAPNsからのフィードバックを処理しているので、その結果を確認することができます。means.","details":{"apns":{"reason":"Unregistered","statusCode":410},"error":"DeviceNotRegistered","sentAt":1547691632},"__debug":{}}}}この仕組みを利用して不要なプッシュ通知配信をリクエストしないためには、いくつかの実装が必要になります。APIでプッシュ通知配信したときに、リクエストしたデバイストークンごとに割り振られるidをデバイストークンとセットで保存する必要があります。フィードバックサービスの結果を確認するときには、そのidを指定して結果を確認し、APNs側で無効となっていればデバイストークンを削除していきます。Functionsとは別で日次のバッチ処理として実装するがあるということです。今回のような検証やプロトタイピングの場合など、デバイストークンがそんなに増加しないのであればフィードバックサービスに対応する必要はなさそうですが、実際のアプリを運用していくタイミングで用意したほうがいいと思います。Messagingに対応したほうが楽かもしれないとも正直考えました。)まとめ今回の検証では実際のアプリ運用を想定して、ユーザーを絞り込んでプッシュ通知を配信してみました。v32の機能など)を検証していこうと思います。12:00ExpoとFirebaseを使った、サーバーレスでのプッシュ通知配信の検証続きTweet関連記事2019-03-27Webエンジニアがスマホアプリをリリースするまでに学んだ32のコト(後編)こんにちは。RELATIONS株式会社の久原です。使ってジオフェンスとプッシュ通知を組み合わせてみましたこんにちは、RELATIONS株式会社の大川です。U...2019-02-05Webエンジニアがスマホアプリをリリースするまでに学んだ32のコト(前編)こんにちは。RELATIONS株式会社の久原です。2019年も開発ブロ...2018-12-04ExpoとFirebaseを使って、サーバーレスで手軽にできるプッシュ通知配信を試しましたこんにちは、RELATIONS株式会社の大川です。はてなブログProRELATIONS株式会社のエンジニアメンバーによる開発ブログです。reserved.スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。