Flutter Messaging Push

本文最后更新于:2025年5月23日 上午

使用插件:firebase_messaging
项目设置文档:Firebase Messaging
使用文档:Firebase Cloud Messaging

这个插件的作用是实现 Flutter 应用的推送功能,Firebase Cloud Messaging (FCM) 是 Google 提供的一种跨平台消息传递解决方案,可以让开发者向 Android、iOS 和 Web 应用发送通知和数据消息。
我本来想偷懒,直接使用国内的jpush的,突然想起jpush的离线推送问题(ios有自己的apns推送,google有自己的message推送,由于国内墙的问题,google服务不能用,所以国内app的离线推送都有点问题,这个就不细说了)jpush是通过厂商通道vip账户解决的这个问题,在国外这一套自然也就行不通(跟客服确认过不行),最后还是要老老实实看message的文档。

1. 注册firebase账号,创建应用

FireBase控制台

创建一个项目

在项目下新建android和ios应用

2. 项目设置

2.1 firebase平台的设置

adnroid:

因为之前我使用firebase设置了项目的常规部分,android的包名,sha1都已经配置好了,所以不需要额外配置,这里有个注意事项,如果你在使用flutterEmbedding v1需要设置background service , V2是不需要的,如何判断你的项目是什么版本呢,查看android/src/main/AndroidManifest.xml

1
<meta-data android:name="flutterEmbedding" android:value="2" />

ios:
ios需要在云消息传递中设置apns推送证书或者apns秘钥,秘钥方式是推荐的用法,因为apns证书每年都需要更换,秘钥是永不过期的(真好)。在开发者页面左侧的keys新建一个,包含你要用的功能(我加了Apple Push Notifications service (APNs)和Sign In with Apple),下载p8文件,保存好,它只能下载一次。在firebase后台上传p8秘钥文件后还有两个id,一个是Key ID在keys界面可以看到,还有个团队id在开发者账号页可以看到。

此外还需要在xcode的Signing&Capabilities中加上Push Notifications

2.2 flutter项目的设置

设置文档:Firebase Cloud Messaging Setup

第一步是安装firebase的cli,登录这步遇到了问题,装完cli之后,firebase login就是不行:

我在google上搜了好半天,据说是firebase登录使用全局代理也不行,Issue155
根据issue的评论找到一个stackoverflow的解决方法,就是要设置一个本地的代理:

export http_proxy=http://127.0.0.1:1234像这样的(根据你自己的梯子来),不用担心,export只在目前的命令行窗口生效,是临时的;

设置完代理http_proxy还是执行firebase login命令,依旧不行,我就全部设置一遍;

1
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890

然后就好了,可能是all_proxy生效了,有firewall,干个啥是真不容易啊

第二步是全局安装flutterfire_cli这玩意顾名思义就是flutter项目的专属cli,装完之后配置一个全局变量:export PATH=”$PATH”:”$HOME/.pub-cache/bin”

然后用命令在flutter项目根目录执行 flutterfire configure 配置flutter项目,

它还会自动下载google-services.json文件,位置在android/app/google-services.json;

还会自动生成一个默认配置文件lib/firebase_options.dart

还会在android/build.gradle中加依赖classpath 'com.google.gms:google-services:4.3.10'

ios也会自动加文件:ios/firebase_app_id_file.json

注意

在第一步安装firebase cli的文档中,login之后文档说需要执行初始化:firebase init 命令,它是原生项目才需要的,我们的flutter项目是不需要的,firebase cli只负责登录,获取项目信息,flutter项目是要靠第二步的cli生成配置的。
在很多例子和文档在flutter项目的main.dart中执行了,其实不需要。

3. 使用

初始化配置

1
2
3
4
5
6
7
8
9
10
11
12
/// 初始化
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
/// 权限请求
NotificationSettings settings = await FirebaseMessaging.instance.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);

android 默认的推送图标不正确,需要加一行

1
2
3
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/push_logo" />

Flutter Messaging Push
http://bestkele.com/2023/11/24/flutter/flutter-messaging-push/
作者
kele
发布于
2023年11月24日
许可协议