Firebase云消息传递(FCM)令牌有时无法注册

3

我有一个React Native应用,使用React Native Firebase来处理推送通知/云消息服务。总体而言,一切都很好,但是iOS版本存在一个问题。

问题在于我接收到的FCM令牌(const fcmToken = await messaging().getToken())有时有效并且可以正常使用,但有时会出现NotRegistered错误。

我的测试非常简单。我将一个版本上传到TestFlight,然后安装这个版本的应用程序几次,此时接收到的FCM令牌有时是有效的,有时则无效。同样的代码、同样的密钥/证书、同样的设备。

此外,检查APNS标记,它似乎每次都是有效的,没有问题。

  • 我确保在启动时使用[FIRApp configure];设置了Firebase应用程序
  • 我检查了应用程序是否已在APNS上注册
  • 我在另一台iPhone上进行了检查(结果相同)

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

非常感谢任何提示

系统信息:

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

你找到原因了吗? - Pavel Biryukov
你有成功吗?我遇到了同样的问题。 - Mantu
没有,还没有解决。不过我们追踪了这在生产中发生的频率,发现并没有像最初预期的那么糟糕。如果你找到了解决方案,我很乐意听取你的回复。 - baumstumpf
@baumstumpf 当然没问题,伙计。 - Mantu
我遇到了同样的问题,但是当我完成了这些步骤 https://rnfirebase.io/messaging/usage/ios-setup#1-registering-a-key 之后,现在它已经正常工作了。 - Manoj Bhardwaj
显示剩余2条评论
1个回答

1

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

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

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

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;
  }
};


嘿,谢谢你的回复。但是很遗憾我不完全明白你的意思:
  1. 我理解如果应用程序关闭,应用程序状态和FCM服务器状态可能会失去同步。然而,当应用程序仍在前台打开时,令牌已经无效。
  2. 你的代码对我不起作用。${fcm_send_id}的结果应该是什么?我尝试使用await messaging().deleteToken();,但旧令牌和新令牌始终相同。使用await messaging().deleteToken('[DEFAULT]', '*');甚至抛出了运行时错误。 感谢你的帮助。
- baumstumpf
  1. 我不知道,因为我从未尝试过。
  2. 确保 FCM 项目相同,并确保 sendId 相同。
- kyounghwan01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接