Skip to content
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
12a6ad8
Introduce new Info.plist key `FirebaseMessagingInstallationIdEnabled`.
leojaygoogle Apr 17, 2026
c3c3d67
Implement the FCM FID registration operation in the Messaging token m…
leojaygoogle Apr 26, 2026
b442d42
Add retry logic on network error and backend 5xx error.
leojaygoogle Apr 26, 2026
fe49a75
Implement the FCM FID unregistration operation.
leojaygoogle Apr 27, 2026
f1294be
Add didReceiveRegistration delegate method.
leojaygoogle Apr 28, 2026
8c0ba25
Update the sample app to handle the new registration ID.
leojaygoogle Apr 28, 2026
b471f82
Update CHANGELOG
leojaygoogle Apr 29, 2026
4b72a42
Style update.
leojaygoogle Apr 29, 2026
c28628b
Use the internal FirebaseInstallations header file.
leojaygoogle Apr 29, 2026
e7aeac8
Rename `registrationId` to `installationId` in messaging delegate met…
leojaygoogle Apr 29, 2026
836b697
Update copyright header to include LLC
leojaygoogle Apr 29, 2026
dff8587
Fix various compile warnings.
leojaygoogle Apr 29, 2026
503c5b6
Add an FIRMessagingErrorCode to indicate installation related errors.
leojaygoogle May 1, 2026
c12d985
Move heartbeatLogger from FIRMessagingTokenOperation to FIRMessagingT…
leojaygoogle May 1, 2026
1d4c3f8
Fix style warnings and address review comments.
leojaygoogle May 4, 2026
e984467
Mark `authorizedEntity` as `nullable`.
leojaygoogle May 4, 2026
125dac3
Add FIRMessagingInstallationIdUnregisteredNotification and make sure …
leojaygoogle May 5, 2026
d95a204
Monitor FID change events and register the new FID when it happens.
leojaygoogle May 6, 2026
f7cea1d
Delete unused methods.
leojaygoogle May 6, 2026
fc874aa
Add test `testRegisterNotifiesDelegateWhenInstallationIdEnabled`.
leojaygoogle May 13, 2026
26c94d2
Add `testUnregisterNotifiesDelegateWhenInstallationIdEnabled`
leojaygoogle May 13, 2026
6093f94
Move installationIDObserver setup to the `start` method, instead of `…
leojaygoogle May 13, 2026
e7433b8
Fix test ordering failure in FIRMessagingTokenInfoTest.
leojaygoogle May 13, 2026
77ad7f5
Add test `testAppStartNotifiesDelegateWhenBothAutoInitAndInstallation…
leojaygoogle May 13, 2026
fd64ad9
Add `bundle_id` to FID registration payload.
leojaygoogle Jun 3, 2026
1c52ccb
Fix unit test failures.
leojaygoogle Jun 3, 2026
befa3a4
Implement FID topic subscription and unsubscription
leojaygoogle Jun 5, 2026
c28c64d
Introduce shared NSURLSession for FID operations and improve test cle…
leojaygoogle Jun 23, 2026
36fa768
Mark token and options parameters as nullable in FIRMessagingPubSub m…
leojaygoogle Jun 23, 2026
312dcac
Skip installation ID observer setup when installation ID is disabled
leojaygoogle Jun 23, 2026
95f16b4
Stop `urlSessionMock` and `bundleMock` in `tearDown` to prevent resou…
leojaygoogle Jun 24, 2026
ef6663f
Increase test expectation timeouts to reduce flakiness
leojaygoogle Jun 24, 2026
3f2164b
Clear pending topic operations after each test.
leojaygoogle Jun 24, 2026
0715193
Introduce retrieveTokenOrFidForSenderID and disable FCM token operati…
leojaygoogle Jun 25, 2026
f931f38
Add a test for FID registration and topic subscription order.
leojaygoogle Jun 25, 2026
e5b0f5e
Fix style issues.
leojaygoogle Jun 25, 2026
7d091ff
When `register` is called, delegate should receive notification when…
leojaygoogle Jun 25, 2026
95ac9aa
Don't handle FID rotation events if the app hasn't registered with FC…
leojaygoogle Jun 25, 2026
e74e1a9
Inject fake keychain to prevent Keychain issues in unit tests.
leojaygoogle Jun 25, 2026
fd07733
Move keychain injection after messaging.start.
leojaygoogle Jun 26, 2026
2189024
Fix various style issues found by Gemini.
leojaygoogle Jun 26, 2026
b5955ad
Update wording.
leojaygoogle Jun 29, 2026
368868e
Remove an unused `initWithAuthorizedEntity`
leojaygoogle Jun 29, 2026
8b041e0
Add `installationIDObserver` cleanup.
leojaygoogle Jun 29, 2026
a80d75c
Move network retry logic off the main thread.
leojaygoogle Jun 29, 2026
b7d9007
Remove redundant `nonnull` and update CHANGELOG.
leojaygoogle Jun 30, 2026
0d0c684
Replace register with registerWithCompletion: to support error handli…
leojaygoogle Jun 30, 2026
9cc6576
Replace unregister with unregisterWithCompletion
leojaygoogle Jun 30, 2026
bd3cdba
Copy in the comments from the API proposal.
leojaygoogle Jun 30, 2026
adcdb46
Update sample app.
leojaygoogle Jun 30, 2026
f9c3a58
Apply suggestions from code review
leojaygoogle Jun 30, 2026
f8ba052
Update FirebaseMessaging/Sources/Public/FirebaseMessaging/FIRMessaging.h
leojaygoogle Jun 30, 2026
32ef76c
Add docs for parameters.
leojaygoogle Jun 30, 2026
910f4fb
Merge branch 'fid' of github.com:firebase/firebase-ios-sdk into fid
leojaygoogle Jun 30, 2026
fce9744
Don't mock the global mainBundle, mock mockMessaging to reduce flakin…
leojaygoogle Jun 30, 2026
38958b9
Update FirebaseMessaging/Sources/Public/FirebaseMessaging/FIRMessaging.h
leojaygoogle Jun 30, 2026
55f494d
Fix style issues.
leojaygoogle Jun 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions FirebaseMessaging/Apps/Shared/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,21 @@
return true
}

