Using Firebase Cloud Messaging (FCM) for push notifications has minimal impact on app frame rate and memory. Notifications are handled by the system in the background, so your app's UI stays smooth at 60fps. However, frequent or heavy notifications can increase battery use and network data consumption.
Push notifications with FCM in React Native - Build, Publish & Deploy
To keep your app fast and responsive, avoid processing heavy tasks directly when a notification arrives. Instead, use background handlers efficiently and defer complex work until the app is active. Limit notification payload size to under 4KB to reduce network load and latency.
Adding FCM requires including Firebase SDKs, which can increase your app size by about 5-10MB. Use tools like Proguard (Android) and bitcode (iOS) to shrink the final bundle. The SDK does not significantly affect startup time since it initializes asynchronously.
On iOS, you must request user permission to show notifications and configure APNs certificates in Firebase. iOS handles notification display and actions differently, requiring specific payload keys. Android requires adding Firebase configuration files and setting up notification channels for Android 8.0+ to control notification behavior.
- Apple App Store: Must request user consent for notifications and explain usage clearly in the permission prompt.
- Google Play Store: Follow policies on user privacy and data usage; disclose notification use in your privacy policy.
- Both stores require your app to handle notifications responsibly without spamming users.
Your app takes 5 seconds to load this screen. What's likely wrong?
- Firebase SDK initialization blocking the main thread.
- Heavy processing triggered by notification handlers on startup.
- Large notification payloads causing delays.
Practice
Solution
Step 1: Understand FCM's role
FCM is a service designed to send push notifications to apps.Step 2: Compare options
Only To send push notifications to the app users describes sending push notifications, which is FCM's main purpose.Final Answer:
To send push notifications to the app users -> Option CQuick Check:
FCM = Push notifications [OK]
- Confusing FCM with local data storage
- Thinking FCM manages UI or navigation
- Assuming FCM is for database operations
Solution
Step 1: Identify token retrieval method
The method to get the device token is messaging().getToken().Step 2: Eliminate other options
requestPermission() asks user permission, sendMessage() sends messages, subscribeToTopic() subscribes to topics.Final Answer:
messaging().getToken() -> Option BQuick Check:
Get token = getToken() [OK]
- Using requestPermission() to get token
- Confusing sendMessage() with token retrieval
- Mixing subscribeToTopic() with token methods
import messaging from '@react-native-firebase/messaging';
async function getToken() {
const token = await messaging().getToken();
console.log(token);
}
getToken();Solution
Step 1: Analyze async function behavior
The function awaits messaging().getToken(), which returns the device token string.Step 2: Understand console.log output
It logs the token string, not undefined or error, assuming messaging is imported correctly.Final Answer:
Logs the device's FCM token string to the console -> Option AQuick Check:
getToken() returns token string [OK]
- Forgetting await causing Promise logged
- Assuming getToken() returns undefined
- Not importing messaging correctly
import messaging from '@react-native-firebase/messaging'; messaging().requestPermission();What is the likely problem?
Solution
Step 1: Check async method usage
requestPermission() returns a Promise and should be awaited to complete permission request.Step 2: Identify missing await effect
Without await, the permission request may not finish before next steps, causing unexpected behavior.Final Answer:
You forgot to await the requestPermission() call -> Option DQuick Check:
Await async calls like requestPermission() [OK]
- Not awaiting async permission calls
- Thinking requestPermission() is invalid
- Calling getToken() before permission
Solution
Step 1: Check permission before token
const authStatus = await messaging().requestPermission(); if (authStatus === messaging.AuthorizationStatus.AUTHORIZED) { const token = await messaging().getToken(); console.log(token); } requests permission and checks if authorized before getting token.Step 2: Verify async and order correctness
const authStatus = await messaging().requestPermission(); if (authStatus === messaging.AuthorizationStatus.AUTHORIZED) { const token = await messaging().getToken(); console.log(token); } awaits both calls and uses correct AuthorizationStatus check.Final Answer:
const authStatus = await messaging().requestPermission(); if (authStatus === messaging.AuthorizationStatus.AUTHORIZED) { const token = await messaging().getToken(); console.log(token); } -> Option AQuick Check:
Check permission first, then get token [OK]
- Getting token before permission
- Not awaiting async calls
- Ignoring authorization status check
Ready to prove it?
Pass the test and this pattern moves unknown
