@react-native-firebase/messaging 20.3.0 → 20.5.0

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [20.5.0](https://github.com/invertase/react-native-firebase/compare/v20.4.0...v20.5.0) (2024-09-11)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **messaging, android:** handle nullable broadcast intent ([#7893](https://github.com/invertase/react-native-firebase/issues/7893)) ([#7960](https://github.com/invertase/react-native-firebase/issues/7960)) ([c1ac022](https://github.com/invertase/react-native-firebase/commit/c1ac022e4e9d3effb2f0fb3404ad375d9fcbe4b6))
11
+ - **messaging, ios:** fixed isHeadless for react-native-navigation ([#7868](https://github.com/invertase/react-native-firebase/issues/7868)) ([3875cc6](https://github.com/invertase/react-native-firebase/commit/3875cc6077e5fd6b35e201356aca632e43a2e301))
12
+
13
+ ## [20.4.0](https://github.com/invertase/react-native-firebase/compare/v20.3.0...v20.4.0) (2024-08-13)
14
+
15
+ **Note:** Version bump only for package @react-native-firebase/messaging
16
+
6
17
  ## [20.3.0](https://github.com/invertase/react-native-firebase/compare/v20.2.1...v20.3.0) (2024-07-19)
7
18
 
8
19
  **Note:** Version bump only for package @react-native-firebase/messaging
@@ -0,0 +1,153 @@
1
+ import { describe, expect, it } from '@jest/globals';
2
+
3
+ import {
4
+ getMessaging,
5
+ deleteToken,
6
+ getToken,
7
+ onMessage,
8
+ onNotificationOpenedApp,
9
+ onTokenRefresh,
10
+ requestPermission,
11
+ isAutoInitEnabled,
12
+ setAutoInitEnabled,
13
+ getInitialNotification,
14
+ getDidOpenSettingsForNotification,
15
+ getIsHeadless,
16
+ registerDeviceForRemoteMessages,
17
+ isDeviceRegisteredForRemoteMessages,
18
+ unregisterDeviceForRemoteMessages,
19
+ getAPNSToken,
20
+ setAPNSToken,
21
+ hasPermission,
22
+ onDeletedMessages,
23
+ onMessageSent,
24
+ onSendError,
25
+ setBackgroundMessageHandler,
26
+ setOpenSettingsForNotificationsHandler,
27
+ sendMessage,
28
+ subscribeToTopic,
29
+ unsubscribeFromTopic,
30
+ isDeliveryMetricsExportToBigQueryEnabled,
31
+ isSupported,
32
+ experimentalSetDeliveryMetricsExportedToBigQueryEnabled,
33
+ } from '../lib';
34
+
35
+ describe('Firestore', function () {
36
+ describe('modular', function () {
37
+ it('`getMessaging` function is properly exposed to end user', function () {
38
+ expect(getMessaging).toBeDefined();
39
+ });
40
+
41
+ it('`deleteToken` function is properly exposed to end user', function () {
42
+ expect(deleteToken).toBeDefined();
43
+ });
44
+
45
+ it('`getToken` function is properly exposed to end user', function () {
46
+ expect(getToken).toBeDefined();
47
+ });
48
+
49
+ it('`onMessage` function is properly exposed to end user', function () {
50
+ expect(onMessage).toBeDefined();
51
+ });
52
+
53
+ it('`onNotificationOpenedApp` function is properly exposed to end user', function () {
54
+ expect(onNotificationOpenedApp).toBeDefined();
55
+ });
56
+
57
+ it('`onTokenRefresh` function is properly exposed to end user', function () {
58
+ expect(onTokenRefresh).toBeDefined();
59
+ });
60
+
61
+ it('`requestPermission` function is properly exposed to end user', function () {
62
+ expect(requestPermission).toBeDefined();
63
+ });
64
+
65
+ it('`isAutoInitEnabled` function is properly exposed to end user', function () {
66
+ expect(isAutoInitEnabled).toBeDefined();
67
+ });
68
+
69
+ it('`setAutoInitEnabled` function is properly exposed to end user', function () {
70
+ expect(setAutoInitEnabled).toBeDefined();
71
+ });
72
+
73
+ it('`getInitialNotification` function is properly exposed to end user', function () {
74
+ expect(getInitialNotification).toBeDefined();
75
+ });
76
+
77
+ it('`getDidOpenSettingsForNotification` function is properly exposed to end user', function () {
78
+ expect(getDidOpenSettingsForNotification).toBeDefined();
79
+ });
80
+
81
+ it('`getIsHeadless` function is properly exposed to end user', function () {
82
+ expect(getIsHeadless).toBeDefined();
83
+ });
84
+
85
+ it('`registerDeviceForRemoteMessages` function is properly exposed to end user', function () {
86
+ expect(registerDeviceForRemoteMessages).toBeDefined();
87
+ });
88
+
89
+ it('`isDeviceRegisteredForRemoteMessages` function is properly exposed to end user', function () {
90
+ expect(isDeviceRegisteredForRemoteMessages).toBeDefined();
91
+ });
92
+
93
+ it('`unregisterDeviceForRemoteMessages` function is properly exposed to end user', function () {
94
+ expect(unregisterDeviceForRemoteMessages).toBeDefined();
95
+ });
96
+
97
+ it('`getAPNSToken` function is properly exposed to end user', function () {
98
+ expect(getAPNSToken).toBeDefined();
99
+ });
100
+
101
+ it('`setAPNSToken` function is properly exposed to end user', function () {
102
+ expect(setAPNSToken).toBeDefined();
103
+ });
104
+
105
+ it('`hasPermission` function is properly exposed to end user', function () {
106
+ expect(hasPermission).toBeDefined();
107
+ });
108
+
109
+ it('`onDeletedMessages` function is properly exposed to end user', function () {
110
+ expect(onDeletedMessages).toBeDefined();
111
+ });
112
+
113
+ it('`onMessageSent` function is properly exposed to end user', function () {
114
+ expect(onMessageSent).toBeDefined();
115
+ });
116
+
117
+ it('`onSendError` function is properly exposed to end user', function () {
118
+ expect(onSendError).toBeDefined();
119
+ });
120
+
121
+ it('`setBackgroundMessageHandler` function is properly exposed to end user', function () {
122
+ expect(setBackgroundMessageHandler).toBeDefined();
123
+ });
124
+
125
+ it('`setOpenSettingsForNotificationsHandler` function is properly exposed to end user', function () {
126
+ expect(setOpenSettingsForNotificationsHandler).toBeDefined();
127
+ });
128
+
129
+ it('`sendMessage` function is properly exposed to end user', function () {
130
+ expect(sendMessage).toBeDefined();
131
+ });
132
+
133
+ it('`subscribeToTopic` function is properly exposed to end user', function () {
134
+ expect(subscribeToTopic).toBeDefined();
135
+ });
136
+
137
+ it('`unsubscribeFromTopic` function is properly exposed to end user', function () {
138
+ expect(unsubscribeFromTopic).toBeDefined();
139
+ });
140
+
141
+ it('`isDeliveryMetricsExportToBigQueryEnabled` function is properly exposed to end user', function () {
142
+ expect(isDeliveryMetricsExportToBigQueryEnabled).toBeDefined();
143
+ });
144
+
145
+ it('`isSupported` function is properly exposed to end user', function () {
146
+ expect(isSupported).toBeDefined();
147
+ });
148
+
149
+ it('`experimentalSetDeliveryMetricsExportedToBigQueryEnabled` function is properly exposed to end user', function () {
150
+ expect(experimentalSetDeliveryMetricsExportedToBigQueryEnabled).toBeDefined();
151
+ });
152
+ });
153
+ });
@@ -22,6 +22,10 @@ public class ReactNativeFirebaseMessagingReceiver extends BroadcastReceiver {
22
22
  if (ReactNativeFirebaseApp.getApplicationContext() == null) {
23
23
  ReactNativeFirebaseApp.setApplicationContext(context.getApplicationContext());
24
24
  }
25
+ if (intent.getExtras() == null) {
26
+ Log.e(TAG, "broadcast intent received with no extras");
27
+ return;
28
+ }
25
29
  RemoteMessage remoteMessage = new RemoteMessage(intent.getExtras());
26
30
  ReactNativeFirebaseEventEmitter emitter = ReactNativeFirebaseEventEmitter.getSharedInstance();
27
31
 
@@ -96,8 +96,8 @@
96
96
 
97
97
  if (notification.userInfo[UIApplicationLaunchOptionsRemoteNotificationKey]) {
98
98
  if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
99
+ isHeadless = YES;
99
100
  if (rctRootView != nil) {
100
- isHeadless = YES;
101
101
  NSMutableDictionary *appPropertiesDict = rctRootView.appProperties != nil
102
102
  ? [rctRootView.appProperties mutableCopy]
103
103
  : [NSMutableDictionary dictionary];
@@ -120,8 +120,8 @@
120
120
  [[UIApplication sharedApplication] registerForRemoteNotifications];
121
121
  // #endif
122
122
  } else {
123
+ isHeadless = NO;
123
124
  if (rctRootView != nil) {
124
- isHeadless = NO;
125
125
  NSMutableDictionary *appPropertiesDict = rctRootView.appProperties != nil
126
126
  ? [rctRootView.appProperties mutableCopy]
127
127
  : [NSMutableDictionary dictionary];
@@ -133,8 +133,8 @@
133
133
  }
134
134
  }
135
135
  } else {
136
+ isHeadless = NO;
136
137
  if (rctRootView != nil) {
137
- isHeadless = NO;
138
138
  NSMutableDictionary *appPropertiesDict = rctRootView.appProperties != nil
139
139
  ? [rctRootView.appProperties mutableCopy]
140
140
  : [NSMutableDictionary dictionary];
@@ -148,6 +148,7 @@
148
148
  }
149
149
 
150
150
  - (void)application_onDidEnterForeground {
151
+ isHeadless = NO;
151
152
  if ([UIApplication sharedApplication].delegate != nil &&
152
153
  [UIApplication sharedApplication].delegate.window != nil &&
153
154
  [UIApplication sharedApplication].delegate.window.rootViewController != nil &&
@@ -160,7 +161,6 @@
160
161
  if (rctRootView.appProperties != nil &&
161
162
  [rctRootView.appProperties[@"isHeadless"] isEqual:@(YES)]) {
162
163
  NSMutableDictionary *appPropertiesDict = [rctRootView.appProperties mutableCopy];
163
- isHeadless = NO;
164
164
  if ([appPropertiesDict objectForKey:@"isHeadless"] != nil &&
165
165
  [appPropertiesDict[@"isHeadless"] isEqual:@([RCTConvert BOOL:@(YES)])]) {
166
166
  appPropertiesDict[@"isHeadless"] = @([RCTConvert BOOL:@(isHeadless)]);
package/lib/index.d.ts CHANGED
@@ -1156,3 +1156,5 @@ declare module '@react-native-firebase/app' {
1156
1156
  }
1157
1157
  }
1158
1158
  }
1159
+
1160
+ export * from './modular';
package/lib/index.js CHANGED
@@ -34,38 +34,6 @@ import { AppRegistry, Platform } from 'react-native';
34
34
  import remoteMessageOptions from './remoteMessageOptions';
35
35
  import version from './version';
36
36
 
37
- export {
38
- getMessaging,
39
- deleteToken,
40
- getToken,
41
- onMessage,
42
- onNotificationOpenedApp,
43
- onTokenRefresh,
44
- requestPermission,
45
- isAutoInitEnabled,
46
- setAutoInitEnabled,
47
- getInitialNotification,
48
- getDidOpenSettingsForNotification,
49
- getIsHeadless,
50
- registerDeviceForRemoteMessages,
51
- isDeviceRegisteredForRemoteMessages,
52
- unregisterDeviceForRemoteMessages,
53
- getAPNSToken,
54
- setAPNSToken,
55
- hasPermission,
56
- onDeletedMessages,
57
- onMessageSent,
58
- onSendError,
59
- setBackgroundMessageHandler,
60
- setOpenSettingsForNotificationsHandler,
61
- sendMessage,
62
- subscribeToTopic,
63
- unsubscribeFromTopic,
64
- experimentalSetDeliveryMetricsExportedToBigQueryEnabled,
65
- isDeliveryMetricsExportToBigQueryEnabled,
66
- isSupported,
67
- } from '../modular/index';
68
-
69
37
  const statics = {
70
38
  AuthorizationStatus: {
71
39
  NOT_DETERMINED: -1,
@@ -538,6 +506,8 @@ export default createModuleNamespace({
538
506
  ModuleClass: FirebaseMessagingModule,
539
507
  });
540
508
 
509
+ export * from './modular';
510
+
541
511
  // import messaging, { firebase } from '@react-native-firebase/messaging';
542
512
  // messaging().X(...);
543
513
  // firebase.messaging().X(...);
@@ -0,0 +1,297 @@
1
+ import { FirebaseMessagingTypes } from '..';
2
+ import { FirebaseApp } from '@firebase/app-types';
3
+
4
+ import Messaging = FirebaseStorageTypes.Module;
5
+
6
+ /**
7
+ * Returns a Messaging instance for the given app.
8
+ * @param app - The Firebase app instance. Optional.
9
+ * @returns A Messaging instance.
10
+ */
11
+ export function getMessaging(app?: FirebaseApp): Messaging;
12
+
13
+ /**
14
+ * Removes access to an FCM token previously authorized by its scope.
15
+ * Messages sent by the server to this token will fail.
16
+ * @param messaging - Messaging instance.
17
+ * @param tokenOptions - Options to override senderId (iOS) and projectId (Android).
18
+ * @returns A promise that resolves when the token is deleted.
19
+ */
20
+ export function deleteToken(
21
+ messaging: Messaging,
22
+ tokenOptions?: FirebaseMessagingTypes.NativeTokenOptions,
23
+ ): Promise<void>;
24
+
25
+ /**
26
+ * Returns an FCM token for this device. Optionally, you can specify custom options for your own use case.
27
+ * @param messaging - Messaging instance.
28
+ * @param options - Options to override senderId (iOS) and appName.
29
+ * @returns A promise that resolves with the FCM token.
30
+ */
31
+ export function getToken(
32
+ messaging: Messaging,
33
+ options?: FirebaseMessagingTypes.GetTokenOptions & FirebaseMessagingTypes.NativeTokenOptions,
34
+ ): Promise<string>;
35
+
36
+ /**
37
+ * When any FCM payload is received, the listener callback is called with a `RemoteMessage`.
38
+ * This subscriber method is only called when the app is active (in the foreground).
39
+ * @param messaging - Messaging instance.
40
+ * @param listener - Called with a `RemoteMessage` when a new FCM payload is received from the server.
41
+ * @returns A function to unsubscribe from the message listener.
42
+ */
43
+ export function onMessage(
44
+ messaging: Messaging,
45
+ listener: (message: FirebaseMessagingTypes.RemoteMessage) => any,
46
+ ): () => void;
47
+
48
+ /**
49
+ * When the user presses a notification displayed via FCM, this listener will be called if the app
50
+ * has opened from a background state.
51
+ * @param messaging - Messaging instance.
52
+ * @param listener - Called with a `RemoteMessage` when a notification press opens the application.
53
+ * @returns A function to unsubscribe from the notification opened listener.
54
+ */
55
+ export function onNotificationOpenedApp(
56
+ messaging: Messaging,
57
+ listener: (message: FirebaseMessagingTypes.RemoteMessage) => any,
58
+ ): () => void;
59
+
60
+ /**
61
+ * Called when a new registration token is generated for the device. This event can happen when a
62
+ * token expires or when the server invalidates the token.
63
+ * This subscriber method is only called when the app is active (in the foreground).
64
+ * @param messaging - Messaging instance.
65
+ * @param listener - Called with an FCM token when the token is refreshed.
66
+ * @returns A function to unsubscribe from the token refresh listener.
67
+ */
68
+ export function onTokenRefresh(messaging: Messaging, listener: (token: string) => any): () => void;
69
+
70
+ /**
71
+ * On iOS, messaging permission must be requested by the current application before messages can
72
+ * be received or sent.
73
+ * @param messaging - Messaging instance.
74
+ * @param iosPermissions - All the available permissions for iOS that can be requested.
75
+ * @returns A promise that resolves with the authorization status.
76
+ */
77
+ export function requestPermission(
78
+ messaging: Messaging,
79
+ iosPermissions?: FirebaseMessagingTypes.IOSPermissions,
80
+ ): Promise<FirebaseMessagingTypes.AuthorizationStatus>;
81
+
82
+ /**
83
+ * Returns whether messaging auto initialization is enabled or disabled for the device.
84
+ * @param messaging - Messaging instance.
85
+ * @returns A boolean indicating whether auto initialization is enabled.
86
+ */
87
+ export function isAutoInitEnabled(messaging: Messaging): boolean;
88
+
89
+ /**
90
+ * Sets whether messaging auto initialization is enabled or disabled for the device.
91
+ * @param messaging - Messaging instance.
92
+ * @param enabled - A boolean value to enable or disable auto initialization.
93
+ * @returns A promise that resolves when the setting is updated.
94
+ */
95
+ export function setAutoInitEnabled(messaging: Messaging, enabled: boolean): Promise<void>;
96
+
97
+ /**
98
+ * When a notification from FCM has triggered the application to open from a quit state,
99
+ * this method will return a `RemoteMessage` containing the notification data, or `null` if
100
+ * the app was opened via another method.
101
+ * @param messaging - Messaging instance.
102
+ * @returns A promise that resolves with the initial notification or null.
103
+ */
104
+ export function getInitialNotification(
105
+ messaging: Messaging,
106
+ ): Promise<FirebaseMessagingTypes.RemoteMessage | null>;
107
+
108
+ /**
109
+ * When the app is opened from iOS notifications settings from a quit state,
110
+ * this method will return `true` or `false` if the app was opened via another method.
111
+ * @param messaging - Messaging instance.
112
+ * @returns A promise that resolves with a boolean indicating if the app was opened from settings.
113
+ */
114
+ export function getDidOpenSettingsForNotification(messaging: Messaging): Promise<boolean>;
115
+
116
+ /**
117
+ * Returns whether the root view is headless or not
118
+ * i.e. true if the app was launched in the background (for example, by data-only cloud message).
119
+ * @param messaging - Messaging instance.
120
+ * @returns A promise that resolves with a boolean indicating if the app is headless.
121
+ */
122
+ export function getIsHeadless(messaging: Messaging): Promise<boolean>;
123
+
124
+ /**
125
+ * On iOS, if your app wants to receive remote messages from FCM (via APNs), you must explicitly register
126
+ * with APNs if auto-registration has been disabled.
127
+ * @param messaging - Messaging instance.
128
+ * @returns A promise that resolves when the device is registered.
129
+ */
130
+ export function registerDeviceForRemoteMessages(messaging: Messaging): Promise<void>;
131
+
132
+ /**
133
+ * Returns a boolean value whether the user has registered for remote notifications via
134
+ * `registerDeviceForRemoteMessages()`. For iOS. Android always returns `true`.
135
+ * @param messaging - Messaging instance.
136
+ * @returns A boolean indicating if the device is registered for remote messages.
137
+ */
138
+ export function isDeviceRegisteredForRemoteMessages(messaging: Messaging): boolean;
139
+
140
+ /**
141
+ * Unregisters the app from receiving remote notifications.
142
+ * @param messaging - Messaging instance.
143
+ * @returns A promise that resolves when the device is unregistered.
144
+ */
145
+ export function unregisterDeviceForRemoteMessages(messaging: Messaging): Promise<void>;
146
+
147
+ /**
148
+ * On iOS, it is possible to get the users APNs token. This may be required if you want to send messages to your
149
+ * iOS devices without using the FCM service.
150
+ * @param messaging - Messaging instance.
151
+ * @returns A promise that resolves with the APNs token or null.
152
+ */
153
+ export function getAPNSToken(messaging: Messaging): Promise<string | null>;
154
+
155
+ /**
156
+ * On iOS, This method is used to set the APNs Token received by the application delegate.
157
+ * Note that the token is expected to be a hexadecimal string, as it is an NSData type in
158
+ * the underlying native firebase SDK, and raw data may only be passed as a string if it is
159
+ * hex encoded. Calling code is responsible for correct encoding, you should verify by comparing
160
+ * the results of `getAPNSToken()` with your token parameter to make sure they are equivalent.
161
+ *
162
+ * Messaging uses method swizzling to ensure that the APNs token is set automatically.
163
+ * However, if you have disabled swizzling by setting FirebaseAppDelegateProxyEnabled to NO
164
+ * in your app’s Info.plist, you should manually set the APNs token in your application
165
+ * delegate’s application(_:didRegisterForRemoteNotificationsWithDeviceToken:) method.
166
+ *
167
+ * If you would like to set the type of the APNs token, rather than relying on automatic
168
+ * detection, provide a type of either 'prod', 'sandbox'. Omitting the type parameter
169
+ * or specifying 'unknown' will rely on automatic type detection based on provisioning profile.
170
+ *
171
+ * At a native level you may also call objective-c `[FIRMessaging setAPNSToken];` as needed.
172
+ *
173
+ * @param messaging - Messaging instance.
174
+ * @param token - A hexadecimal string representing your APNs token.
175
+ * @param type - Optional. A string specifying 'prod', 'sandbox' or 'unknown' token type.
176
+ * @returns A promise that resolves when the APNs token is set.
177
+ */
178
+ export function setAPNSToken(messaging: Messaging, token: string, type?: string): Promise<void>;
179
+
180
+ /**
181
+ * Returns a `AuthorizationStatus` as to whether the user has messaging permission for this app.
182
+ * @param messaging - Messaging instance.
183
+ * @returns A promise that resolves with the authorization status.
184
+ */
185
+ export function hasPermission(
186
+ messaging: Messaging,
187
+ ): Promise<FirebaseMessagingTypes.AuthorizationStatus>;
188
+
189
+ /**
190
+ * Called when the FCM server deletes pending messages.
191
+ * @param messaging - Messaging instance.
192
+ * @param listener - Called when the FCM deletes pending messages.
193
+ * @returns A function to unsubscribe from the deleted messages listener.
194
+ */
195
+ export function onDeletedMessages(messaging: Messaging, listener: () => void): () => void;
196
+
197
+ /**
198
+ * When sending a `RemoteMessage`, this listener is called when the message has been sent to FCM.
199
+ * @param messaging - Messaging instance.
200
+ * @param listener - Called when the FCM sends the remote message to FCM.
201
+ * @returns A function to unsubscribe from the message sent listener.
202
+ */
203
+ export function onMessageSent(
204
+ messaging: Messaging,
205
+ listener: (messageId: string) => any,
206
+ ): () => void;
207
+
208
+ /**
209
+ * When sending a `RemoteMessage`, this listener is called when an error is thrown and the
210
+ * message could not be sent.
211
+ * @param messaging - Messaging instance.
212
+ * @param listener - Called when the FCM sends the remote message to FCM.
213
+ * @returns A function to unsubscribe from the send error listener.
214
+ */
215
+ export function onSendError(
216
+ messaging: Messaging,
217
+ listener: (evt: FirebaseMessagingTypes.SendErrorEvent) => any,
218
+ ): () => void;
219
+
220
+ /**
221
+ * Set a message handler function which is called when the app is in the background
222
+ * or terminated. In Android, a headless task is created, allowing you to access the React Native environment
223
+ * to perform tasks such as updating local storage, or sending a network request.
224
+ * @param messaging - Messaging instance.
225
+ * @param handler - Called when a message is sent and the application is in a background or terminated state.
226
+ * @returns {void}
227
+ */
228
+ export function setBackgroundMessageHandler(
229
+ messaging: Messaging,
230
+ handler: (message: FirebaseMessagingTypes.RemoteMessage) => Promise<any>,
231
+ ): void;
232
+
233
+ /**
234
+ * Set a handler function which is called when the `${App Name} notifications settings`
235
+ * link in iOS settings is clicked.
236
+ * @param messaging - Messaging instance.
237
+ * @param handler - Called when link in iOS settings is clicked.
238
+ * @returns {void}
239
+ */
240
+ export function setOpenSettingsForNotificationsHandler(
241
+ messaging: Messaging,
242
+ handler: (message: FirebaseMessagingTypes.RemoteMessage) => any,
243
+ ): void;
244
+
245
+ /**
246
+ * Send a new `RemoteMessage` to the FCM server.
247
+ * @param messaging - Messaging instance.
248
+ * @param message - A `RemoteMessage` interface.
249
+ * @returns A promise that resolves when the message is sent.
250
+ */
251
+ export function sendMessage(
252
+ messaging: Messaging,
253
+ message: FirebaseMessagingTypes.RemoteMessage,
254
+ ): Promise<void>;
255
+
256
+ /**
257
+ * Apps can subscribe to a topic, which allows the FCM server to send targeted messages to only those
258
+ * devices subscribed to that topic.
259
+ * @param messaging - Messaging instance.
260
+ * @param topic - The topic name.
261
+ * @returns A promise that resolves when the subscription is complete.
262
+ */
263
+ export function subscribeToTopic(messaging: Messaging, topic: string): Promise<void>;
264
+
265
+ /**
266
+ * Unsubscribe the device from a topic.
267
+ * @param messaging - Messaging instance.
268
+ * @param topic - The topic name.
269
+ * @returns A promise that resolves when the unsubscription is complete.
270
+ */
271
+ export function unsubscribeFromTopic(messaging: Messaging, topic: string): Promise<void>;
272
+
273
+ /**
274
+ * Returns a boolean whether message delivery metrics are exported to BigQuery.
275
+ * @param messaging - Messaging instance.
276
+ * @returns A boolean indicating if message delivery metrics are exported to BigQuery.
277
+ */
278
+ export function isDeliveryMetricsExportToBigQueryEnabled(messaging: Messaging): boolean;
279
+
280
+ /**
281
+ * Checks if all required APIs exist in the browser.
282
+ * @param messaging - Messaging instance.
283
+ * @returns A boolean indicating if the APIs are supported.
284
+ */
285
+ export function isSupported(messaging: Messaging): boolean;
286
+
287
+ /**
288
+ * Sets whether message delivery metrics are exported to BigQuery is enabled or disabled.
289
+ * The value is false by default. Set this to true to allow exporting of message delivery metrics to BigQuery.
290
+ * @param messaging - Messaging instance.
291
+ * @param enabled - A boolean value to enable or disable exporting of message delivery metrics to BigQuery.
292
+ * @returns A promise that resolves when the setting is updated.
293
+ */
294
+ export function experimentalSetDeliveryMetricsExportedToBigQueryEnabled(
295
+ messaging: Messaging,
296
+ enabled: boolean,
297
+ ): Promise<void>;
@@ -1,8 +1,20 @@
1
1
  import { firebase } from '..';
2
2
 
3
+ /**
4
+ * @typedef {import('..').FirebaseMessagingTypes} FirebaseMessagingTypes
5
+ * @typedef {import('..').FirebaseMessagingTypes.Module} Messaging
6
+ * @typedef {import('..').FirebaseMessagingTypes.RemoteMessage} RemoteMessage
7
+ * @typedef {import('..').FirebaseMessagingTypes.NativeTokenOptions} NativeTokenOptions
8
+ * @typedef {import('..').FirebaseMessagingTypes.GetTokenOptions} GetTokenOptions
9
+ * @typedef {import('..').FirebaseMessagingTypes.IOSPermissions} IOSPermissions
10
+ * @typedef {import('..').FirebaseMessagingTypes.AuthorizationStatus} AuthorizationStatus
11
+ * @typedef {import('..').FirebaseMessagingTypes.SendErrorEvent} SendErrorEvent
12
+ * @typedef {import('@firebase/app').FirebaseApp} FirebaseApp
13
+ */
14
+
3
15
  /**
4
16
  * Returns a Messaging instance for the given app.
5
- * @param app - FirebaseApp. Optional.
17
+ * @param {FirebaseApp} [app] - FirebaseApp. Optional.
6
18
  * @returns {Messaging}
7
19
  */
8
20
  export function getMessaging(app) {
@@ -14,10 +26,10 @@ export function getMessaging(app) {
14
26
  }
15
27
 
16
28
  /**
17
- * Removes access to an FCM token previously authorized by it's scope.
29
+ * Removes access to an FCM token previously authorized by its scope.
18
30
  * Messages sent by the server to this token will fail.
19
- * @param messaging Messaging instance.
20
- * @param tokenOptions Options to override senderId (iOS) and projectId (Android).
31
+ * @param {Messaging} messaging - Messaging instance.
32
+ * @param {NativeTokenOptions} [tokenOptions] - Options to override senderId (iOS) and projectId (Android).
21
33
  * @returns {Promise<void>}
22
34
  */
23
35
  export function deleteToken(messaging, tokenOptions) {
@@ -29,9 +41,9 @@ export function deleteToken(messaging, tokenOptions) {
29
41
  }
30
42
 
31
43
  /**
32
- * Returns an FCM token for this device. Optionally you can specify a custom options to your own use-case.
33
- * @param messaging Messaging instance.
34
- * @param options Options to override senderId (iOS) and appName
44
+ * Returns an FCM token for this device. Optionally, you can specify custom options for your own use case.
45
+ * @param {Messaging} messaging - Messaging instance.
46
+ * @param {GetTokenOptions & NativeTokenOptions} [options] - Options to override senderId (iOS) and appName.
35
47
  * @returns {Promise<string>}
36
48
  */
37
49
  export function getToken(messaging, options) {
@@ -45,20 +57,20 @@ export function getToken(messaging, options) {
45
57
  /**
46
58
  * When any FCM payload is received, the listener callback is called with a `RemoteMessage`.
47
59
  * > This subscriber method is only called when the app is active (in the foreground).
48
- * @param messaging Messaging instance.
49
- * @param listener Called with a `RemoteMessage` when a new FCM payload is received from the server.
50
- * @returns {Function}
60
+ * @param {Messaging} messaging - Messaging instance.
61
+ * @param {(message: RemoteMessage) => any} listener - Called with a `RemoteMessage` when a new FCM payload is received from the server.
62
+ * @returns {() => void}
51
63
  */
52
- export function onMessage(messaging, nextOrObserver) {
53
- return messaging.onMessage(nextOrObserver);
64
+ export function onMessage(messaging, listener) {
65
+ return messaging.onMessage(listener);
54
66
  }
55
67
 
56
68
  /**
57
69
  * When the user presses a notification displayed via FCM, this listener will be called if the app
58
70
  * has opened from a background state.
59
- * @param messaging Messaging instance.
60
- * @param listener Called with a `RemoteMessage` when a notification press opens the application.
61
- * @returns {Function}
71
+ * @param {Messaging} messaging - Messaging instance.
72
+ * @param {(message: RemoteMessage) => any} listener - Called with a `RemoteMessage` when a notification press opens the application.
73
+ * @returns {() => void}
62
74
  */
63
75
  export function onNotificationOpenedApp(messaging, listener) {
64
76
  return messaging.onNotificationOpenedApp(listener);
@@ -68,9 +80,9 @@ export function onNotificationOpenedApp(messaging, listener) {
68
80
  * Called when a new registration token is generated for the device. For example, this event can happen when a
69
81
  * token expires or when the server invalidates the token.
70
82
  * > This subscriber method is only called when the app is active (in the foreground).
71
- * @param messaging Messaging instance.
72
- * @param listener Called with a FCM token when the token is refreshed.
73
- * @returns {Function}
83
+ * @param {Messaging} messaging - Messaging instance.
84
+ * @param {(token: string) => any} listener - Called with a FCM token when the token is refreshed.
85
+ * @returns {() => void}
74
86
  */
75
87
  export function onTokenRefresh(messaging, listener) {
76
88
  return messaging.onTokenRefresh(listener);
@@ -79,8 +91,8 @@ export function onTokenRefresh(messaging, listener) {
79
91
  /**
80
92
  * On iOS, messaging permission must be requested by the current application before messages can
81
93
  * be received or sent.
82
- * @param messaging Messaging instance.
83
- * @param iosPermissions All the available permissions for iOS that can be requested
94
+ * @param {Messaging} messaging - Messaging instance.
95
+ * @param {IOSPermissions} [iosPermissions] - All the available permissions for iOS that can be requested.
84
96
  * @returns {Promise<AuthorizationStatus>}
85
97
  */
86
98
  export function requestPermission(messaging, iosPermissions) {
@@ -89,7 +101,7 @@ export function requestPermission(messaging, iosPermissions) {
89
101
 
90
102
  /**
91
103
  * Returns whether messaging auto initialization is enabled or disabled for the device.
92
- * @param messaging Messaging instance.
104
+ * @param {Messaging} messaging - Messaging instance.
93
105
  * @returns {boolean}
94
106
  */
95
107
  export function isAutoInitEnabled(messaging) {
@@ -97,10 +109,10 @@ export function isAutoInitEnabled(messaging) {
97
109
  }
98
110
 
99
111
  /**
100
- * Returns whether messaging auto initialization is enabled or disabled for the device.
101
- * @param messaging Messaging instance.
102
- * @param enabled A boolean value to enable or disable auto initialization.
103
- * @returns {Promise<boolean>}
112
+ * Sets whether messaging auto initialization is enabled or disabled for the device.
113
+ * @param {Messaging} messaging - Messaging instance.
114
+ * @param {boolean} enabled - A boolean value to enable or disable auto initialization.
115
+ * @returns {Promise<void>}
104
116
  */
105
117
  export function setAutoInitEnabled(messaging, enabled) {
106
118
  return messaging.setAutoInitEnabled(enabled);
@@ -110,7 +122,7 @@ export function setAutoInitEnabled(messaging, enabled) {
110
122
  * When a notification from FCM has triggered the application to open from a quit state,
111
123
  * this method will return a `RemoteMessage` containing the notification data, or `null` if
112
124
  * the app was opened via another method.
113
- * @param messaging Messaging instance.
125
+ * @param {Messaging} messaging - Messaging instance.
114
126
  * @returns {Promise<RemoteMessage | null>}
115
127
  */
116
128
  export function getInitialNotification(messaging) {
@@ -120,7 +132,7 @@ export function getInitialNotification(messaging) {
120
132
  /**
121
133
  * When the app is opened from iOS notifications settings from a quit state,
122
134
  * this method will return `true` or `false` if the app was opened via another method.
123
- * @param messaging Messaging instance.
135
+ * @param {Messaging} messaging - Messaging instance.
124
136
  * @returns {Promise<boolean>}
125
137
  */
126
138
  export function getDidOpenSettingsForNotification(messaging) {
@@ -130,7 +142,7 @@ export function getDidOpenSettingsForNotification(messaging) {
130
142
  /**
131
143
  * Returns whether the root view is headless or not
132
144
  * i.e true if the app was launched in the background (for example, by data-only cloud message)
133
- * @param messaging Messaging instance.
145
+ * @param {Messaging} messaging - Messaging instance.
134
146
  * @returns {Promise<boolean>}
135
147
  */
136
148
  export function getIsHeadless(messaging) {
@@ -140,7 +152,7 @@ export function getIsHeadless(messaging) {
140
152
  /**
141
153
  * On iOS, if your app wants to receive remote messages from FCM (via APNs), you must explicitly register
142
154
  * with APNs if auto-registration has been disabled.
143
- * @param messaging Messaging instance.
155
+ * @param {Messaging} messaging - Messaging instance.
144
156
  * @returns {Promise<void>}
145
157
  */
146
158
  export function registerDeviceForRemoteMessages(messaging) {
@@ -149,8 +161,8 @@ export function registerDeviceForRemoteMessages(messaging) {
149
161
 
150
162
  /**
151
163
  * Returns a boolean value whether the user has registered for remote notifications via
152
- * `registerDeviceForRemoteMessages()`. For iOS. Android always returns `true`
153
- * @param messaging Messaging instance.
164
+ * `registerDeviceForRemoteMessages()`. For iOS. Android always returns `true`.
165
+ * @param {Messaging} messaging - Messaging instance.
154
166
  * @returns {boolean}
155
167
  */
156
168
  export function isDeviceRegisteredForRemoteMessages(messaging) {
@@ -159,7 +171,7 @@ export function isDeviceRegisteredForRemoteMessages(messaging) {
159
171
 
160
172
  /**
161
173
  * Unregisters the app from receiving remote notifications.
162
- * @param messaging Messaging instance.
174
+ * @param {Messaging} messaging - Messaging instance.
163
175
  * @returns {Promise<void>}
164
176
  */
165
177
  export function unregisterDeviceForRemoteMessages(messaging) {
@@ -169,7 +181,7 @@ export function unregisterDeviceForRemoteMessages(messaging) {
169
181
  /**
170
182
  * On iOS, it is possible to get the users APNs token. This may be required if you want to send messages to your
171
183
  * iOS devices without using the FCM service.
172
- * @param messaging Messaging instance.
184
+ * @param {Messaging} messaging - Messaging instance.
173
185
  * @returns {Promise<string | null>}
174
186
  */
175
187
  export function getAPNSToken(messaging) {
@@ -181,7 +193,7 @@ export function getAPNSToken(messaging) {
181
193
  * Note that the token is expected to be a hexadecimal string, as it is an NSData type in
182
194
  * the underlying native firebase SDK, and raw data may only be passed as a string if it is
183
195
  * hex encoded. Calling code is responsible for correct encoding, you should verify by comparing
184
- * the results of `getAPNSToken()` with your token parameter to make sure they are equivalent
196
+ * the results of `getAPNSToken()` with your token parameter to make sure they are equivalent.
185
197
  *
186
198
  * Messaging uses method swizzling to ensure that the APNs token is set automatically.
187
199
  * However, if you have disabled swizzling by setting FirebaseAppDelegateProxyEnabled to NO
@@ -192,11 +204,11 @@ export function getAPNSToken(messaging) {
192
204
  * detection, provide a type of either 'prod', 'sandbox'. Omitting the type parameter
193
205
  * or specifying 'unknown' will rely on automatic type detection based on provisioning profile.
194
206
  *
195
- * At a native level you may also call objective-c `[FIRMessaging setAPNSToken];` as needed
207
+ * At a native level you may also call objective-c `[FIRMessaging setAPNSToken];` as needed.
196
208
  *
197
- * @param messaging Messaging instance.
198
- * @param {string} token a hexadecimal string representing your APNS token
199
- * @param {string?} type specifying 'prod', 'sandbox' or 'unknown' token type
209
+ * @param {Messaging} messaging - Messaging instance.
210
+ * @param {string} token - A hexadecimal string representing your APNs token.
211
+ * @param {string} [type] - Optional. A string specifying 'prod', 'sandbox' or 'unknown' token type.
200
212
  * @returns {Promise<void>}
201
213
  */
202
214
  export function setAPNSToken(messaging, token, type) {
@@ -205,7 +217,7 @@ export function setAPNSToken(messaging, token, type) {
205
217
 
206
218
  /**
207
219
  * Returns a `AuthorizationStatus` as to whether the user has messaging permission for this app.
208
- * @param messaging Messaging instance.
220
+ * @param {Messaging} messaging - Messaging instance.
209
221
  * @returns {Promise<AuthorizationStatus>}
210
222
  */
211
223
  export function hasPermission(messaging) {
@@ -214,9 +226,9 @@ export function hasPermission(messaging) {
214
226
 
215
227
  /**
216
228
  * Called when the FCM server deletes pending messages.
217
- * @param messaging Messaging instance.
218
- * @param listener Called when the FCM deletes pending messages.
219
- * @returns {Function}
229
+ * @param {Messaging} messaging - Messaging instance.
230
+ * @param {() => void} listener - Called when the FCM deletes pending messages.
231
+ * @returns {() => void}
220
232
  */
221
233
  export function onDeletedMessages(messaging, listener) {
222
234
  return messaging.onDeletedMessages(listener);
@@ -224,9 +236,9 @@ export function onDeletedMessages(messaging, listener) {
224
236
 
225
237
  /**
226
238
  * When sending a `RemoteMessage`, this listener is called when the message has been sent to FCM.
227
- * @param messaging Messaging instance.
228
- * @param listener Called when the FCM sends the remote message to FCM.
229
- * @returns {Function}
239
+ * @param {Messaging} messaging - Messaging instance.
240
+ * @param {(messageId: string) => any} listener - Called when the FCM sends the remote message to FCM.
241
+ * @returns {() => void}
230
242
  */
231
243
  export function onMessageSent(messaging, listener) {
232
244
  return messaging.onMessageSent(listener);
@@ -234,9 +246,9 @@ export function onMessageSent(messaging, listener) {
234
246
 
235
247
  /**
236
248
  * When sending a `RemoteMessage`, this listener is called when the message has been sent to FCM.
237
- * @param messaging Messaging instance.
238
- * @param listener Called when the FCM sends the remote message to FCM.
239
- * @returns {Function}
249
+ * @param {Messaging} messaging - Messaging instance.
250
+ * @param {(evt: SendErrorEvent) => any} listener - Called when the FCM sends the remote message to FCM.
251
+ * @returns {() => void}
240
252
  */
241
253
  export function onSendError(messaging, listener) {
242
254
  return messaging.onSendError(listener);
@@ -246,8 +258,8 @@ export function onSendError(messaging, listener) {
246
258
  * Set a message handler function which is called when the app is in the background
247
259
  * or terminated. In Android, a headless task is created, allowing you to access the React Native environment
248
260
  * to perform tasks such as updating local storage, or sending a network request.
249
- * @param messaging Messaging instance.
250
- * @param handler Called when a message is sent and the application is in a background or terminated state.
261
+ * @param {Messaging} messaging - Messaging instance.
262
+ * @param {(message: RemoteMessage) => Promise<any>} handler - Called when a message is sent and the application is in a background or terminated state.
251
263
  * @returns {void}
252
264
  */
253
265
  export function setBackgroundMessageHandler(messaging, handler) {
@@ -257,8 +269,8 @@ export function setBackgroundMessageHandler(messaging, handler) {
257
269
  /**
258
270
  * Set a handler function which is called when the `${App Name} notifications settings`
259
271
  * link in iOS settings is clicked.
260
- * @param messaging Messaging instance.
261
- * @param handler Called when link in iOS settings is clicked
272
+ * @param {Messaging} messaging - Messaging instance.
273
+ * @param {(message: RemoteMessage) => any} handler - Called when link in iOS settings is clicked.
262
274
  * @returns {void}
263
275
  */
264
276
  export function setOpenSettingsForNotificationsHandler(messaging, handler) {
@@ -267,8 +279,8 @@ export function setOpenSettingsForNotificationsHandler(messaging, handler) {
267
279
 
268
280
  /**
269
281
  * Send a new `RemoteMessage` to the FCM server.
270
- * @param messaging Messaging instance.
271
- * @param message A `RemoteMessage` interface.
282
+ * @param {Messaging} messaging - Messaging instance.
283
+ * @param {RemoteMessage} message - A `RemoteMessage` interface.
272
284
  * @returns {Promise<void>}
273
285
  */
274
286
  export function sendMessage(messaging, message) {
@@ -278,8 +290,8 @@ export function sendMessage(messaging, message) {
278
290
  /**
279
291
  * Apps can subscribe to a topic, which allows the FCM server to send targeted messages to only those
280
292
  * devices subscribed to that topic.
281
- * @param messaging Messaging instance.
282
- * @param topic The topic name.
293
+ * @param {Messaging} messaging - Messaging instance.
294
+ * @param {string} topic - The topic name.
283
295
  * @returns {Promise<void>}
284
296
  */
285
297
  export function subscribeToTopic(messaging, topic) {
@@ -288,8 +300,8 @@ export function subscribeToTopic(messaging, topic) {
288
300
 
289
301
  /**
290
302
  * Unsubscribe the device from a topic.
291
- * @param messaging Messaging instance.
292
- * @param topic The topic name.
303
+ * @param {Messaging} messaging - Messaging instance.
304
+ * @param {string} topic - The topic name.
293
305
  * @returns {Promise<void>}
294
306
  */
295
307
  export function unsubscribeFromTopic(messaging, topic) {
@@ -298,7 +310,7 @@ export function unsubscribeFromTopic(messaging, topic) {
298
310
 
299
311
  /**
300
312
  * Returns a boolean whether message delivery metrics are exported to BigQuery.
301
- * @param messaging Messaging instance.
313
+ * @param {Messaging} messaging - Messaging instance.
302
314
  * @returns {boolean}
303
315
  */
304
316
  export function isDeliveryMetricsExportToBigQueryEnabled(messaging) {
@@ -307,7 +319,7 @@ export function isDeliveryMetricsExportToBigQueryEnabled(messaging) {
307
319
 
308
320
  /**
309
321
  * Checks if all required APIs exist in the browser.
310
- * @param messaging Messaging instance.
322
+ * @param {Messaging} messaging - Messaging instance.
311
323
  * @returns {boolean}
312
324
  */
313
325
  export function isSupported(messaging) {
@@ -317,10 +329,10 @@ export function isSupported(messaging) {
317
329
  /**
318
330
  * Sets whether message delivery metrics are exported to BigQuery is enabled or disabled.
319
331
  * The value is false by default. Set this to true to allow exporting of message delivery metrics to BigQuery.
320
- * @param messaging Messaging instance.
321
- * @param enabled A boolean value to enable or disable exporting of message delivery metrics to BigQuery.
332
+ * @param {Messaging} messaging - Messaging instance.
333
+ * @param {boolean} enabled - A boolean value to enable or disable exporting of message delivery metrics to BigQuery.
322
334
  * @returns {Promise<void>}
323
335
  */
324
- export function experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, enable) {
325
- return messaging.setDeliveryMetricsExportToBigQuery(enable);
336
+ export function experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, enabled) {
337
+ return messaging.setDeliveryMetricsExportToBigQuery(enabled);
326
338
  }
package/lib/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- module.exports = '20.3.0';
2
+ module.exports = '20.5.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native-firebase/messaging",
3
- "version": "20.3.0",
3
+ "version": "20.5.0",
4
4
  "author": "Invertase <oss@invertase.io> (http://invertase.io)",
5
5
  "description": "React Native Firebase - React Native Firebase provides native integration of Firebase Cloud Messaging (FCM) for both Android & iOS. FCM is a cost free service, allowing for server-device and device-device communication. The React Native Firebase Messaging module provides a simple JavaScript API to interact with FCM.",
6
6
  "main": "lib/index.js",
@@ -24,7 +24,7 @@
24
24
  "messaging"
25
25
  ],
26
26
  "peerDependencies": {
27
- "@react-native-firebase/app": "20.3.0",
27
+ "@react-native-firebase/app": "20.5.0",
28
28
  "expo": ">=47.0.0"
29
29
  },
30
30
  "devDependencies": {
@@ -38,5 +38,5 @@
38
38
  "publishConfig": {
39
39
  "access": "public"
40
40
  },
41
- "gitHead": "a916b37b022cf40588fa0fd915b7ab901e2458d0"
41
+ "gitHead": "daf2bc9086c14bbb0e1b02a4d4274b7060263eb1"
42
42
  }