火基扑动通知

时间:2020-03-14 08:53:31

标签: firebase flutter push-notification firebase-cloud-messaging

我正在尝试通过Firebase消息传递服务将推送通知从我的php应用程序发送到flutter应用程序。当我启动模拟器时,它会从Firebase接收令牌,然后我复制该令牌并可以发送消息。但是我想在收到令牌后将该令牌存储到我的mysql数据库中。我有两种情况。如果用户第一次安装应用程序,我将令牌插入到数据库中,以便我可以使用该令牌发送消息。现在我很困惑如何在每次用户登录时更新该令牌(而不是一次又一次地向数据库中插入新令牌)。

  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 :(得分:0)

您需要使用path_provider插件在应用程序中创建本地存储的json文件,该文件将在用户每次打开应用程序时进行初始化,并将包含一个包含用户令牌的用户模型。在应用程序的第一页上为initState检查用户是否不为空。 如果为NULL: 获取fcm令牌并将其存储在数据库中。将其存储在数据库中之后,将该令牌写入本地存储文件中。 其他: 什么都不做

下一次当同一用户再次以initstate打开应用程序时,它将检查用户是否为null。这一次将不会在数据库中添加新令牌,因为将令牌插入数据库的代码将不会执行。

示例: 我们将按以下方式存储用户。

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