Firebase Cloud Messaging

Firebase Cloud Messaging(FCM)是一种跨平台的消息传递解决方案,可让您可靠地免费发送消息。

使用FCM,您可以通知客户端应用程序可以同步新电子邮件或其他数据。您可以发送通知消息来推动用户的重新参与和保留。对于即时消息之类的用例,一条消息可以将最多4 KB的有效负载传输到客户端应用程序。

以下内容基于flutter 1.22.4版本

准备工作

在开始之前,该文档假定您能够创建(或具有现有的)Flutter项目,并且还具有使用中的Firebase项目。如果您不满足这些先决条件,请参考准备工作

安装

1.添加依赖项

dependencies:flutter:sdk: flutterfirebase_core: "^0.5.3"firebase_messaging: "^8.0.0-dev.11"

2.下载依赖项

$ flutter pub get

3. ios集成

参考:https://firebase.flutter.dev/docs/messaging/apple-integration/

4. android集成

如果您正在使用Flutter Android Embedding V2(Flutter版本> = 1.12),则Android不需要其他集成步骤。—— 比如我。

低版本请参考:Flutte接入firebase messaging

使用

在使用Firebase Cloud Messaging之前,您必须首先确保已初始化FlutterFire。

await Firebase.initializeApp();

根据设备状态,传入消息的处理方式有所不同。要了解这些情况以及如何将FCM集成到您自己的应用程序中,首先重要的是确定设备可以处于的各种状态:

状态 描述
Foreground 当应用程序打开时,且在前台显示时。
Background 打开应用程序时,但是在后台(最小化)。当用户按下设备上的“主页”按钮,通过应用程序切换器切换到另一个应用程序或在其他选项卡(Web)上打开应用程序时,通常会发生这种情况。
Terminated 设备锁定或应用程序未运行时。用户可以通过设备上的应用程序切换器用户界面“将其刷掉”或关闭标签页(web)来终止应用程序。
  • 不论哪种情况,该应用程序必须至少打开一次(以允许在FCM中注册,必须要能连接到谷歌)。

  • 在Android上,如果强行终止程序,那么是收不到推送的。

  • 在iOS上,如果用户从应用切换器上滑动了该应用程序,则必须再次手动将其重新打开,以使后台消息重新开始工作。

申请许可(ios,Mac和Web)

在iOS,macOS和Web上,必须先征询用户许可,然后才能在设备上接收FCM有效负载。

不需要在Android应用程序上请求权限。

代码:

FirebaseMessaging messaging = FirebaseMessaging.instance;NotificationSettings settings = await messaging.requestPermission(alert: true,announcement: false,badge: true,carPlay: false,criticalAlert: false,provisional: false,sound: true,
);print('用户授予权限结果: ${settings.authorizationStatus}');

