У меня есть приложение, я хочу отправлять уведомления только авторизованным пользователям, авторизация происходит по токену, если токен пустой, то пользователь не авторизован, для авторизации и хранения токена я использую пакет shared_pref. Как отключить уведомления, если пользователь не авторизовался? Проверка токена выполняется только в уведомлениях MyAppState, которые мне нужно отключить в том же месте.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
await Permission.notification.request();
if (Constants.USER_TOKEN.isEmpty) {
FirebaseMessaging.instance.setAutoInitEnabled(false);
}
RemoteMessage? initialMessage =
await FirebaseMessaging.instance.getInitialMessage();
if (initialMessage != null) {
if (navKey.currentState != null) {
if (Constants.USER_TOKEN.isNotEmpty) {
navKey.currentState!.push(MaterialPageRoute(
builder: (context) => NotificationScreen()));
}
print('Message');
}
}
await _messaging.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification? notification = message.notification;
AndroidNotification? android = message.notification!.android;
if (notification != null && android != null) {
flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
channelDescription: channel.description,
icon: '@mipmap/ic_launcher',
),
),
);
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage? message) {
print("On message opened app: ${message?.data}}");
if (navKey.currentState != null) {
if (Constants.USER_TOKEN.isNotEmpty) {
navKey.currentState!.push(MaterialPageRoute(
builder: (context) => const NotificationScreen()));
}
}
});
var initializationSettingsAndroid =
const AndroidInitializationSettings('@drawable/ic_notification');
var initializationSettingsIOS = const DarwinInitializationSettings();
var initializationSettings = InitializationSettings(
android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
await _messaging.requestPermission();
String? token = await _messaging.getToken();
if (token != null) {
print("FIREBASE TOKEN $token");
} else {
print("CANNOT TAKE FIREBASE TOKEN");
}
if (Platform.isIOS) {
var APNS = await _messaging.getAPNSToken();
print('APNS: $APNS');
}
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
getToken() async {
SharedPreferences pref = await SharedPreferences.getInstance();
setState(() {
Constants.USER_TOKEN = pref.getString('login') ?? "";
});
}
@override
void didChangeDependencies() async {
super.didChangeDependencies();
await getToken();
}
Я имею в виду мои константы.USER_TOKEN, а не firebase
Если вы не используете токены firebase, тогда просто используйте темы. Так вы будете знать, какие клиенты получают ваши уведомления.
Используйте deleteToken , который аннулирует текущий токен, и снова getToken, чтобы получить новый при включении.
getToken() async {
SharedPreferences pref = await SharedPreferences.getInstance();
setState(() {
Constants.USER_TOKEN = pref.getString('login') ?? "";
});
if (Constants.USER_TOKEN.isEmpty()){
// delete firebase token
}else{
// get firebase token
}
}
Под токеном вы подразумеваете токен firebase? Есть еще один способ сделать это: когда пользователь входит в ваше приложение, просто подписывайтесь на тему firebase, а когда они выходят из системы, вы можете отписаться от этой темы. Отправка уведомлений через темы — правильный способ. За разные действия, предпринятые пользователями, вы можете подписаться на разные темы. Допустим, если пользователь посещает вашу страницу в магазине, но никогда не совершает покупки, вы можете подписаться на определенную тему и отправить уведомление людям, подписавшимся только на эту тему.