# Push Notifications Configure and implement push notifications for iOS and Android platforms. # Push Notifications > How to configure your application to receive and respond to notifications. Before setting up push notifications in your app, you need to configure push services in the Airship dashboard. See [iOS Channel Configuration](https://www.airship.com/docs/guides/getting-started/developers/configure-channels/#ios-channel-configuration) for APNs setup and [Android Channel Configuration](https://www.airship.com/docs/guides/getting-started/developers/configure-channels/#android-channel-configuration) for FCM setup. ## Platform Setup Before you can send and receive push notifications, you need to configure your app for the platform(s) you're targeting. ### iOS #### Standard React Native #### Enable Push Notifications Capability 1. Open your project in Xcode. 2. Click on your project in the Project Navigator. 3. Select your main app target and then click the **Signing & Capabilities** tab. 4. If you do not see Push Notifications enabled, click **+ Capability** and add **Push Notifications**.  *Adding the Push Notifications capability in Xcode* #### Enable Background Modes 1. Select your main app target and then click the **Signing & Capabilities** tab. 2. Click **+ Capability** and add **Background Modes**.  *Adding the Background Modes capability in Xcode* 3. In the **Background Modes** section, select the **Remote notifications** checkbox.  *Enabling Remote notifications in Background Modes* #### Notification Service Extension
To take advantage of notification attachments, such as images, animated gifs, and video, you will need to create a notification service extension.
Follow the steps in the [iOS Notification Service Extension Guide](https://www.airship.com/docs/developer/sdk-integration/apple/push-notifications/notification-service-extension/). #### Expo The Airship Expo plugin automatically configures iOS capabilities (Push Notifications and Background Modes) and the Notification Service Extension. No manual Xcode configuration is required. ### Android Configure Firebase Cloud Messaging (FCM) to enable push notifications on Android. #### FCM Setup #### Standard React Native 1. Download the Android Firebase configuration file `google-services.json` from the application's Firebase console into the root directory at `android/app/google-services.json`. If your react-native application does not have an associated app in the Firebase console, follow the [FCM setup instructions](https://www.airship.com/docs/developer/sdk-integration/android/installation/getting-started/#fcm-setup) to set one up. #### Expo Expo automatically handles the `google-services.json` file through its build process. See the [Expo documentation](https://docs.expo.dev/push-notifications/fcm-credentials/) for details on configuring FCM credentials. #### HMS Setup 1. Follow [Huawei's documentation](https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/android-integrating-sdk-0000001050040084) to set up the HMS SDK. > **Note:** Airship requires HMS Core Push SDK 6.3.0.304 or newer. 2. Add `airshipHmsEnabled=true` to the app's gradle.properties. #### Notification Configuration Configure the notification icon and accent color in your `takeOff` config: ```ts Airship.takeOff({ default: { appKey: "YOUR_APP_KEY", appSecret: "YOUR_APP_SECRET" }, site: "us", android: { notificationConfig: { icon: "ic_notification", accentColor: "#00ff00" } } }); ``` See the [React Native Setup guide](https://www.airship.com/docs/developer/sdk-integration/react-native/installation/getting-started/) for complete `takeOff` configuration options. ## Enable User Notifications The Airship SDK distinguishes between *user notifications* (visible to users) and *silent push notifications* (background data delivery). User notifications require explicit permission from the user. By default, user notifications are disabled. Enable them when you want to show visible notifications to users. ### Basic Enablement The simplest way to enable user notifications is with `setUserNotificationsEnabled()`: ```typescript await Airship.push.setUserNotificationsEnabled(true); ``` This will prompt the user for permission if not already granted. However, it does not provide feedback on whether the user accepted or denied the permission. > **Note:** For apps that target Android 13 (API 33) and above, enabling user notifications will display a runtime permission prompt. > > To increase the likelihood that the user will accept, you should avoid prompting the user for permission immediately on app startup, and instead wait for a more appropriate time to prompt for notification permission. ### Async Enablement with Fallback For more control over the permission flow, use `enableUserNotifications()` which returns the permission result and supports a fallback option: ```typescript // Enable with system settings fallback const granted = await Airship.push.enableUserNotifications({ fallback: PromptPermissionFallback.SystemSettings }); if (granted) { console.log('Notifications enabled'); } else { console.log('Notifications denied'); } ``` The `SystemSettings` fallback option will prompt the user to open system settings if permission is denied on iOS or denied silently on Android. This gives users a second chance to enable notifications if they initially declined. ### Checking Notification Status To check if user notifications are currently enabled: ```typescript const enabled = await Airship.push.isUserNotificationsEnabled(); ``` For more detailed status information, use `getNotificationStatus()`: ```typescript const status = await Airship.push.getNotificationStatus(); console.log('Are notifications allowed:', status.areNotificationsAllowed); console.log('Is opted in:', status.isOptedIn); ``` To monitor notification status changes in real-time: ```typescript Airship.addListener(EventType.PushNotificationStatusChangedStatus, (event) => { console.log('Notification status changed:', event.status); console.log('Is opted in:', event.status.isOptedIn); }); ``` ### Getting the Registration Token To get the platform-specific push token (APNs token on iOS, FCM token on Android): ```typescript const token = await Airship.push.getRegistrationToken(); ``` For more advanced event handling and token updates, see [Handling Notification Events](https://www.airship.com/docs/developer/sdk-integration/react-native/push-notifications/handling-notification-events/). If push notifications aren't working as expected, see [Troubleshooting Push Notifications](https://www.airship.com/docs/developer/sdk-integration/react-native/troubleshooting/push-notifications/) to check notification status and fix common issues. # Notification Events > Listen for push notification events, handle user responses, and manage active notifications. The Airship SDK provides event listeners for when a push is received or a notification is interacted with. Apps can use these events for custom push processing. ## Notification Events The SDK provides several event listeners for handling push notifications at different stages. ### Push Received Listen for when a push notification is received: ```typescript Airship.addListener(EventType.PushReceived, (event) => { console.log('Push received:', event.pushPayload); // Handle push received event }); ``` This event fires when a push notification arrives, regardless of whether the app is in the foreground or background. ### Notification Response Listen for when a user interacts with a notification: ```typescript Airship.addListener(EventType.NotificationResponse, (response) => { console.log('Notification tapped:', response); console.log('Action ID:', response.actionId); // Handle the notification response if (response.actionId === 'custom_action') { // Handle custom action } }); ``` This event fires when a user taps on a notification or a notification action button. ### Registration Token Updates Listen for when the push registration token is generated or updated: ```typescript Airship.addListener(EventType.PushTokenReceived, (event) => { console.log('Push token:', event.pushToken); // Send token to your backend if needed }); ``` You can also retrieve the current token at any time: ```typescript const token = await Airship.push.getRegistrationToken(); ``` ### Notification Status Changes Monitor changes to notification permission status: ```typescript Airship.addListener(EventType.PushNotificationStatusChangedStatus, (event) => { console.log('Notification status changed:', event.status); console.log('Is opted in:', event.status.isOptedIn); }); ``` ## Managing Active Notifications You can retrieve and clear notifications that are currently displayed in the notification center. ### Get Active Notifications Retrieve the list of currently displayed notifications: ```typescript const notifications = await Airship.push.getActiveNotifications(); console.log('Active notifications:', notifications); ``` > **Note:** On Android, this list only includes notifications sent through Airship. ### Clear Notifications Clear all notifications for the app: ```typescript Airship.push.clearNotifications(); ``` Clear a specific notification by identifier: ```typescript Airship.push.clearNotification(identifier); ``` > **Note:** On Android, you can use this method to clear notifications outside of Airship. The identifier is in the format `