Firebase Cloud Messaging 使用入门


本快速入门介绍了如何在移动和 Web 客户端应用中设置 Firebase Cloud Messaging,以便您能够可靠地发送消息。对于服务器环境,请参阅您的服务器环境和 FCM

在 Apple 平台上设置 Firebase Cloud Messaging 客户端应用

对于 Apple 客户端应用,您可通过 Firebase Cloud Messaging APNs 接口接收不超过 4096 字节的通知和数据载荷。

如需采用 Objective-C 或 Swift 编写客户端代码,我们建议您使用 FIRMessaging API快速入门示例提供了这两种语言的示例代码。

在开始之前,请将 Firebase 添加到您的 Apple 项目

Firebase Cloud Messaging 中的方法调配

FCM SDK 在两个关键环节执行方法调配:将 APNs 令牌映射到 FCM 注册令牌,以及在处理下行消息回调函数期间捕获分析数据。如果开发者不希望使用调配,可以在应用的 Info.plist 文件中添加 FirebaseAppDelegateProxyEnabled 标志并将其设置为 NO(布尔值)来停用调配。指南的相关部分提供了启用和不启用方法调配的代码示例。

上传您的 APNs 身份验证密钥

将您的 APNs 身份验证密钥上传到 Firebase。 如果您还没有 APNs 身份验证密钥,请务必在 Apple Developer Member Center 内创建一个。

  1. Firebase 控制台中,在您的项目内依次选择齿轮图标 > 项目设置 > Cloud Messaging 标签页。

  2. iOS 应用配置下的 APNs 身份验证密钥中,点击上传按钮,上传您的开发身份验证密钥、生产身份验证密钥,或两者。二者至少需要选择其一。

  3. 转到您保存密钥的位置,选择该密钥,然后点击打开。添加该密钥的 ID(可在 Apple Developer Member Center 中找到),然后点击上传

注册接收远程通知

可在启动时或在应用流程中期望的时间点注册您的应用,以便接收远程通知。调用 registerForRemoteNotifications,如下所示:

Swift

UNUserNotificationCenter.current().delegate = self

let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
  options: authOptions,
  completionHandler: { _, _ in }
)

application.registerForRemoteNotifications()

Objective-C

[UNUserNotificationCenter currentNotificationCenter].delegate = self;
UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
    UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
    requestAuthorizationWithOptions:authOptions
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
      // ...
    }];

[application registerForRemoteNotifications];

获取注册令牌

默认情况下,启动应用时,FCM SDK 会为客户端应用实例生成注册令牌。与 APNs 设备令牌类似,此令牌也允许您将针对性通知发送到应用的任何特定实例。

与 Apple 平台通常在应用启动时传送 APNs 设备令牌一样,FCM 也会通过 FIRMessagingDelegatemessaging:didReceiveRegistrationToken: 方法提供一个注册令牌。FCM SDK 会在应用初次启动期间以及令牌更新或失效时检索新令牌或现有令牌。 无论哪种情况,FCM SDK 都会使用一个有效的令牌来调用 messaging:didReceiveRegistrationToken:

注册令牌可能会在发生下列情况时更改:

  • 应用在新设备上恢复
  • 用户卸载/重新安装应用
  • 用户清除应用数据

设置消息委托

如需接收注册令牌,请实现消息委托协议,并在调用 [FIRApp configure] 后设置 FIRMessagingdelegate 属性。例如,如果您的应用委托符合消息委托协议,可以将 application:didFinishLaunchingWithOptions: 上的委托设为其本身。

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

获取当前的注册令牌

注册令牌是通过 messaging:didReceiveRegistrationToken: 方法传送的。系统通常会在应用每次启动时用注册令牌调用此方法一次。调用此方法时,最适合执行以下操作:

  • 如果注册令牌是新的,将其发送到您的应用服务器。
  • 为注册令牌订阅主题。只需针对新订阅或者在用户重新安装了应用时执行此操作。

您可以直接使用 token(completion:) 检索令牌。如果令牌检索失败,系统会给出非 NULL 错误。

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];

您随时可以使用此方法来访问令牌,而无需存储令牌。

监控令牌刷新

如需在每次令牌更新时获得通知,请提供符合消息委托协议的委托。以下示例注册了此类委托,并添加了合适的委托方法:

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")

  let dataDict: [String: String] = ["token": fcmToken ?? ""]
  NotificationCenter.default.post(
    name: Notification.Name("FCMToken"),
    object: nil,
    userInfo: dataDict
  )
  // TODO: If necessary send token to application server.
  // Note: This callback is fired at each app startup and whenever a new token is generated.
}

Objective-C

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    NSLog(@"FCM registration token: %@", fcmToken);
    // Notify about received token.
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
    [[NSNotificationCenter defaultCenter] postNotificationName:
     @"FCMToken" object:nil userInfo:dataDict];
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

或者,您也可以监听名为 kFIRMessagingRegistrationTokenRefreshNotificationNSNotification,而不提供委托方法。该令牌属性始终具有当前令牌值。

调配停用:映射您的 APNs 令牌和注册令牌

如果您已停用方法调配,或要构建 SwiftUI 应用,则需要将您的 APNs 令牌明确映射到 FCM 注册令牌。实现 application(_:didRegisterForRemoteNotificationsWithDeviceToken:) 方法以检索 APNs 令牌,然后设置 MessagingapnsToken 属性:

Swift

func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken
}

Objective-C

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [FIRMessaging messaging].APNSToken = deviceToken;
}

生成 FCM 注册令牌后,您可以使用与调配启用时相同的方法来访问令牌和监听刷新事件。

防止自动初始化

在生成 FCM 注册令牌后,库会将标识符和配置数据上传到 Firebase。如果您想先让用户进行明确选择,可以通过在配置时停用 FCM 来防止生成令牌。为此,请向您的 Info.plist(而不是 GoogleService-Info.plist)添加元数据值:

FirebaseMessagingAutoInitEnabled = NO

如需重新启用 FCM,您可以执行运行时调用:

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

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

发送通知消息

  1. 在目标设备上安装并运行该应用。在 Apple 设备上,接受权限请求,才能收到远程通知。
  2. 检查应用是否在设备的后台中运行。
  3. 在 Firebase 控制台中,打开消息传递页面。
  4. 如果这是您的第一条消息,请选择制作首个宣传活动
    1. 选择 Firebase 通知消息,然后选择创建
  5. 否则,请在宣传活动标签页上选择新建宣传活动,然后选择通知
  6. 输入消息内容。
  7. 从右侧窗格中选择发送测试消息
  8. 在标签为添加 FCM 注册令牌的字段中,输入您的注册令牌。
  9. 选择测试

在您选择测试后,目标客户端设备(在后台中运行应用)应该会接收到通知。

如需详细了解发送到您应用的消息,请参阅 FCM 报告信息中心。该信息中心会记录在 Apple 和 Android 设备上发送和打开的消息数量。

后续步骤

设置 Apple 客户端后,您就可以开始接收和发送消息给用户了: