質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

3623閲覧

Firebase Cloud Messagingと CloudFunctionsでのPush通知がうまくいかない

退会済みユーザー

退会済みユーザー

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/04/04 13:43

現在、Flutterでアプリを作っており、そのクライアントアプリのButtonを押すと、特定のtoken目掛けてPush通知を送るようなロジックをCloudFunctionsで作っています。

実装していざ押してみると、500 Server Errorが発生しているようでうまくPushが飛びませんでした。
以下、Flutter側とServer側の実装を記します。

Flutter

final HttpsCallable callable = CloudFunctions.instance .getHttpsCallable(functionName: 'sendMessage') ..timeout = const Duration(seconds: 30); onPressed: () async { final HttpsCallableResult result = await callable.call( <String, dynamic>{ // 各パラメータに値が入っていることはログ出力して確認済み 'registerUser': book.data['registerUser'], 'displayName': displayName, 'bookTitle': book.data['title'], }, ); }

CloudFunctions(Node.js)

const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); const db = admin.firestore(); const fcm = admin.messaging(); // Saves a message to the Firebase Realtime Database but sanitizes the text by removing swearwords. exports.sendMessage = functions.https.onCall(async (data, context) => { const registerUserId = data.registerUser; const registerUserToken = db .collection("users") .doc(registerUserId) .get("token"); const sender = data.displayName; const bookTitle = data.bookTitle; const payload = { notification: { title: "てすと", body: `${sender} : ${bookTitle} `, // icon: "your-icon-url", // click_action: "FLUTTER_NOTIFICATION_CLICK", // required only for onResume or onLaunch callbacks }, }; return fcm.sendToDevice('registerUserToken', payload); });

原因切り分けとして、Flutter-CloudFunctionsでデータの受け渡しがうまくいっていない可能性があると考え、registerUserTokenをベタがきで書いてみるとPushが飛ぶようになりました。

CloudFunctionsとNode.jsがわかっておらず、初歩的な質問で申し訳ないのですが、この値の受け渡し方のどのあたりに問題があるのでしょうか。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ざっとコードをみた感じですが...

以下のトークン取得は、非同期ですが、awaitしていない気がします

const registerUserToken = db .collection("users") .doc(registerUserId) .get("token");

以下のプッシュ通知の第一引数が文字列になっており、変数渡せてない気がします

return fcm.sendToDevice('registerUserToken', payload);

console.log とかで各変数の値が適切なものになっているか調べると原因がわかると思います。

投稿2020/04/04 21:52

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/04/05 04:54

registerUserTokenが文字列になっている件は、質問する際に掲載用にソースを加工した際に誤ってクォートで囲っていました。 awaitの件、たしかに抜けていました。どうもありがとうございます。 加えて、以下のように修正し、Flutterとのデータの授受に成功しました。 ``` const registerUserTokenRef = await db .collection("users") .doc(registerUserId) .get(); const registerUserToken = registerUserTokenRef.data()["token"]; ``` どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問