firebase 为什么每次运行flutter应用程序时都会生成设备令牌?

tzdcorbm  于 2023-02-05  发布在  Flutter
关注(0)|答案(2)|浏览(113)

我正在使用firebase云消息发送通知到设备。问题是设备令牌在应用程序的每次运行中重新生成并添加到firestore中的id不同。我希望它在应用程序的第一次安装中只生成一次。这是我的代码:

Future init() async {

    _firebaseMessaging.getToken().then((token) {
      saveTokens(token);
    });
}

  Future<void> saveTokens(var token) async {
    try {
      await _firestore.collection('deviceTokens').add({
        'token': token,
      });
    } catch (e) {
      print(e);
    }
  }

这就是我在main()中调用它的方式:

await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  await _msgService.init();

  // testFirestore();
  FirebaseMessaging.onBackgroundMessage(_messageHandler);

这是_messageHandler函数:

Future<void> _messageHandler(RemoteMessage message) async {
  print(
      'background message ${message.notification!.body} + ${message.notification!.title}');
}
laik7k3q

laik7k3q1#

实际上,令牌仅在以下情况之一刷新:

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

所以你需要检查你的firebase集合,如果你的token(在getToken()上获得的)在添加之前已经保存了,如果它已经存在于你的数据库中,不要保存它。
例如:

Future<bool> doesTokenAlreadyExist(String token) async {
  final QuerySnapshot result = await Firestore.instance
    .collection('deviceTokens')
    .where('token', isEqualTo: token)
    .limit(1)
    .getDocuments();
  final List<DocumentSnapshot> documents = result.documents;
  return documents.length == 1;
}
34gzjxbg

34gzjxbg2#

注册令牌可能会在以下情况下更改:

  • 应用程序将在新设备上恢复
  • 用户卸载/重新安装应用程序
  • 用户清除应用程序数据。

更多信息:

  • 从游戏商店更新-令牌保持不变。
  • 当关闭应用程序并重新打开它-令牌保持不变。
    • 我建议您在每次启动应用时为用户记录该令牌。这样,您就不会遇到任何问题。**(将功能添加到应用主页的init state

相关问题