authorizationStatus属性可以返回一个值,该值可用于确定用户的总体决策:

  • authorized: 用户已授予权限。
  • denied: 用户拒绝了权限。
  • notDetermined: 用户尚未选择是否授予许可。
  • provisional:用户授予了临时权限(请参阅[临时权限](https://firebase.flutter.dev/docs/messaging/usage/permissions#provisional-permission))。

在Android上,authorizationStatus始终是authorized。

NotificationSettings上的其他属性返回在当前设备上是启用,禁用还是不支持特定权限。

有关更多信息,请查看Permissions文档。

处理消息

消息类型

根据应用程序的当前状态,传入的有效负载需要不同的实现来处理它们:

Foreground Background Terminated
Notification onMessage onBackgroundMessage onBackgroundMessage
Data onMessage onBackgroundMessage (*see below*) onBackgroundMessage (*see below*)
Notification & Data onMessage onBackgroundMessage onBackgroundMessage

前台消息(Foreground)

默认情况下,在应用程序处于前台时到达的通知消息在Android和iOS上均不会显示可见的通知。但是,可以覆盖此行为:在前台收到推送时里用flutter_local_notifications来显示一条通知。

    ///前台消息FirebaseMessaging.onMessage.listen((RemoteMessage message) {print('在前台收到消息!');if (message.notification != null) {RemoteNotification notification = message.notification;///显示通知if (notification != null && notification.android != null) {FlutterLocalNotificationsPlugin().show(notification.hashCode,notification.title,notification.body,NotificationDetails(android: AndroidNotificationDetails(channel.id,channel.name,channel.description,// TODO 向android添加适当的可绘制资源(在drawable下)icon: 'launch_background',),),payload: message.data.toString());}}});

后台消息(Background)

当前,在Android / Apple和基于Web的平台上处理后台消息的过程有所不同。

在后台运行应用程序时处理消息有些不同。可以通过onBackgroundMessage处理程序处理消息。

收到隔离信息后,就会生成隔离信息(仅适用于Android,iOS / macOS不需要单独的隔离信息,APNS真牛逼),即使您的应用程序未运行,也可以处理消息。

关于后台消息处理的方法,需要牢记以下几点:

  • 它不能是匿名函数。
  • 它必须是顶层函数(例如,不是需要初始化的类方法)。
  static Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {print("收到后台消息: ${message.messageId}");}  ...
///后台消息
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

收到后台消息的时候,运行长时间的繁重任务会影响设备性能,并可能导致操作系统终止该过程。如果任务运行时间超过30秒,则设备可能会自动终止该进程。

onMessageOpenedApp:当从后台状态打开应用程序时,该流会发送RemoteMessage。此时可以监听到用户对此种通知的点击行为:

    ///点击后台消息打开AppFirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {print('从后台打开!');});

应用终止时点击通知打开App(Terminated)

onBackgroundMessage是无法监听到此种通知的行为的,但是可以接收到用户对此种通知的点击行为:

getInitialMessage():如果从终止状态打开应用程序,则将返回包含RemoteMessage的Future。一旦使用完毕,RemoteMessage将被删除。

    ///应用从终止状态打开var m = await FirebaseMessaging.instance.getInitialMessage();if (m != null) {print('应用从终止状态打开:${m?.notification?.title}');}

要展示通知必须包含nofitication字段

处理交互

由于通知是可见的提示,因此用户通常会与通知进行交互(点击通知)。 Android和iOS上的默认行为是打开应用程序。如果应用程序终止,它将启动;如果它在后台,它将被带到前台。

firebase-messaging软件包提供了两种方法来处理此交互(上文一提到,再着重介绍下):

  • getInitialMessage():如果从终止状态打开应用程序,则将返回包含RemoteMessage的Future。一旦使用完毕,RemoteMessage将被删除。
  • onMessageOpenedApp:当从后台状态打开应用程序时,该流会发送RemoteMessage。

建议同时处理两种情况。

    ///点击后台消息打开AppFirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {print('从后台打开!');});///应用从终止状态打开var m = await FirebaseMessaging.instance.getInitialMessage();if (m != null) {print('应用从终止状态打开:${m?.notification?.title}');}

以下是官方示例:

class Application extends StatefulWidget {@overrideState<StatefulWidget> createState() => _Application();
}class _Application extends State<Application> {@overridevoid initState() async {super.initState();// Get any messages which caused the application to open from// a terminated state.RemoteMessage initialMessage =await FirebaseMessaging.instance.getInitialMessage();// If the message also contains a data property with a "type" of "chat",// navigate to a chat screenif (initialMessage?.data['type'] == 'chat') {Navigator.pushNamed(context, '/chat',arguments: ChatArguments(initialMessage));}// Also handle any interaction when the app is in the background via a// Stream listenerFirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {if (message.data['type'] == 'chat') {Navigator.pushNamed(context, '/chat',arguments: ChatArguments(message));}});}@overrideWidget build(BuildContext context) {return Text("...");}
}

处理交互的方式取决于您的应用程序设置,但是上面的示例显示了一个使用StatefulWidget的基本示例。

至于前台通知的点击,请查看flutter_local_notifications来设置.

主题

用户可以订阅一个主题,我们发推送的时候对某一主题发出推送,订阅了这个主题的用户就会收到。

起到一个发送给多个用户推送的作用。

主要是我没找到通过http取到发推送的时候如何对所有用户发送。

订阅主题:

要订阅设备,请使用主题名称调用subscribeToTopic方法:

await FirebaseMessaging.instance.subscribeToTopic('weather');

取消订阅主题

要取消订阅主题,请使用主题名称调用unsubscribeFromTopic方法:

await FirebaseMessaging.instance.unsubscribeFromTopic('weather');

此处的意思是主题名称为weather.

通过Http发推送

如果您无法使用Firebase Admin SDK,则Firebase还支持通过HTTP, POST请求将消息发送到设备:

Authorization:服务器密钥

POST https://fcm.googleapis.com/fcm/send     HTTP/1.1//请求头
Content-Type: application/json
Authorization: key={服务器密钥}//body
{"to": "{fcmtoken}","notification": {"icon": "juno_icon","title": "自己的土","body": "自己的地												

Flutter FCM - Flutter集成Firebase Cloud Messaging(FCM)相关推荐

  1. 创建Firebase项目并接入Firebase推送: Firebase Cloud Messaging (FCM)

    1.FCM简介: Firebase Cloud Messaging (FCM) 是一种跨平台消息传递解决方案,可供您可靠地传递消息,而且还是免费的服务.支持 Android,IOS,Web,Flutt ...

  2. firebase 推送_使用Firebase Cloud Messaging发送推送通知

    firebase 推送 Ever wondered how does your smartphone receive and handle notifications whether be in fo ...

  3. GCM 的升级版——FCM(firebase cloud messaging)

    推送服务对于现在的应用并不陌生,前有挡在墙外的GCM,和在墙内的Jpush,功能上大家大同小异,近几年大大小小的推送sdk层出不穷(比如:XG Push,华为推送,阿里云推送)到底哪个才能成为未来的官 ...

  4. 【Android】 Firebase登录、FCM、Google Play支付、adbrix、ONEStore、Galaxy Store、Google Install Referrer

    Android SDK接入 最近接了一个韩国的渠道,之前没有接过这些原生的sdk,头大啊.本来也不是搞android开发的,只能强搞了.还是国内的好啊,都给你整合完了. 如有问题,麻烦大佬指教一二,非 ...

  5. Windows Azure NotificationHub+Firebase Cloud Message 实现消息推动(付源码)

    前期项目一直用的是Windows azure NotificationHub+Google Cloud Message 实现消息推送, 但是GCM google已经不再推荐使用,慢慢就不再维护了, 现 ...

  6. google FireBase产品接入 —— FCM

    作为google 官方的推送,相比也是很多app离不开的功能,而且会经常用到的,这里总结一下如何集成FCM 以及后面探索一下相关原理. 说明:对于任何google service(统计,推送,广告等等 ...

  7. 【Flutter】Flutter 混合开发 ( 简介 | Flutter 混合开发集成步骤 | 创建 Flutter Module )

    文章目录 一.Flutter 混合开发简介 二.Flutter 混合开发集成步骤 三.创建 Flutter Module 1.使用命令行创建 Flutter Module 项目 ( 仅做参考 ) 2. ...

  8. 【老孟Flutter】Flutter 2.0 重磅更新

    老孟导读:昨天期待已久的 Flutter 2.0 终于发布了,Web 端终于提正了,春季期间我发布的一篇文章,其中的一个预测就是 Web 正式发布,已经实现了,还有一个预测是:2021年将是 Flut ...

  9. fcm的java实现_支持FCM的Java APNs库

    是否有任何支持Firebase云消息传递的Java APNs库,我找到了Pushy,但它看起来不支持FCM. 我面临的挑战是能够通过我自己的应用服务器上的Firbase Cloud Messaging ...

最新文章

  1. linux命令行终端的翻屏滚屏,linux命令行终端的翻屏滚屏more/less/head/tail
  2. VC++学习(17):进程间通信
  3. standard_init_linux.go:178: exec user process caused no such file or directory
  4. 服务器不能显示中文,彻底解决delphi WebBroker服务器中文乱码 delphi WebBroker服务器不能显示中文网页 WebBroker中文显示乱码...
  5. boost::container模块实现内存资源记录器的程序
  6. 在猜年龄的基础上编写登录、注册方法,并且把猜年龄游戏分函数处理
  7. 问题(二)--算法相关
  8. linux设备驱动之PCIE驱动开发
  9. torch.cat;Pytorch nn.MaxPool1d
  10. 循环中需要调用异步怎么确保执行完再执行其他的_什么是事件循环和异步编程?5种使用async/await更好地编码方式!...
  11. CleanMyMac X4.11.1中文正式版 系统优化 垃圾清理 程序卸载工具
  12. Datalogic得利捷发布IMPACT 2D机器人引导URCap插件
  13. java逆向工程_逆向工程 - Simon.Jiang - 博客园
  14. 箱线图Boxplot-统计学解读
  15. EMQ X开源版使用
  16. assume用法及意思_assume的用法和例句
  17. 解决Number of partitions scanned (=2001) on table ‘tablexx‘ exceeds limit (=2000)
  18. pandas已知数值怎么找位置_pandas.dataframe中根据条件获取元素所在的位置方法(索引)...
  19. 谷歌FLAN-T5作者亲讲:5400亿参数,1800个任务,如何实现大语言模型“自我改进”...
  20. 微信H5移动端真机调试--vConsole

热门文章

  1. Android UI美化基本
  2. 请使用netty框架实现高效稳定的websocket通信
  3. tile cannot extend outside image
  4. ActiveMQ——如何监控ActiveMQ
  5. 计算机镜像怎么恢复,利用系统映像还原Windows7系统的方法
  6. 电信isag接口java_使用ag-grid进行国际化
  7. 《一篇文章全吃透》—YYModel的使用技巧
  8. 浮点运算/半精度,单精度,双精度/浮点和定点
  9. 阿里巴巴-数据平台事业部-数据产品部:寻找真爱
  10. TableField的应用