Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IOS Expo Push Notifications when app is in foreground

reading from the expo docs:

For iOS, you would be wise to handle push notifications that are received while the app is foregrounded, because otherwise the user will never see them. Notifications that arrive while the app are foregrounded on iOS do not show up in the system notification list. A common solution is to just show the notification manually. For example, if you get a message on Messenger for iOS, have the app foregrounded, but do not have that conversation open, you will see the notification slide down from the top of the screen with a custom notification UI.

What I don't understand is what is the best approach for that? is there an Expo API for showing such messages? or should I create an alert component of my own? It is not really clear from the docs.

Thanks.

like image 880
superuser123 Avatar asked Jan 25 '18 07:01

superuser123


People also ask

Does Expo support push notifications?

Expo Push Notifications allow you to send notifications from Expo straight to your users' inboxes on both iOS and Android devices. This means that no matter how many times they close or minimize your expo, they will still receive your message in their notification feed.

Do push notifications work when app is closed iOS?

Apple does not offer a way to handle a notification that arrives when your app is closed (i.e. when the user has fully quit the application or the OS had decided to kill it while it is in the background). If this happens, the only way to handle the notification is to wait until it is opened by the user.

How do I customize my Expo notifications?

You can configure expo-notifications using its built-in config plugin if you use config plugins in your project (EAS Build or expo run:[android|ios] ). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.

How do you get Expo push tokens on the app?

In order to use push notifications for your app, your should register the app for firebase. If you have not already created a Firebase project for your app, do so now by clicking on Add project in the Firebase Console. In your new project console, click Add Firebase to your Android app and follow the setup steps.


4 Answers

This answer is outdated as of February 20, 2020. Please see https://stackoverflow.com/a/60344280/2441420 for how to show iOS Notification when your application is in the Foreground

There isn't an Expo API for showing those messages. You can use any 'toast' library of your choosing and display the notification message, but that should be all your code.

For example, this is how we are doing right now:

export default class HomeScreen extends React.Component {

  componentDidMount() {
    this.notificationSubscription = Notifications.addListener(
      (notification) => this.handlePushNotification(notification),
    );
  }

  handlePushNotification(notification) {
    const { navigation } = this.props;
    PushNotificationsService.handleNotification(notification, navigation);
  }

(...)

import Toast from 'react-native-root-toast';

export default class PushNotificationsService {

  static handleNotification(notification, navigation) {

    if (notification.data.screen && notification.origin === 'selected') {
      navigation.navigate(notification.data.screen);
    }
    Toast.show(notification.data.message);
  }

}

Toast libraries include:

  • react-native-root-toast

  • react-native-easy-toast

  • react-native-simple-toast

like image 151
sandre89 Avatar answered Nov 18 '22 05:11

sandre89


Now you can just add that in one of your app entry point. The shouldShowAlert is what you want here

import * as Notifications from 'expo-notifications';

Notifications.setNotificationHandler({
  handleNotification: async () => ({
    shouldShowAlert: true,
    shouldPlaySound: false,
    shouldSetBadge: false,
  }),
});
like image 32
EQuimper Avatar answered Nov 18 '22 06:11

EQuimper


App.json :

{
  "expo": {
    "notification": {
      "iosDisplayInForeground": true
    }
}
like image 38
saint Avatar answered Nov 18 '22 07:11

saint


DEMO

I'm not sure exactly when this was added to Expo, but as of Expo version 36 is easily doable.

To show Expo Push Notifications on iOS when your app is in the foreground, please do the following:


import { Vibration } from "react-native";  
import { Notifications } from "expo";  
import * as Permissions from "expo-permissions";  
import Constants from "expo-constants";

registerForPushNotificationsAsync = async () => {                          
  if (Constants.isDevice) {                                                
    const { status: existingStatus } = await Permissions.getAsync(         
      Permissions.NOTIFICATIONS                                            
    );                                                                     
    let finalStatus = existingStatus;                                      
    if (existingStatus !== "granted") {                                    
      const { status } = await Permissions.askAsync(                       
        Permissions.NOTIFICATIONS                                          
      );                                                                   
      finalStatus = status;                                                
    }                                                                      
    if (finalStatus !== "granted") {                                       
      alert("Failed to get push token for push notification!");            
      return;                                                              
    }                                                                      
    let token = await Notifications.getExpoPushTokenAsync();
    console.log("Go to https://expo.io/notifications and copy the token below to easily send yourself a notification.");
    console.warn("Notifications on iOS (and I believe Android) ONLY WORK ON A PHYSICAL DEVICE, not a simulator or emulator!!!")               
    console.log(token);                                                    
    this.setState({ expoPushToken: token });                               
  } else {                                                                 
    alert("Must use physical device for Push Notifications");              
  }                                                                        
};                                                                         

componentDidMount() {                                                      
  this.registerForPushNotificationsAsync();                                                
  this._notificationSubscription = Notifications.addListener(              
    this._handleNotification                                               
  );                                                                       
}

_handleNotification = async notification => {                                                                                    
  if (notification.remote) {
    Vibration.vibrate();                                                  
    const notificationId = Notifications.presentLocalNotificationAsync({      
      title: "Follow @technoplato",  
      body: "To learn yourself goodly (also follow PewDiePie)",                                             
      ios: { _displayInForeground: true } // <-- HERE'S WHERE THE MAGIC HAPPENS                                
    });                                                                       
  }                                                   
};                                                                                                                                                      

Quick and Easy Sanity Check

1) Go here: https://expo.io/notifications

2) Copy the token that is output to the terminal when your application is run.

3) Open your application on iOS.

4) Send a notification to yourself from https://expo.io/notifications and observe that it shows up even when your app is foregrounded.


Notes

  • Notifications WILL NOT BE RECEIVED ON AN IOS SIMULATOR

  • Expo makes Notifications ridiculously easy. I honestly can't believe it.

No idea why displayInForeground is false by default and not more prominent in the documentation. I'll submit a PR for it if I can.

Code originally found at this Snack: https://snack.expo.io/@documentation/pushnotifications?platform=ios

LocalNotification.ios._displayInForeground found here: https://docs.expo.io/versions/v36.0.0/sdk/notifications/#localnotification

like image 33
stack_overflow_user Avatar answered Nov 18 '22 06:11

stack_overflow_user