对于 Apple 客户端应用程序,您可以通过 Firebase 云消息传递 APNs 接口接收最多 4000 字节的通知和数据负载。
要使用 Objective-C 或 Swift 编写客户端代码,我们建议您使用FIRMessaging API 。快速入门示例提供了两种语言的示例代码。
Firebase 云消息传递中的方法调配
FCM SDK 在两个关键领域执行方法调配:将您的 APNs 令牌映射到 FCM 注册令牌以及在下游消息回调处理期间捕获分析数据。不喜欢使用 swizzling 的开发人员可以通过在应用程序的 Info.plist 文件中添加标志FirebaseAppDelegateProxyEnabled
并将其设置为 NO(布尔值)来禁用它。指南的相关区域提供了代码示例,包括启用和不启用方法调配。
将 Firebase 添加到您的 Apple 项目
如果您还没有,请将 Firebase 添加到您的 Apple 项目中。
上传您的 APNs 身份验证密钥
将您的 APNs 身份验证密钥上传到 Firebase。如果您还没有 APNs 身份验证密钥,请确保在Apple Developer Member Center中创建一个。
在 Firebase 控制台的项目内,选择齿轮图标,选择Project Settings ,然后选择Cloud Messaging选项卡。
在iOS app configuration下的APNs authentication key中,点击Upload按钮。
浏览到您保存密钥的位置,选择它,然后单击打开。添加密钥的密钥 ID(可在Apple Developer Member Center中获得)并单击Upload 。
注册远程通知
在启动时或应用程序流程中的所需时间点,注册您的应用程序以获取远程通知。如图所示调用registerForRemoteNotifications
:迅速
UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: { _, _ in } ) application.registerForRemoteNotifications()
目标-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 通过FIRMessagingDelegate
的messaging:didReceiveRegistrationToken:
方法提供注册令牌。 FCM SDK 在初始应用程序启动期间以及令牌更新或失效时检索新令牌或现有令牌。在所有情况下,FCM SDK 都会使用有效令牌调用messaging:didReceiveRegistrationToken:
在以下情况下,注册令牌可能会更改:
- 该应用程序已在新设备上恢复
- 用户卸载/重新安装应用程序
- 用户清除应用程序数据。
设置消息代理
要接收注册令牌,请实施消息传递委托协议并在调用[FIRApp configure]
后设置FIRMessaging
的delegate
属性。例如,如果您的应用程序委托符合消息传递委托协议,您可以将application:didFinishLaunchingWithOptions:
上的委托设置为其自身。
迅速
Messaging.messaging().delegate = self
目标-C
[FIRMessaging messaging].delegate = self;
获取当前注册令牌
注册令牌通过messaging:didReceiveRegistrationToken:
方法传递。通常每个应用程序以注册令牌开始调用此方法一次。调用此方法时,是执行以下操作的理想时机:
- 如果注册令牌是新的,请将其发送到您的应用程序服务器。
- 将注册令牌订阅到主题。这仅适用于新订阅或用户重新安装应用程序的情况。
您可以使用token(completion:)直接检索令牌。如果令牌检索以任何方式失败,则会提供非空错误。
迅速
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)" } }
目标-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; } }];
您可以随时使用此方法访问令牌而不是存储它。
监控令牌刷新
要在令牌更新时收到通知,请提供符合消息传递委托协议的委托。以下示例注册委托并添加适当的委托方法:
迅速
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. }
目标-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. }
或者,您可以监听名为kFIRMessagingRegistrationTokenRefreshNotification
的NSNotification
而不是提供委托方法。令牌属性始终具有当前令牌值。
Swizzling 已禁用:映射您的 APNs 令牌和注册令牌
如果您禁用了方法调配,或者您正在构建 SwiftUI 应用程序,则需要将您的 APNs 令牌显式映射到 FCM 注册令牌。实现application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
方法来检索 APNs 令牌,然后设置Messaging
的apnsToken
属性:
迅速
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken }
目标-C
// With "FirebaseAppDelegateProxyEnabled": NO - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [FIRMessaging messaging].APNSToken = deviceToken; }
生成 FCM 注册令牌后,您可以访问它并使用与启用 swizzling 相同的方法侦听刷新事件。
防止自动初始化
生成 FCM 注册令牌后,库会将标识符和配置数据上传到 Firebase。如果您想首先从用户那里获得明确的选择加入,您可以通过禁用 FCM 来防止在配置时生成令牌。为此,请将元数据值添加到您的Info.plist
(而不是您的GoogleService-Info.plist
):
FirebaseMessagingAutoInitEnabled = NO
要重新启用 FCM,您可以进行运行时调用:
迅速
Messaging.messaging().autoInitEnabled = true
目标-C
[FIRMessaging messaging].autoInitEnabled = YES;
一旦设置,此值将在应用重新启动时持续存在。
下一步
设置完 Apple 客户端后,您就可以为应用程序添加消息处理和其他更高级的行为了。有关详细信息,请参阅这些指南: