Функция Flutter FCM getToken() возвращает значение null

#firebase #flutter #firebase-cloud-messaging

#firebase #flutter #firebase-облако-обмен сообщениями

Вопрос:

FCM getToken() всегда возвращает null на реальных устройствах, но отлично работает на эмуляторе, я не знаю, что вызывает это. Вот как я использую getToken() :

 FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
String fcmToken = "";
await _firebaseMessaging.getToken().then((value) async {
  fcmToken = value;
  if (fcmToken != "") {
    await _userCollection.doc(user.id).set({
      'email': user.email,
      'name': user.name,
      'noHp': user.noHp,
      'alamat': user.alamat,
      "email_verification": user.emailVerification,
      "phone_verification": user.phoneVerification,
      "device_token": fcmToken,
    });
  }
  return;
});
  

Реальное устройство, которое я использую, — это Android Marshmallow.

Комментарии:

1. Куда вы возвращаете токен ? приведенный выше фрагмент только получает и устанавливает данные, возврата не происходит, кроме последнего return , который является пустым

2. Я использую его для немедленной установки device_token, и он отлично работает на эмуляторе.

3. Должен ли я использовать его так: String fcmToken = await _firebaseMessaging.getToken().then((value) async { return value; }); ?

4. Вроде того, но поскольку вы устанавливаете его немедленно, это не сильно изменится, тем не менее попробуйте, как вы упомянули, добавив .catch(err) , чтобы вы могли определить, происходит ли какая-либо ошибка

5. Хорошо, хорошая идея, я попробую это

Ответ №1:

Ниже приведен метод для токена et :

 final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

_firebaseMessaging.getToken().then((String token) {
   assert(token != null);
   saveToken(token);
});
  

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

 void saveToken(String token) async {
    var prefs = await SharedPreferences.getInstance();
    await prefs.setString(Constants.DeviceToken, token);
}
  

Не стесняйтесь комментировать, если возникнут какие-либо проблемы. Я использую в своем текущем приложении.

Для iOS вам нужно запросить разрешение.

     _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(
            sound: true, badge: true, alert: true, provisional: true));
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {
      print("Settings registered: $settings");
    });
  

Ответ №2:

Для пользователей с обновленными версиями появился новый способ доступа к токену:

 String token = await FirebaseMessaging.instance.getToken();
  

Вы сможете получить доступ к токену только после инициализации Firebase и запроса разрешений.

Комментарии:

1. Я пытаюсь использовать это, но ошибка гласит следующее, FirebaseError: Firebase: firebase.messaging() takes either no argument or a Firebase App instance. (app/invalid-app-argument).