在接下来的12个FCM实施中,firebase版本9 FCM实现

发布于 2025-02-12 03:29:11 字数 2325 浏览 0 评论 0原文

我想在下一个JS(版本12)应用程序上添加推送通知。因此,在此上实现了Firebase云消息传递。实现看起来像这样:

import { initializeApp, getApp, getApps } from "firebase/app"
import { getMessaging, getToken } from "firebase/messaging"
import { firebaseConfig } from "./config"

const app = !getApps.length ? initializeApp(firebaseConfig) : getApp()

并添加了此 CloudMessaging 功能,以获取FCM令牌。 onMessageListener 函数用于显示前景消息

export const cloudMessaging = async () => {
  const token = await isTokenAvailable()
  if (token !== null) {
    return Promise.resolve({
      status: true,
      token: token,
    })
  }
  try {
    const permission = await Notification.requestPermission()

    const messaging = getMessaging(app)
    console.log(messaging)
    console.log(permission)
    if (permission === "granted") {
      const FCM_TOKEN = await getToken(messaging, {
        vapidKey: process.env.NEXT_PUBLIC_FCM_VAPID_KEY,
      })
      if (FCM_TOKEN) {
        localStorage.setItem("fcm_token_prac", FCM_TOKEN)
        return Promise.resolve({
          status: true,
          token: FCM_TOKEN,
        })
      }
    }
  } catch (err) {
    console.log(err, "cloudmessaging error")
    return Promise.resolve({
      status: false,
    })
  }
}
export const onMessageListener = () => {
  const messaging = getMessaging(app)
  console.log(messaging)

  return new Promise((res) => {
    messaging.onMessage((payload) => {
      res(payload)
    })
  })
}

并从我的布局组件中调用这些功能

useEffect(() => {
    firebaseInit()
    async function firebaseInit() {
      try {
        await cloudMessaging()
      } catch (err) {
        console.log(err)
      }
    }
  }, [])

  useEffect(() => {
    onMessageListener()
      .then((payload) => {
        console.log(payload, "onMessageListener")
      })
      .catch((err) => console.log(err, "onMessageListener useEffect"))
  }, [])

,但在控制台中遇到此错误:

 TypeError: messaging.onMessage is not a function
    at eval (firbase.js?100f:58:15)
    at new Promise (<anonymous>)
    at onMessageListener (firbase.js?100f:57:10)
    at eval (Layout.js?4f8d:33:22)
    at commitHookEffectListMount (react-dom.development.js?ac89:23049:1)

我无法找出我在哪里犯了错误的地方。谁能指导我实施此功能?

I wanted to add push notification on my next js(version 12) app. so implemented firebase Cloud messaging on that. implementation looks like this :

import { initializeApp, getApp, getApps } from "firebase/app"
import { getMessaging, getToken } from "firebase/messaging"
import { firebaseConfig } from "./config"

const app = !getApps.length ? initializeApp(firebaseConfig) : getApp()

and added this cloudMessaging function for getting FCM token. and onMessageListener function for displaying foreground messages

export const cloudMessaging = async () => {
  const token = await isTokenAvailable()
  if (token !== null) {
    return Promise.resolve({
      status: true,
      token: token,
    })
  }
  try {
    const permission = await Notification.requestPermission()

    const messaging = getMessaging(app)
    console.log(messaging)
    console.log(permission)
    if (permission === "granted") {
      const FCM_TOKEN = await getToken(messaging, {
        vapidKey: process.env.NEXT_PUBLIC_FCM_VAPID_KEY,
      })
      if (FCM_TOKEN) {
        localStorage.setItem("fcm_token_prac", FCM_TOKEN)
        return Promise.resolve({
          status: true,
          token: FCM_TOKEN,
        })
      }
    }
  } catch (err) {
    console.log(err, "cloudmessaging error")
    return Promise.resolve({
      status: false,
    })
  }
}
export const onMessageListener = () => {
  const messaging = getMessaging(app)
  console.log(messaging)

  return new Promise((res) => {
    messaging.onMessage((payload) => {
      res(payload)
    })
  })
}

And invoking these function from my Layout component

useEffect(() => {
    firebaseInit()
    async function firebaseInit() {
      try {
        await cloudMessaging()
      } catch (err) {
        console.log(err)
      }
    }
  }, [])

  useEffect(() => {
    onMessageListener()
      .then((payload) => {
        console.log(payload, "onMessageListener")
      })
      .catch((err) => console.log(err, "onMessageListener useEffect"))
  }, [])

But getting this error in my console :

 TypeError: messaging.onMessage is not a function
    at eval (firbase.js?100f:58:15)
    at new Promise (<anonymous>)
    at onMessageListener (firbase.js?100f:57:10)
    at eval (Layout.js?4f8d:33:22)
    at commitHookEffectListMount (react-dom.development.js?ac89:23049:1)

I'm unable to find out where I made the mistake. Can anyone guide me to implement this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情仇皆在手 2025-02-19 03:29:11

我认为您可以尝试在导入部分中添加onMessage

import { getMessaging, getToken, onMessage } from "firebase/messaging"

删除消息传递在线

messaging.onMessage

变为

onMessage((payload) => {
    res(payload)
})

SDK版本9

I think you can try adding onMessage in the import part.

import { getMessaging, getToken, onMessage } from "firebase/messaging"

Remove messaging on line

messaging.onMessage

becomes

onMessage((payload) => {
    res(payload)
})

This is for SDK version 9

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文