Как отключить push-уведомления по условию во Flutter?

У меня есть приложение, я хочу отправлять уведомления только авторизованным пользователям, авторизация происходит по токену, если токен пустой, то пользователь не авторизован, для авторизации и хранения токена я использую пакет 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();
  }

Под токеном вы подразумеваете токен firebase? Есть еще один способ сделать это: когда пользователь входит в ваше приложение, просто подписывайтесь на тему firebase, а когда они выходят из системы, вы можете отписаться от этой темы. Отправка уведомлений через темы — правильный способ. За разные действия, предпринятые пользователями, вы можете подписаться на разные темы. Допустим, если пользователь посещает вашу страницу в магазине, но никогда не совершает покупки, вы можете подписаться на определенную тему и отправить уведомление людям, подписавшимся только на эту тему.

Md. Kamrul Amin 14.02.2023 07:26

Я имею в виду мои константы.USER_TOKEN, а не firebase

st4tic 14.02.2023 07:33

Если вы не используете токены firebase, тогда просто используйте темы. Так вы будете знать, какие клиенты получают ваши уведомления.

Md. Kamrul Amin 14.02.2023 07:44
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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

}
     }

Другие вопросы по теме