func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print("APNs Device Token: \(tokenString)")
if Messaging.messaging().isInstallationIdEnabled {
Messaging.messaging().register()
}
}

// Implement this to display notification when app is in foreground.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions)
-> Void) {
completionHandler([.alert, .sound])

Check warning on line 56 in FirebaseMessaging/Apps/Shared/AppDelegate.swift

View workflow job for this annotation

GitHub Actions / sample-build-test (MessagingSample, iOS) / build

'alert' was deprecated in iOS 14.0
}

func userNotificationCenter(_ center: UNUserNotificationCenter,
Expand Down
37 changes: 24 additions & 13 deletions FirebaseMessaging/Apps/Shared/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -148,24 +148,34 @@ struct ContentView: View {
}

func getFCMToken() {
Messaging.messaging().token { token, error in
guard let token = token, error == nil else {
self.log = "Failed getting iid and token: \(String(describing: error))"
return
if Messaging.messaging().isInstallationIdEnabled {
Messaging.messaging().register()
log = "Called register()"
} else {
Messaging.messaging().token { token, error in
guard let token = token, error == nil else {
self.log = "Failed getting iid and token: \(String(describing: error))"
return
}
self.identity.token = token
self.log = "Successfully got token."
print("Token: ", self.identity.token ?? "")
}
self.identity.token = token
self.log = "Successfully got token."
print("Token: ", self.identity.token ?? "")
}
}

func deleteFCMToken() {
Messaging.messaging().deleteToken { error in
if let error = error as NSError? {
self.log = "Failed deleting token: \(error)"
return
if Messaging.messaging().isInstallationIdEnabled {
Messaging.messaging().unregister()
log = "Called unregister()"
} else {
Messaging.messaging().deleteToken { error in
if let error = error as NSError? {
self.log = "Failed deleting token: \(error)"
return
}
self.log = "Successfully deleted token."
}
self.log = "Successfully deleted token."
}
}

Expand Down Expand Up @@ -210,6 +220,7 @@ struct ActivityViewController: UIViewControllerRepresentable {
}

struct SettingsView: View {
@EnvironmentObject var identity: Identity
@EnvironmentObject var settings: UserSettings
@State var shouldUseDelegate = true
@State private var isSharePresented: Bool = false
Expand All @@ -235,7 +246,7 @@ struct SettingsView: View {
.sheet(isPresented: $isSharePresented, onDismiss: {
print("Dismiss")
}, content: {
let items = [Messaging.messaging().fcmToken]
let items = [identity.token ?? "None"]
ActivityViewController(activityItems: items as [Any])
})
}
Expand Down
13 changes: 13 additions & 0 deletions FirebaseMessaging/Apps/Shared/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,17 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, MessagingDelegate {
print("Did refresh token:\n", identity.token ?? "")
print("\n=============================\n")
}

func messaging(_ messaging: Messaging, didReceiveRegistration installationId: String?) {
identity.token = installationId
print("=============================")
print("Did refresh FCM installation ID: \(String(describing: installationId))")
print("=============================")
}

func messaging(_ messaging: Messaging, didUnregister installationId: String) {
print("=============================")
print("Did unregister FCM installation ID: \(installationId)")
print("=============================")
}
}
3 changes: 3 additions & 0 deletions FirebaseMessaging/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Unreleased
Comment thread
ncooke3 marked this conversation as resolved.
Outdated
- [added] Add support for the new FCM registration API.
Comment thread
ncooke3 marked this conversation as resolved.
Outdated

# 12.8.0
- [fixed] Fix missing database crash on launch. (#14880)

Expand Down
193 changes: 176 additions & 17 deletions FirebaseMessaging/Sources/FIRMessaging.m
Comment thread
leojaygoogle marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,18 @@
const NSNotificationName FIRMessagingRegistrationTokenRefreshedNotification =
@"com.firebase.messaging.notif.fcm-token-refreshed";

const NSNotificationName FIRMessagingInstallationIdUnregisteredNotification =
@"com.firebase.messaging.notif.installation-id-unregistered";

NSString *const kFIRMessagingUserDefaultsKeyAutoInitEnabled =
@"com.firebase.messaging.auto-init.enabled"; // Auto Init Enabled key stored in NSUserDefaults

NSString *const kFIRMessagingPlistAutoInitEnabled =
@"FirebaseMessagingAutoInitEnabled"; // Auto Init Enabled key stored in Info.plist

NSString *const kFIRMessagingPlistInstallationIdEnabled =
@"FirebaseMessagingInstallationIdEnabled"; // Installation ID Enabled key stored in Info.plist

NSString *const FIRMessagingErrorDomain = @"com.google.fcm";

BOOL FIRMessagingIsAPNSSyncMessage(NSDictionary *message) {
Expand Down Expand Up @@ -114,6 +120,8 @@ @interface FIRMessaging () <GULReachabilityDelegate>
/// calling it implicitly during swizzling.
@property(nonatomic, readwrite, strong) NSMutableSet *loggedMessageIDs;
@property(nonatomic, readwrite, strong) id<FIRAnalyticsInterop> _Nullable analytics;
@property(nonatomic, readwrite, strong, nullable) id<NSObject> installationIDObserver;
@property(nonatomic, readwrite, copy, nullable) NSString *lastKnownFID;

@end

Expand Down Expand Up @@ -232,7 +240,7 @@ - (void)didCompleteConfigure {
// happens before developers able to set the delegate
// Hence first token set must be happen here after listener is set
// TODO(chliangGoogle) Need to investigate better solution.
[self updateDefaultFCMToken:self.FCMToken];
[self updateDefaultFCMToken:[self.tokenManager tokenAndRequestIfNotExist]];
}];
} else if (self.isAutoInitEnabled && self.APNSToken) {
// When there is no cached token, must check auto init is enabled.
Expand Down Expand Up @@ -493,7 +501,19 @@ - (void)setAutoInitEnabled:(BOOL)autoInitEnabled {
}
}

- (BOOL)isInstallationIdEnabled {
id isInstallationIdEnabledObject =
[[NSBundle mainBundle] objectForInfoDictionaryKey:kFIRMessagingPlistInstallationIdEnabled];
return [isInstallationIdEnabledObject boolValue];
}
Comment thread
leojaygoogle marked this conversation as resolved.

- (NSString *)FCMToken {
if (self.isInstallationIdEnabled) {
FIRMessagingLoggerDebug(
kFIRMessagingMessageCodeInstallationIdEnabled,
@"FirebaseMessagingInstallationIdEnabled is set to YES, token is not available.");
return nil;
}
// Gets the current default token, and requests a new one if it doesn't exist.
NSString *token = [self.tokenManager tokenAndRequestIfNotExist];
return token;
Expand Down Expand Up @@ -617,14 +637,27 @@ - (void)setDelegate:(id<FIRMessagingDelegate>)delegate {
// NOTE: Once |didReceiveRegistrationToken:| can be made a required method, this
// check can be removed.
- (void)validateDelegateConformsToTokenAvailabilityMethods {
if (self.delegate &&
![self.delegate respondsToSelector:@selector(messaging:didReceiveRegistrationToken:)]) {
FIRMessagingLoggerWarn(kFIRMessagingMessageCodeTokenDelegateMethodsNotImplemented,
@"The object %@ does not respond to "
@"-messaging:didReceiveRegistrationToken:. Please implement "
@"-messaging:didReceiveRegistrationToken: to be provided with an FCM "
@"token.",
self.delegate.description);
if (self.delegate) {
if ([self isInstallationIdEnabled]) {
if (![self.delegate respondsToSelector:@selector(messaging:didReceiveRegistration:)]) {
FIRMessagingLoggerWarn(
kFIRMessagingMessageCodeTokenDelegateMethodsNotImplemented,
@"The object %@ does not respond to "
@"-messaging:didReceiveRegistration:. Please implement "
@"-messaging:didReceiveRegistration: to be provided with an installation ID.",
self.delegate.description);
}
} else {
if (![self.delegate respondsToSelector:@selector(messaging:didReceiveRegistrationToken:)]) {
FIRMessagingLoggerWarn(
kFIRMessagingMessageCodeTokenDelegateMethodsNotImplemented,
@"The object %@ does not respond to "
@"-messaging:didReceiveRegistrationToken:. Please implement "
@"-messaging:didReceiveRegistrationToken: to be provided with an FCM "
@"token.",
self.delegate.description);
}
}
}
}

Expand All @@ -636,8 +669,14 @@ - (void)notifyRefreshedFCMToken {
});
return;
}
if ([self.delegate respondsToSelector:@selector(messaging:didReceiveRegistrationToken:)]) {
[self.delegate messaging:self didReceiveRegistrationToken:self.tokenManager.defaultFCMToken];
if ([self isInstallationIdEnabled]) {
if ([self.delegate respondsToSelector:@selector(messaging:didReceiveRegistration:)]) {
[self.delegate messaging:self didReceiveRegistration:self.tokenManager.defaultFCMToken];
}
} else {
if ([self.delegate respondsToSelector:@selector(messaging:didReceiveRegistrationToken:)]) {
[self.delegate messaging:self didReceiveRegistrationToken:self.tokenManager.defaultFCMToken];
}
}

// Should always trigger the token refresh notification when the delegate method is called
Expand All @@ -646,6 +685,120 @@ - (void)notifyRefreshedFCMToken {
object:self.tokenManager.defaultFCMToken];
}

- (void)notifyInstallationIdUnregistered:(nonnull NSString *)installationID {
if (![self isInstallationIdEnabled]) {
return;
}

__weak FIRMessaging *weakSelf = self;
if (![NSThread isMainThread]) {
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf notifyInstallationIdUnregistered:installationID];
});
return;
}

if ([self.delegate respondsToSelector:@selector(messaging:didUnregister:)]) {
[self.delegate messaging:self didUnregister:installationID];
}

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:FIRMessagingInstallationIdUnregisteredNotification
object:installationID];
}

#pragma mark - FID

- (void)handleInstallationIDDidChangeNotification:(NSNotification *)notification {
FIRMessaging_WEAKIFY(self);
[self.installations installationIDWithCompletion:^(NSString *_Nullable identifier,
NSError *_Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
FIRMessaging_STRONGIFY(self);
if (error || !identifier.length) {
return;
}
// Registration will only be triggered if FID is changed
if (![identifier isEqualToString:self.lastKnownFID]) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shall we also check if the app instance is registered or not? I think we should avoid creating a registration if the app disables auto-init and never calls register().

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. also added tests.

FIRMessagingLoggerInfo(kFIRMessagingMessageCodeInstallationIdRotation,
@"FID rotated. Registering with the new FID '%@'", identifier);
self.lastKnownFID = identifier;
[self retrieveFCMTokenForSenderID:self.tokenManager.fcmSenderID
completion:^(NSString *_Nullable FCMToken, NSError *_Nullable error){
}];
Comment thread
leojaygoogle marked this conversation as resolved.
Outdated
Comment thread
leojaygoogle marked this conversation as resolved.
Outdated
}
});
}];
}

