如何在Flatter上刷新firebase令牌?

如何在Flatter上刷新firebase令牌?,firebase,token,flutter,messaging,Firebase,Token,Flutter,Messaging,我有一个Flitter应用程序,它使用Firebase消息传递通知。 这是基本代码,除了在我的数据库中保存令牌之外,它没有任何特殊功能 FirebaseMessaging _firebaseMessaging = new FirebaseMessaging(); _firebaseMessaging.configure( onMessage: (Map<String, dynamic> message) { }, onResume: (Map<String,

我有一个Flitter应用程序,它使用Firebase消息传递通知。 这是基本代码,除了在我的数据库中保存令牌之外,它没有任何特殊功能

 FirebaseMessaging _firebaseMessaging = new FirebaseMessaging();

 _firebaseMessaging.configure(
  onMessage: (Map<String, dynamic> message) {

  },
  onResume: (Map<String, dynamic> message) {

  },
  onLaunch: (Map<String, dynamic> message) {

  },
);


_firebaseMessaging.getToken().then((token) {
  saveToken(token);
});
我是否必须实现某种后台服务,以便在每次刷新时将新令牌保存在数据库上?我记得在AndroidJAVA上使用onTokenRefresh来做这件事,但在Flatter DART中我什么也没发现


我在某处读到令牌每3600秒刷新一次。我想知道这是不是真的。

您可以使用来获取每次收到新令牌时都会接收事件的流。

您可以使用来获取每次收到新令牌时都会接收事件的流。

在用户登录我的应用程序后,每3500秒自动登录一次

我使用的计时器如下:

  void _timerPressed() {
    const timeout = const Duration(seconds: 3500);
    new Timer.periodic(timeout, (Timer t) => _handleSignIn());
  }
在登录发生后,我在“登录”按钮按下方法中设置计时器:

  void _loginPressed() {
    print('The user wants to login with $_email and $_password');
    _handleSignIn()
        .then((FirebaseUser user) => print(user))
        .catchError((e) => print(e));
    _timerPressed();
  }

不要被方法的名称“timerPressed”所愚弄。我使用了一个按钮来测试这项技术,但在我将该方法绑定到登录按钮后,还没有来得及重新命名该方法。

在用户登录我的应用程序后,她每3500秒自动登录一次

我使用的计时器如下:

  void _timerPressed() {
    const timeout = const Duration(seconds: 3500);
    new Timer.periodic(timeout, (Timer t) => _handleSignIn());
  }
在登录发生后,我在“登录”按钮按下方法中设置计时器:

  void _loginPressed() {
    print('The user wants to login with $_email and $_password');
    _handleSignIn()
        .then((FirebaseUser user) => print(user))
        .catchError((e) => print(e));
    _timerPressed();
  }

不要被方法的名称“timerPressed”所愚弄。我使用按键测试这项技术,在我将方法绑定到登录按钮后,还没有来得及重命名该方法。

否,FCM令牌不会每3600秒刷新一次。它仅在以下情况下刷新:

当用户卸载/重新安装应用程序或清除应用程序数据时 您可以使用FirebaseMessaging.deleteInstanceID手动删除FCM实例 您可以使用以下命令侦听令牌刷新流:

FirebaseMessaging().onTokenRefresh.listen((newToken) {
   // Save newToken
});

希望有帮助

不,FCM令牌不会每3600秒刷新一次。它仅在以下情况下刷新:

当用户卸载/重新安装应用程序或清除应用程序数据时 您可以使用FirebaseMessaging.deleteInstanceID手动删除FCM实例 您可以使用以下命令侦听令牌刷新流:

FirebaseMessaging().onTokenRefresh.listen((newToken) {
   // Save newToken
});

希望有帮助

以下是订阅流并在令牌发生更改时更新令牌的示例:

FirebaseMessaging().onTokenRefresh.listen((token) async {
  final prefs = await SharedPreferences.getInstance();
  final String firebaseTokenPrefKey = 'firebaseToken';
  final String currentToken = prefs.getString(firebaseTokenPrefKey);
  if (currentToken != token) {
    print('token refresh: ' + token);
    // add code here to do something with the updated token
    await prefs.setString(firebaseTokenPrefKey, token);
  }
});

以下是订阅流并在令牌发生更改时更新令牌的示例:

FirebaseMessaging().onTokenRefresh.listen((token) async {
  final prefs = await SharedPreferences.getInstance();
  final String firebaseTokenPrefKey = 'firebaseToken';
  final String currentToken = prefs.getString(firebaseTokenPrefKey);
  if (currentToken != token) {
    print('token refresh: ' + token);
    // add code here to do something with the updated token
    await prefs.setString(firebaseTokenPrefKey, token);
  }
});

谢谢我来看看,谢谢。我将对此进行研究。我在initstate中编写这个onTokenRefresh,每次调用它,不仅是在获取新令牌时调用它,还返回旧令牌。我需要此onTokenRefresh only仅对生成的新令牌进行调用。是的,作为一种解决方法,您必须将旧令牌存储在SharedReferences中。每次接到onTokenRefresh调用时,您都可以将其与SharedReferences上的调用进行比较,并仅当它们不同时才将其存储。希望它能帮助汉克斯兄弟,我也是这么想的。@MSARKrish很高兴我能帮上忙。我在initstate中写这个onTokenRefresh,它每次都在调用,不仅是在得到新的令牌时调用,而且还返回旧令牌。我需要此onTokenRefresh only仅对生成的新令牌进行调用。是的,作为一种解决方法,您必须将旧令牌存储在SharedReferences中。每次接到onTokenRefresh调用时,您都可以将其与SharedReferences上的调用进行比较,并仅当它们不同时才将其存储。希望它能帮助汉克兄弟,我也是这么想的。@MSARKrish很高兴我能帮上忙。