如何在 Flutter 上刷新 firebase 令牌?

Posted

技术标签:

【中文标题】如何在 Flutter 上刷新 firebase 令牌?【英文标题】:How to refresh firebase token on Flutter? 【发布时间】:2019-01-01 10:18:18 【问题描述】:

我有一个使用 Firebase 消息传递通知的 Flutter 应用。 这是基本代码,除了将令牌保存在我的数据库中之外,它没有什么特别之处。

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

我是否必须实施某种后台服务以在每次刷新时将新令牌保存在我的数据库中?我记得在 android(JAVA) 上使用 onTokenRefresh() 来执行此操作,但我在 Flutter (DART) 中一无所获。

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

【问题讨论】:

【参考方案1】:

您可以使用firebaseMessaging.onTokenRefresh 获取每次收到新令牌时接收事件的流。

【讨论】:

谢谢。我会看看这个。【参考方案2】:

用户登录我的应用后,她每 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”所迷惑。我使用了一个按钮来测试该技术,并且在我将它绑定到登录按钮后还没有重新命名该方法。)

【讨论】:

【参考方案3】:

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

    当用户卸载/重新安装应用或清除应用数据 您使用 FirebaseMessaging().deleteInstanceID() 手动删除 FCM 实例

您可以使用以下方式收听令牌刷新流:

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

希望对你有帮助

【讨论】:

我在 initstate 中写这个 onTokenRefresh 并且每次调用它不仅是在获取新令牌时调用它并返回旧令牌。我需要这个 onTokenRefresh 只调用生成的新令牌。 是的,作为一种解决方法,您必须将旧令牌存储在 sharedPreferences 中。每次收到 onTokenRefresh 调用时,都可以将其与 SharedPreferences 上的调用进行比较,并仅在它们不同时存储它。希望对你有帮助 谢谢大哥,我也是这么想的。 @MSARKrish 很高兴我能帮上忙。【参考方案4】:

以下是订阅firebaseMessaging.onTokenRefresh 流并在令牌更改时更新令牌的示例:

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

【讨论】:

以上是关于如何在 Flutter 上刷新 firebase 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

每次刷新应用程序时都会触发 Flutter web Firebase onAuthStateChanges

如何确保用户使用 Firebase 和 Flutter 登录

在 Flutter Web 中长时间使用 Firebase 后退出

Firebase 电子邮件验证 Flutter

如何在flutter上使用firebase正确实现注销

如何在我的 firebase 和 flutter 应用上创建实时用户数?