Мне не удается сохранить токен пользователя для пользователей, которые входят в мое приложение.

Я реализовал приведенный ниже код, который помог создать раздел пользователя и раздел токена в моей базе данных в Firestore.

 @override
  void initState() {
   super.initState();
    _saveDeviceToken();
 }

_saveDeviceToken() async {

String uid = await widget.auth.currentUser();

String fcmToken = await _firebaseMessaging.getToken();

if (fcmToken != null) {
  var tokens = _db
      .collection('users')
      .document(uid)
      .collection('tokens')
      .document(fcmToken);

  await tokens.setData({
    'token': fcmToken,
  });
}}

Как я могу получить токен от каждого пользователя, который входит в систему из кода, который я реализовал?

0
Lynette Museni 29 Окт 2019 в 13:50
Я не уверен, что понимаю вопрос. Что происходит, когда вы запускаете код, которым поделились? И чем это отличается от того, что вы хотите, чтобы произошло?
 – 
Frank van Puffelen
29 Окт 2019 в 15:31
Мне удалось получить токен со своего устройства, однако я не вижу токен для других устройств/пользователей при входе в систему. Я хочу видеть токен для всех устройств, которые входят в систему.
 – 
Lynette Museni
29 Окт 2019 в 16:38
Это все еще не очень ясно. Вы говорите, что этот код записывает токен для вашего собственного устройства в базу данных, но когда вы запускаете тот же код на устройствах ваших пользователей, он не записывает их токены в базу данных?
 – 
Frank van Puffelen
29 Окт 2019 в 16:40
Да!!! Именно это и происходит.
 – 
Lynette Museni
29 Окт 2019 в 18:18
В этом случае мы мало что можем сказать, основываясь на коде. Вы захотите получить доступ к выходным данным logcat одного из неисправных устройств и проверить наличие ошибок. Я бы также добавил подробное ведение журнала, чтобы вы могли видеть, где именно эти устройства выходят из строя.
 – 
Frank van Puffelen
29 Окт 2019 в 19:05

1 ответ

Вот код, который я использую, чтобы сделать то, что, я думаю, вы также хотите сделать:

Во-первых, получение токена Firebase Cloud Messaging:

void getFcmToken() async {
  String token = await FirebaseMessaging().getToken();
  print("Token $token");

  if (token != null) {
    await Firestore.instance
      .collection('users')
      .document(userId)
      .collection("tokens")
      .document(token)
      .setData({
        'pushToken': token,
      });
  }}

Вот код для идентификатора пользователя Firebase auth:

FirebaseAuth.instance.currentUser().then(onCurrentUserLoaded);

FutureOr onCurrentUserLoaded(FirebaseUser value) async {
print("user loaded: ${value}");

if (value == null) {
  // no userid found
} else {
  // POSSIBLY THIS IS YOUR ISSUE: 
_myUserId = value.uid;
}

}

0
Jonas357 29 Окт 2019 в 15:51
В первом коде для Firebase Cloud Messaging, где в моем коде я подключаю getFcmToken()
 – 
Lynette Museni
29 Окт 2019 в 17:40
Я вызываю его в initState() на моей главной странице. Если у вас возникли проблемы, вы также можете добавить это в свой код, чтобы проверить, есть ли у вас разрешения: pubspec.yamlnotification_permissions: ^0.4.0 var permissionStatus = await NotificationPermissions.getNotificationPermissionStatus(); print("push permissionStatus: $permissionStatus");
 – 
Jonas357
29 Окт 2019 в 19:14
И, пожалуйста, проверьте последние строки моего большого примера кода, где найденный uid в моем коде отличается от вашего. Это вполне может быть проблемой
 – 
Jonas357
29 Окт 2019 в 19:17
Я получаю неопределенное имя «userId» из кода FCM
 – 
Lynette Museni
29 Окт 2019 в 20:14
Для работы FCM требуется много вещей. Это может быть что-то с настройками вашего магазина приложений, если код, который я предоставил, не работает. Убедитесь, что ваша настройка FCM точно соответствует спецификациям. И удалите из своего кода все, что не является FCM, и снова опубликуйте свой код.
 – 
Jonas357
31 Окт 2019 в 17:46