- (void)setupInstallationIDObserver {
if (self.installationIDObserver) {
return;
}
// Monitor FID rotation events. When FID rotates, register with the new FID.
FIRMessagingLoggerDebug(kFIRMessagingMessageCodeDebug, @"Listening for FID rotation events");
FIRMessaging_WEAKIFY(self);
self.installationIDObserver = [NSNotificationCenter.defaultCenter
Comment thread
ncooke3 marked this conversation as resolved.
addObserverForName:FIRInstallationIDDidChangeNotification
object:nil
queue:nil
usingBlock:^(NSNotification *notification) {
FIRMessaging_STRONGIFY(self);
[self handleInstallationIDDidChangeNotification:notification];
}];
}

- (void)register {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method should always trigger the didReceiveRegistration callback to deliver the FID no matter whether there's a cached FID or not: https://screenshot.googleplex.com/6aheYbeDbYEJnAF. This is designed to let developers retrieve the FID even when the app instance is already registered.

Consider adding a unit test for this scenario.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. also added a test case.

if (!self.isInstallationIdEnabled) {
FIRMessagingLoggerError(kFIRMessagingMessageCodeInstallationIdDisabled,
@"FirebaseMessagingInstallationIdEnabled is not set to YES, so "
@"FID operations are not supported.");
return;
}
if (!FIRApp.defaultApp.options.GCMSenderID.length) {
FIRMessagingLoggerError(kFIRMessagingMessageCodeSenderIDNotSuppliedForTokenFetch,
@"No Sender ID is available to register");
return;
}
[self setupInstallationIDObserver];
Comment thread
leojaygoogle marked this conversation as resolved.
Outdated
[self.tokenManager tokenAndRequestIfNotExist];
}

