我正试图通过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");
}
);
}
我的意思是如何识别令牌是新的还是旧的(已更新(?
您需要使用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();
}