如何在前台接收推送通知时显示颤振本地通知?

Posted

技术标签:

【中文标题】如何在前台接收推送通知时显示颤振本地通知?【英文标题】:How to show flutter local notification while receiving push notification on foreground? 【发布时间】:2020-06-28 12:25:59 【问题描述】:

目前,我正在使用警报对话框来显示通知,同时在应用程序处于前台时接收推送通知。但我想展示一些非侵入性的东西,比如颤动的本地通知。如何在我的应用程序中实现它?这是我当前的实现:

FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
  @override
  void initState() 
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async 
        showDialog(
          context: context,
          builder: (context) => AlertDialog(
            content: ListTile(
              title: Text(message['notification']['title']),
              subtitle: Text(message['notification']['body']),
            ),
            actions: <Widget>[
              FlatButton(
                child: Text('Ok'),
                onPressed: () => Navigator.of(context).pop(),
              ),
            ],
          ),
        );
        print("onMessage: $message");
      ,
      onLaunch: (Map<String, dynamic> message) async 
        print("onLaunch: $message");
        Navigator.pushNamed(context, '/notify');
      ,
      onResume: (Map<String, dynamic> message) async 
        print("onResume: $message");
      ,
    );

【问题讨论】:

【参考方案1】:

由于我没有得到答案,所以我自己尝试并弄清楚了。

不要忘记将flutter_local_notifications 库添加到您的项目中以使用此代码 https://pub.dev/packages/flutter_local_notifications

经过测试并适用于 Android

FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  @override
  void initState() 
var initializationSettingsandroid =
        new AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsios = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(
        initializationSettingsAndroid, initializationSettingsIOS);
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async 
        showNotification(
            message['notification']['title'], message['notification']['body']);
        print("onMessage: $message");
      ,
      onLaunch: (Map<String, dynamic> message) async 
        print("onLaunch: $message");
        Navigator.pushNamed(context, '/notify');
      ,
      onResume: (Map<String, dynamic> message) async 
        print("onResume: $message");
      ,
    );

Future onSelectNotification(String payload) async 
    showDialog(
      context: context,
      builder: (_) 
        return new AlertDialog(
          title: Text("PayLoad"),
          content: Text("Payload : $payload"),
        );
      ,
    );
  
void showNotification(String title, String body) async 
    await _demoNotification(title, body);
  

  Future<void> _demoNotification(String title, String body) async 
    var androidPlatformChannelSpecifics = AndroidNotificationDetails(
        'channel_ID', 'channel name', 'channel description',
        importance: Importance.Max,
        playSound: true,
        sound: 'sound',
        showProgress: true,
        priority: Priority.High,
        ticker: 'test ticker');

    var iOSChannelSpecifics = IOSNotificationDetails();
    var platformChannelSpecifics = NotificationDetails(
        androidPlatformChannelSpecifics, iOSChannelSpecifics);
    await flutterLocalNotificationsPlugin
        .show(0, title, body, platformChannelSpecifics, payload: 'test');
  

它就像一个魅力。希望能帮助别人:)

【讨论】:

非常感谢:)。我会在 iOS 上尝试一下,如果它也能用,我会告诉你 @rebar 这在IOS上对你有用吗?我正在尝试做类似的事情,但仍然遇到一些麻烦。 感谢您的回答!不要忘记将 flutter_local_notifications 库添加到您的项目中以使用此代码。 @AliHaider 我认为现在您必须在 android/app/src/main/res/raw/sound.mp3 内的 raw 文件夹中添加声音。现在是sound:RawResourceAndroidNotificationSound('sound') @Rocx 不,你不需要到处配置它。但最好在第一个屏幕上配置它。如果有登录页面,可以在用户登录成功后进行配置。重点是只做一次。并使用 get_it 库使函数单例,以确保只有一个通知处理程序实例正在运行。【参考方案2】:

我使用静态方法 init() 创建了这个类,并从我的应用程序首页的 initState 调用它一次

const AndroidNotificationChannel channel = AndroidNotificationChannel(
  'my_channel', // id
  'My Channel', // title
  'Important notifications from my server.', // description
  importance: Importance.high,
);

class Notifications 
  static Future init() async 
    await Firebase.initializeApp();
    FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
    
    final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
        FlutterLocalNotificationsPlugin();

    await flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<
            AndroidFlutterLocalNotificationsPlugin>()
        ?.createNotificationChannel(channel);

    await FirebaseMessaging.instance
        .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,
                channel.description,
                icon: 'some_icon_in_drawable_folder',
              ),
            ));
      
    );
  

【讨论】:

以上是关于如何在前台接收推送通知时显示颤振本地通知?的主要内容,如果未能解决你的问题,请参考以下文章

从 parse.com 控制台接收推送时显示警报对话框而不是通知

在 iOS 上使用 Airplay 时显示推送通知?

应用在前台运行时收到 iOS 推送通知

应用程序运行时在 iOS 中抑制/隐藏推送通知

当我的应用在 fg 上时,我的应用如何发送推送通知?

在我的颤振(android)应用程序中 - Firebase 推送通知在一段时间后停止接收每个用户