我无法使用RabbitMQ进行后台服务

问题描述

在应用程序中,我使用Rabbitmq,background_fetch和Flutter_local_notifications。 当启动或最小化应用程序时,一切正常,但是关闭时,我无法在后台运行我的应用程序,找不到任何信息,仅针对FCM的所有其他问题,没有关于amqp抖动的更多信息,我是该框架中的新蜜蜂

main.dart

Future<void> backgroundFetchHeadlesstask(String taskId) async {

  await Rabbitmq.getDelivery();

  BackgroundFetch.finish(taskId);
}

final FlutterlocalnotificationsPlugin FlutterlocalnotificationsPlugin = FlutterlocalnotificationsPlugin();

// Streams are created so that app can respond to notification-related events since the plugin is initialised in the `main` function
final BehaviorSubject<Receivednotification> didReceivelocalnotificationSubject = BehaviorSubject<Receivednotification>();

final BehaviorSubject<String> selectNotificationSubject = BehaviorSubject<String>();

NotificationApplaunchdetails notificationApplaunchdetails;

void main() async {

  runApp(MyApp());

  await initPlatformState();
  
}

Future<void> initPlatformState() async {
  
    BackgroundFetch.configure(BackgroundFetchConfig(
        startOnBoot: true,minimumFetchInterval: 15,stopOnTerminate: false,enableHeadless: true,requiresBatteryNotLow: false,requiresCharging: false,requiresstorageNotLow: false,requiresdeviceidle: false,requiredNetworkType: NetworkType.ANY
    ),(String taskId) async {
        await backgroundFetchHeadlesstask(taskId);
      } 
    );
  }

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  @override
  void initState() {
    super.initState();
    _requestIOSPermissions();
    _configureDidReceivelocalnotificationSubject();
    _configureSelectNotificationSubject();

    BackgroundFetch.registerHeadlesstask(backgroundFetchHeadlesstask);
    
  }

  void _requestIOSPermissions() {
    FlutterlocalnotificationsPlugin
        .resolvePlatformSpecificImplementation<
            IOSFlutterlocalnotificationsPlugin>()
        ?.requestPermissions(
          alert: true,badge: true,sound: true,);
  }

  void _configureDidReceivelocalnotificationSubject() {
    didReceivelocalnotificationSubject.stream
        .listen((Receivednotification receivednotification) async {
      await showDialog(
        context: context,builder: (BuildContext context) => CupertinoAlertDialog(
          title: receivednotification.title != null
              ? Text(receivednotification.title)
              : null,content: receivednotification.body != null
              ? Text(receivednotification.body)
              : null,actions: [
            CupertinoDialogAction(
              isDefaultAction: true,child: Text('Ok'),onpressed: () async {
                Navigator.of(context,rootNavigator: true).pop();
                await Navigator.push(
                  context,MaterialPageRoute(
                    builder: (context) =>
                        LandingPage(selectedPage: 3),//SecondScreen(receivednotification.payload),),);
              },)
          ],);
    });
  }

  void _configureSelectNotificationSubject() {
    selectNotificationSubject.stream.listen((String payload) async {
      await Navigator.push(
        context,MaterialPageRoute(builder: (context) => LandingPage(selectedPage: 3)),//SecondScreen(payload)),);
    });
  }

  @override
  void dispose() {
    didReceivelocalnotificationSubject.close();
    selectNotificationSubject.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
   return MaterialApp(
     debugShowCheckedModeBanner: false,title: 'My first app',theme: ThemeData(
        primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,home: LandingPage(),);
  }
}

在rabbitmq.dart内

class Rabbitmq {

  static Future getDelivery() async
  {
    var auth = await DBProvider.db.getAuth();

      print(hash);

      Client client = new Client(
        settings: ConnectionSettings(
          host: 'myhost',authProvider: AmqPlainAuthenticator('user','password')
        )
      );

      client
      .channel()
      .then((Channel channel) => channel.queue("queue",durable: true))
      .then((Queue queue) => queue.consume())
      .then((Consumer consumer) => consumer.listen((AmqpMessage message) async {

          Map messageBody = message.payloadAsJson;

          if(messageBody.containsKey('message') == true && messageBody.containsKey('from') == true)
          {
            await Rabbitmq()._showNotification(messageBody['message'],messageBody['from']);
          }

        })
      );
  }

  Future<void> _showNotification(String text,String from) async {

    var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsIOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(initializationSettingsAndroid,initializationSettingsIOS);

    FlutterlocalnotificationsPlugin().initialize(initializationSettings);
    
    final FlutterlocalnotificationsPlugin FlutterlocalnotificationsPlugin = FlutterlocalnotificationsPlugin();

    var androidplatformChannelSpecifics = AndroidNotificationDetails(
        'com.example.g2r_market/chat','Уведомления чата','Настройка уведомлений для чатов',importance: Importance.Max,priority: Priority.High,ticker: 'ticker'
    );

    var iOSPlatformChannelSpecifics = IOSNotificationDetails();

    var platformChannelSpecifics = NotificationDetails(androidplatformChannelSpecifics,iOSPlatformChannelSpecifics);

    await FlutterlocalnotificationsPlugin.show(   
        0,from,text,platformChannelSpecifics,payload: 'item x');
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)