设置 Firebase Cloud Messaging 客户端应用 (Flutter)

请按照以下步骤在 Flutter 上设置 FCM 客户端。

针对具体平台的设置和要求

其中一些必要步骤取决于您的目标平台。

iOS+

在 Xcode 中启用应用功能

您必须先在 Xcode 项目中启用推送通知和后台模式,您的应用才能开始接收消息。

  1. 打开 Xcode 项目工作区 (ios/Runner.xcworkspace)。
  2. 启用推送通知
  3. 启用后台提取远程通知后台执行模式

上传您的 APNs 身份验证密钥

在使用 FCM 之前,请将您的 APNs 证书上传到 Firebase。如果您还没有 APNs 证书,请在 Apple Developer Member Center 内创建一份。

  1. 在 Firebase 控制台中,在您的项目内依次选择齿轮图标、项目设置以及 Cloud Messaging 标签页。
  2. 选择开发证书和/或生产证书对应的上传证书按钮。二者至少需要选择其一。
  3. 为每份证书选择 .p12 文件,并提供密码(如有)。确保此证书的软件包 ID 与您应用的软件包 ID 匹配。选择保存

方法调配 (Method swizzling)

如需在 Apple 设备上使用 FCM Flutter 插件,则不得停用方法调配。系统需要调配,如果停用调配,则关键的 Firebase 功能(例如 FCM 令牌处理)将无法正常运行。

Android

Google Play 服务

FCM 客户端需要在搭载 Android 4.4 或更高版本且安装了 Google Play 服务的设备上运行,或者在搭载 Android 4.4 版本且支持 Google API 的模拟器中运行。请注意,除了使用 Google Play 商店,您还可以通过其他方式部署您的 Android 应用。

依靠 Play 服务 SDK 运行的应用在访问 Google Play 服务功能之前,应始终检查设备是否拥有兼容的 Google Play 服务 APK。我们建议您在以下两个位置进行检查:主 activity 的 onCreate() 方法和 onResume() 方法。onCreate() 中的检查可确保该应用在检查成功之前无法使用。onResume() 中的检查可确保当用户通过一些其他方式(例如返回按钮)返回正在运行的应用时,仍会执行检查。

如果设备没有兼容的 Google Play 服务版本,您的应用可以调用 GoogleApiAvailability.makeGooglePlayServicesAvailable(),以便用户从 Play 商店下载 Google Play 服务。

Web

为 FCM 配置 Web 凭据

FCM 网页界面使用名为“自主应用服务器标识”(即“VAPID”密钥)的 Web 凭据来授权向支持的 Web 推送服务发送请求。要为应用订阅推送通知,您需要将一对密钥与您的 Firebase 项目相关联。您可以生成新的密钥对,也可以通过 Firebase 控制台导入现有的密钥对。

生成新的密钥对
  1. 打开 Firebase 控制台设置窗格中的 Cloud Messaging 标签页,然后滚动至 Web 配置部分。

  2. Web 推送证书标签页中,点击生成密钥对。控制台会显示一则通知,说明已生成密钥对,并且会显示公钥字符串和添加日期。

导入现有的密钥对

如果您有已在 Web 应用中使用的现有密钥对,可以将其导入 FCM 中,以便通过 FCM API 访问现有的 Web 应用实例。如需导入密钥,您必须拥有对 Firebase 项目的所有者级访问权限。以 base64 URL 安全编码形式导入现有的公钥和私钥:

  1. 打开 Firebase 控制台设置窗格中的 Cloud Messaging 标签页,然后滚动至 Web 配置部分。

  2. Web 推送证书标签页中,找到并选择链接文本“import an existing key pair”(导入现有密钥对)。

  3. 导入一个密钥对对话框的相应字段中提供公钥和私钥,然后点击导入。控制台会显示公钥字符串和添加日期。

如需详细了解密钥格式以及如何生成密钥,请参阅应用服务器密钥

安装 FCM 插件

  1. 安装并初始化适用于 Flutter 的 Firebase 插件(如果您尚未这样做)。

  2. 从 Flutter 项目的根目录运行以下命令,以安装该插件:

    flutter pub add firebase_messaging
    
  3. 完成后,重新构建您的 Flutter 应用:

    flutter run
    

获取注册令牌

如需将消息发送到特定的设备,您需要知道该设备的注册令牌。您需要在 Notifications 控制台的相应字段中输入该令牌才能完成本教程,因此请确保在获得令牌后即复制该令牌或将其妥善存储。

如需检索应用实例的当前注册令牌,请调用 getToken()。如果未授予通知权限,此方法将向用户请求通知权限。在其他情况下,它会返回一个令牌,或由于出现错误而拒绝该 Future。

final fcmToken = await FirebaseMessaging.instance.getToken();

在 Web 平台上,将您的 VAPID 公钥传递给 getToken()

final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

如需在每次令牌更新时获得通知,请订阅 onTokenRefresh 流:

FirebaseMessaging.instance.onTokenRefresh
    .listen((fcmToken) {
      // TODO: If necessary send token to application server.

      // Note: This callback is fired at each app startup and whenever a new
      // token is generated.
    })
    .onError((err) {
      // Error getting token.
    });

防止自动初始化

在生成 FCM 注册令牌后,库会将标识符和配置数据上传到 Firebase。如果您希望阻止自动生成令牌,请在构建时停用自动初始化功能。

iOS

在 iOS 上,向您的 Info.plist 添加元数据值:

FirebaseMessagingAutoInitEnabled = NO

Android

在 Android 上,通过将以下元数据值添加到 AndroidManifest.xml 来停用 Analytics 数据收集和 FCM 自动初始化功能(您必须同时停用这两项功能):

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

在运行时重新启用 FCM 自动初始化功能

如需为特定应用实例启用自动初始化功能,请调用 setAutoInitEnabled()

await FirebaseMessaging.instance.setAutoInitEnabled(true);

此值一经设置便会持久保存,不受应用重启的影响。

后续步骤

客户端应用设置完成后,您就可以使用 Notifications Composer 开始发送下行消息。请参阅向后台应用发送测试消息

如需向您的应用添加其他更高级的行为,您需要服务器实现

然后,在您的应用客户端中: