огненная база флаттер пу sh оповещение - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь отправить уведомление pu sh из моего приложения php в мои приложения-флаттеры через службу сообщений Firebase. пока я запускаю эмулятор, он получает токен от firebase, затем копирую этот токен и могу отправить сообщение. Но я хочу сохранить этот токен в моей mysql базе данных, как только получу токен. У меня 2 сценария. Впервые, если пользователь установит приложения, я вставлю токен в свою базу данных, чтобы я мог отправить сообщение с использованием этого токена. Теперь я запутался, как обновлять этот токен каждый раз, когда пользователь входит в систему (не вставляя новый токен снова и снова в базу данных).

  void setupNotification() async{
    _firebaseMessaging.
    _firebaseMessaging.getToken().then((token){
      //insert the token to user database
      saveToken(token); 
    });

    Stream<String> fcmStream = _firebaseMessaging.onTokenRefresh;
    fcmStream.listen((token) {
      //always update the user database with new token
      saveToken(token); 
    });
    _firebaseMessaging.configure(
        onMessage: (Map<String, dynamic> message) async{
          print("message while app is open: $message");
        },
        onResume: (Map<String, dynamic> message) async{
          print("message: $message");
        },
        onLaunch: (Map<String, dynamic> message) async{
          print("message: $message");
        }
    );
  }

Я имею в виду как определить, является ли токен новым или старым (обновлен)?

1 Ответ

0 голосов
/ 15 марта 2020

Вам необходимо создать локально json файл в вашем приложении, используя плагин path_provider. Этот файл инициализируется каждый раз, когда пользователь открывает приложение, и будет содержать пользовательскую модель, содержащую токен пользователя. На самой первой странице приложения в initState проверьте, не является ли пользователь нулевым. IF NULL: получить токен fcm и сохранить его в базе данных. После сохранения в базе данных записать токен в локально сохраненный файл. В противном случае: ничего не делать

В следующий раз, когда тот же пользователь снова откроет приложение в initstate, он проверит, не является ли пользователь нулевым. На этот раз он не добавит новый токен в базу данных, поскольку наш код для вставки токена в базу данных выиграл. 't execute.

Пример. Мы будем хранить пользователя следующим образом.

class User {
  String token;
  String platform;

  User({
    this.token = '',
    this.platform = '',
  });

  Map<String, dynamic> toJson()  {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['token'] = this.token;
    data['platform'] = this.platform;
    return data;
  }

  User.fromJson(Map<String, dynamic> json): this(
    platform: json["platform"],
    token: json["token"],
  );
}

Локальный файл данных:

class LocalData {
  static User _user;

  static User get user => _user;

  /// Flag for Authentication.
  static bool get isTokenAdded=> _user != null;




  static loadData() async {
    final file = File((await getApplicationDocumentsDirectory()).path + '/data.json');

    try {
      final data = jsonDecode(await file.readAsString());

      _user = User.fromJson(data['user']);
    } catch (e) {
      print(e);
    }
  }

  static writeData() async {
    final file = File((await getApplicationDocumentsDirectory()).path + '/data.json');

    await file.writeAsString(jsonEncode({
      'user': _user?.toJson(),
    }));
  }



  static void addToken(User user) {

    LocalData._user = user;
    writeData();
  }

  static void removeToken() {
    LocalData._user = null;
    writeData();
  }

}

Основная функция приложения:

void main() async {
  /// Load Local Data.
  WidgetsFlutterBinding.ensureInitialized();
  await LocalData.loadData();

  runApp(YourApp());
}

Теперь на первой странице initState ваших приложений вы можете проверить, добавлен ли токен в базу данных с помощью

if(LocalData.isTokenAdded()){
     //do nothing
}else{
//get token and insert it into database then write it in file: 
LocalData.user.token = token;
LocalData.writeData();
}
...