我正在尝试通过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");
}
);
}
我的意思是如何识别令牌是新的还是旧的(已更新)?
答案 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();
}