【问题标题】:firebase flutter push notificaitonfirebase 颤振推送通知
【发布时间】:2020-06-26 02:23:52
【问题描述】:

我正在尝试通过 Firebase 消息服务将推送通知从我的 php 应用程序发送到我的颤振应用程序。当我启动模拟器时,它从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");
        }
    );
  }

我的意思是如何识别令牌是新的还是旧的(更新)?

【问题讨论】:

  • 您可以简单地比较您的令牌。如果新令牌和旧令牌不同,那么您将更新您的令牌,否则令牌将不会更改

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


【解决方案1】:

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

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

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

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

}

App的主要功能:

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

【讨论】:

  • 你能提供更多我在 FCM 中苦苦挣扎的代码吗?我是否需要在 main.dart 文件或项目中的任何位置定义 onresume、onmessge 和其他。当应用程序正在运行或在后台时,我的通知在应用程序中不可见。 stackoverflow.com/questions/65166526/…
猜你喜欢
  • 2022-01-23
  • 2021-11-04
  • 2021-12-28
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2021-01-25
  • 2018-03-16
相关资源
最近更新 更多