首页 > 解决方案 > Firebase 云消息传递的 FCM 令牌有时未注册

问题描述

我有一个带有 React Native Firebase 的 React Native 应用程序,用于推送通知/云消息传递。所以通常一切都很好,但iOS版本有一个问题。

问题是我收到的 FCM 令牌 ( const fcmToken = await messaging().getToken()) 有时是有效的并且可以工作,有时我得到一个错误的NotRegistered原因。

我的测试非常简单。我上传了一个版本到 TestFlight。当我现在多次安装此版本的应用程序时,收到的 FCM 令牌有时有效,有时无效。相同的代码,相同的密钥/证书,相同的设备。

另外检查 APNS 令牌,这似乎是有效的,并且每次我检查时都可以正常工作。

当令牌有时有效而有时无效时,可能会出现什么问题?

任何提示都非常感谢

系统信息:

System:
    OS: macOS 10.15.6
    CPU: (8) x64 Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
    Memory: 557.23 MB / 16.00 GB
    Shell: 3.0.2 - /usr/local/bin/fish
  Binaries:
    Node: 14.5.0 - /var/folders/bn/f6trf3q55vj_hjplf9vy9ls00000gn/T/yarn--1598005931689-0.20174739828176125/node
    Yarn: 1.22.4 - /var/folders/bn/f6trf3q55vj_hjplf9vy9ls00000gn/T/yarn--1598005931689-0.20174739828176125/yarn
    npm: 6.14.5 - ~/.nodenv/shims/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  SDKs:
    iOS SDK:
      Platforms: iOS 13.6, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
    Android SDK:
      API Levels: 28, 29
      Build Tools: 28.0.3, 29.0.2
      System Images: android-28 | Intel x86 Atom, android-28 | Google APIs Intel x86 Atom, android-28 | Google Play Intel x86 Atom
      Android NDK: Not Found
  IDEs:
    Android Studio: 3.6 AI-192.7142.36.36.6392135
    Xcode: 11.6/11E708 - /usr/bin/xcodebuild
  Languages:
    Java: 1.8.0_232 - /usr/bin/javac
    Python: 2.7.16 - /usr/bin/python
  npmPackages:
    @react-native-community/cli: Not Found
    react: 16.13.1 => 16.13.1
    react-native: 0.63.2 => 0.63.2
  npmGlobalPackages:
    *react-native*: Not Found

标签: iosfirebasereact-nativefirebase-cloud-messagingreact-native-firebase

解决方案


fcm 发送 NotRegistered 状态是因为如果你关闭基于 ios 的应用程序,fcm 和应用程序的状态将断开连接。

因此,当您通过执行 getToken 函数获取令牌值时,您将获得旧的令牌值,而不是获得新的刷新令牌。

因此,如果您执行以下代码并使用刷新令牌值再次执行发布消息,您可以正常接收消息。

const getToken = async () => {
  const oldToken = await messaging().getToken();
  await messaging().deleteToken(String(${fcm_send_id}), '*');
  const newToken = await messaging().getToken();
  if (oldToken === newToken) {
     console.log('not refresh')
  } else {
    return newToken;
  }
};


推荐阅读