安装的PWA上未显示Firebase服务器

tkclm6bt  于 7个月前  发布在  PWA
关注(0)|答案(1)|浏览(109)

我正在使用firebase通知(FCM活动)向react PWA发送推送通知。一旦用户在手机上安装了PWA,这些通知就会出现一两天,然后就不再出现了。在Android和iOS设备上的行为类似。
当应用程序处于后台时,通知根本不会显示,这是预期的行为。我希望通知每天在特定时间显示,特别是当用户没有打开应用程序时。
以下是我在firebase中设置通知的截图:

我的代码中有一个firebase-messaging-sw(service worker)(在public目录中),它有以下代码:

firebase.initializeApp(firebaseConfig);
const messaging = firebase.messaging();

messaging.onBackgroundMessage(function(payload) {
  const notificationTitle = payload.notification.title;
  const notificationOptions = {
    body: payload.notification.body,
    icon: '/favicon.png',
  };

  self.registration.showNotification(notificationTitle,
    notificationOptions);
});

有人能帮助我为什么通知不显示后的第一天或两天,我应该改变来解决这个问题吗?

wh6knrhe

wh6knrhe1#

通过将PWA添加到主屏幕并使用后台服务工作程序来发出通知,您走上了正确的道路。我不确定你的代码的其余部分是什么样子的,但是一定要提示用户启用它们,并根据需要注册/更新worker。
reactjs的基本示例:
在某些文件中(例如,firebase.js):

const getOrRegisterServiceWorker = () => {
  if ('serviceWorker' in navigator) {
    return window.navigator.serviceWorker
      .getRegistration('/firebase-cloud-messaging-push-scope')
      .then((serviceWorker) => {
        if (serviceWorker) return serviceWorker;
        return window.navigator.serviceWorker.register('/firebase-messaging-sw.js', {
          scope: '/firebase-cloud-messaging-push-scope',
        });
      });
  }
};
const getFBToken = (setTokenFound) => {
    try {
      getOrRegisterServiceWorker()
        .then((serviceWorker) => {
          if (serviceWorker) {
            return getToken(messaging, {
               vapidKey: process.env.REACT_APP_FB_VAPID_KEY, 
               serviceWorker
            }).then((currentToken) => {
              if (currentToken) {
                setTokenFound(true);
              } else {
                setTokenFound(false);
              }
            }).catch((err) => {
              console.error(err);
            });
          }
        });
  } catch (err) {
    console.error(err);
  }
};

在相关组件文件中:

const AppComponent = ({}) => {

  const [displayNotif, setDisplayNotif] = useState(false);
  const [isTokenFound, setTokenFound] = useState(false);

  function reqNotifPerm() {
    try {
      Notification.requestPermission().then((result) => {
        if (result === "granted") {
          try {
            setTokenFound(true);
          } catch (err) {
            console.error(err);
          }
        }
      });
    } catch (err) {
      console.error(err);
    }
  };

  useEffect(() => {
    try {
      if (!(isTokenFound)) {
        setDisplayNotif(true);
      } else if (isTokenFound) {
        setDisplayNotif(false);
        getFBToken(setTokenFound);
      }
    } catch (err) {
      console.error(err);
    }
  },[isTokenFound]);

  return (
    //...
    {displayNotif && <div onClick={() => { reqNotifPerm() }}>
      {"Enable Notifications"}
    </div>}
    //...
  );
};

让我知道如果你有任何进一步的问题,并确保标记为接受的答案,如果它帮助。

相关问题