【问题标题】:Firebase messaging failing on flutter after some time一段时间后,Firebase 消息传递失败
【发布时间】:2019-06-08 16:17:01
【问题描述】:

我在 Flutter 上遇到了 FCM 问题。我已经从我的服务器实现了消息传递,所以我为每个用户存储了我的电话令牌。

问题是,当用户第一次登录时,一切正常,消息正在发送并通知用户。

如果我在周末不使用该应用程序,周一我会尝试通过在我的应用程序上执行一些操作来发送消息,但没有发送消息。我可以看到我的令牌正确存储在我的数据库中。

我正在使用 firebase_messaging 2.1.0 进行颤振。

这就是我获得令牌的方式

 _fireBaseMessaging.getToken().then((token){
  _myPhoneToken = token;
});

1-我知道令牌可能会在以下情况下发生变化:

  • 应用删除实例 ID
  • 应用已在新设备上恢复
  • 用户卸载/重新安装应用程序
  • 用户清除应用数据

但是这一切都没有发生。

关于如何处理这种情况的任何建议?提前致谢。

更新

【问题讨论】:

  • 您是否尝试使用FCM rest API 发送通知以查看是否有效?获取错误反馈也很有用。我建议使用Postman 来完成这项任务。
  • 是的,我缺少授权密钥。我添加了它,但还是一样。
  • 是的,我明白了^^。如果您的应用程序终止,您是否看到数据消息不起作用。请参阅 README.md 或 here 中的表格。如果您只有标题和正文要显示,我建议您发送通知而不是数据消息。如果应用程序被终止,这也有效。
  • 如果您想要快速交货,还可以设置优先级:高。现在我在旅途中(用手机写信)。只要我在笔记本电脑前,我就可以向您展示有效载荷。但在这里你可以看到example
  • 您是否尝试过具有高优先级的通知消息?告诉我。

标签: firebase dart flutter firebase-cloud-messaging


【解决方案1】:

如果您以正确的方式设置了 FCM sdk(但您说它在您第一次安装应用程序时就可以工作,所以我猜是这样)。

如果您确定您使用的device_token 是您希望接收通知的设备之一(检查它是否仍然相同),您应该很快就会在此设备上收到您的通知如果你使用"priority" : "high"

{
 "to" : "device_token",
 "priority" : "high",
 "notification" : {
     "sound": "default",
     "body" : "Test Notification body",
     "title": "Test Notification title"
 }
}

这个方法调用

_firebaseMessaging.getToken().then((String token)

即使已更新,也始终返回新令牌。因此,如果您在设备上将其打印出来并在此令牌上正确发送通知,那么如果设备具有有效的互联网连接,则没有理由不获取令牌。

确实,设备令牌可以随时间变化。如果您卸载并重新安装该应用程序,您会看到令牌会发生变化,如果您尝试在旧令牌上发送通知,则会收到错误消息。

如果令牌在应用程序生命周期内发生变化,您可以通过监听在服务器端收到通知:

_firebaseMessaging.onTokenRefresh.listen((newToken) {
  _fcm_token = newToken;
  // send the new fcm to your server
});

首先,我建议您能够使用 Postman 向设备发送通知。检查您正在使用的令牌是否仍然是设备上的令牌。然后您可以尝试卸载并重新安装应用程序并尝试使用旧令牌。你会得到一个错误。然后尝试发送到新的,您应该会收到通知。

然后等待几天再试一次,检查令牌是否已更改,如果未更改,您应该能够使用相同的令牌发送通知而不会出现问题。

另外请注意,如果应用终止,Android 上的data message 仍然不受支持。

【讨论】:

    【解决方案2】:

    由于不活动(5 分钟无消息),某些网络/路由器/移动设备可能会切断 firebase 库和 firebase 服务器之间的连接。库最多可在 30 分钟(FCM 加热间隔)内检测到此切割。

    这些是讨论这个问题的一些链接:

    我联系了 Firebase 支持,但他们说由于问题是由外部部件引起的,他们无法修复(我建议减少心跳间隔...)

    我使用应用这些说明的间隔作业在 android 中修复了它:

    context.sendBroadcast(new Intent("com.google.android.intent.action.GTALK_HEARTBEAT")); context.sendBroadcast(new Intent("com.google.android.intent.action.MCS_HEARTBEAT"));

    您可以为 Android 端编写此特定代码,并且应该为 ios 端找到类似的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多