- (void)unregister {
if (!self.isInstallationIdEnabled) {
FIRMessagingLoggerError(kFIRMessagingMessageCodeInstallationIdDisabled,
@"FirebaseMessagingInstallationIdEnabled is not set to YES, so "
@"FID operations are not supported.");
return;
}
NSString *senderID = FIRApp.defaultApp.options.GCMSenderID;
if (!senderID.length) {
FIRMessagingLoggerError(kFIRMessagingMessageCodeSenderIDNotSuppliedForTokenDelete,
@"No Sender ID is available to unregister");
return;
}

FIRMessaging_WEAKIFY(self);
[self.installations
installationIDWithCompletion:^(NSString *_Nullable identifier, NSError *_Nullable error) {
FIRMessaging_STRONGIFY(self);
if (error || !identifier.length) {
FIRMessagingLoggerError(kFIRMessagingMessageCodeTokenOperationInstallationIdNotAvailable,
@"Failed to get installation ID.");
} else {
[self.tokenManager
deleteTokenWithAuthorizedEntity:senderID
scope:kFIRMessagingDefaultTokenScope
instanceID:identifier
handler:^(NSError *_Nullable error) {
if (!error) {
[self notifyInstallationIdUnregistered:identifier];
}
}];
}
}];
}

#pragma mark - Topics

+ (NSString *)normalizeTopic:(NSString *)topic {
Expand Down Expand Up @@ -673,7 +826,7 @@ - (void)subscribeToTopic:(NSString *)topic
@"subscribeToTopic.",
topic, [FIRMessagingPubSub removePrefixFromTopic:topic]);
}
__weak FIRMessaging *weakSelf = self;
FIRMessaging_WEAKIFY(self);
[self
retrieveFCMTokenForSenderID:self.tokenManager.fcmSenderID
completion:^(NSString *_Nullable FCMToken, NSError *_Nullable error) {
Expand All @@ -687,10 +840,10 @@ - (void)subscribeToTopic:(NSString *)topic
}
return;
}
FIRMessaging *strongSelf = weakSelf;
NSString *normalizeTopic = [[strongSelf class] normalizeTopic:topic];
FIRMessaging_STRONGIFY(self);
NSString *normalizeTopic = [[self class] normalizeTopic:topic];
if (normalizeTopic.length) {
[strongSelf.pubsub subscribeToTopic:normalizeTopic handler:completion];
[self.pubsub subscribeToTopic:normalizeTopic handler:completion];
return;
}
NSString *failureReason = [NSString
Expand Down Expand Up @@ -814,8 +967,14 @@ - (void)notifyDelegateOfFCMTokenAvailability {
});
return;
}
if ([self.delegate respondsToSelector:@selector(messaging:didReceiveRegistrationToken:)]) {
[self.delegate messaging:self didReceiveRegistrationToken:self.tokenManager.defaultFCMToken];
if ([self isInstallationIdEnabled]) {
if ([self.delegate respondsToSelector:@selector(messaging:didReceiveRegistration:)]) {
[self.delegate messaging:self didReceiveRegistration:self.tokenManager.defaultFCMToken];
}
} else {
if ([self.delegate respondsToSelector:@selector(messaging:didReceiveRegistrationToken:)]) {
[self.delegate messaging:self didReceiveRegistrationToken:self.tokenManager.defaultFCMToken];
}
}
// Should always trigger the token refresh notification when the delegate method is called
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
Expand Down
6 changes: 6 additions & 0 deletions FirebaseMessaging/Sources/FIRMessagingCode.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ typedef NS_ENUM(NSInteger, FIRMessagingMessageCode) {
kFIRMessagingMessageCodeTopicFormatIsDeprecated = 2024,
kFIRMessagingMessageCodeDirectChannelConnectionFailed = 2025,
kFIRMessagingMessageCodeInvalidClient = 2026, // no longer used
kFIRMessagingMessageCodeInstallationIdEnabled = 2027,
kFIRMessagingMessageCodeInstallationIdDisabled = 2028,
kFIRMessagingMessageCodeDebug = 2029,
kFIRMessagingMessageCodeInstallationIdRotation = 2030,

// DO NOT USE 4000, 4004 - 4013
kFIRMessagingMessageCodeClient001 = 4001, // I-FCM004000
Expand Down Expand Up @@ -238,6 +242,8 @@ typedef NS_ENUM(NSInteger, FIRMessagingMessageCode) {
kFIRMessagingMessageCodeUtilitiesCannotGetSystemVersion = 38003,
// FIRMessagingTokenOperation.m
kFIRMessagingMessageCodeTokenOperationFailedToSignParams = 39000,
kFIRMessagingMessageCodeTokenOperationInstallationAuthTokenNotAvailable = 39001,
kFIRMessagingMessageCodeTokenOperationInstallationIdNotAvailable = 39002,
// FIRMessagingTokenFetchOperation.m
// DO NOT USE 40004, 40005
kFIRMessagingMessageCodeTokenFetchOperationFetchRequest = 40000,
Expand Down
Loading
Loading