skip to Main Content

I tried to program a local notification by expo, following the code provide on:
here – docs.expo.dev

The problem: the notification simple don’t appear in my phone – IOS. When I click into the button, nothing happens.

My App.js file:

import { StyleSheet, Button, View } from 'react-native';
import * as Notifications from 'expo-notifications';

Notifications.setNotificationHandler({
  handleNotification: async () => {
    return {
      shouldPlaySound: false,
      shouldSetBadge: false,
      shouldShowAlert: true,
    };
  }
});

export default function App() {
  function scheduleNotificationHandler() {
    Notifications.scheduleNotificationAsync({
      content: {
        title: 'My first local notification',
        body: 'This is the body of the notification.',
      },
      trigger: {
        seconds: 5
      }
    });
  }

  return (
    <View style={styles.container}>
      <Button
        title="Schedule Notification"
        onPress={scheduleNotificationHandler}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

Could anybody help me? Thanks for your attention.

I think the problem can be in the permissions of my device.

2

Answers


  1. Chosen as BEST ANSWER

    So, after some time of research, i find an answer for my problem...

    import { StatusBar } from "expo-status-bar";
    import { StyleSheet, Button, View } from "react-native";
    import * as Notifications from "expo-notifications";
     
    Notifications.setNotificationHandler({
      handleNotification: async () => {
        return {
          shouldPlaySound: false,
          shouldSetBadge: false,
          shouldShowAlert: true,
        };
      },
    });
    
    
    //// START: NEWLY ADDED FUNCTIONS ////
    const allowsNotificationsAsync = async () => {
      const settings = await Notifications.getPermissionsAsync();
      return (
        settings.granted ||
        settings.ios?.status === Notifications.IosAuthorizationStatus.PROVISIONAL
      );
    };
     
    const requestPermissionsAsync = async () => {
      return await Notifications.requestPermissionsAsync({
        ios: {
          allowAlert: true,
          allowBadge: true,
          allowSound: true,
          allowAnnouncements: true,
        },
      });
    };
    //// END: NEWLY ADDED FUNCTIONS ////
    
    export default function App() {
      const scheduleNotificationHandler = async () => {
     
        //// START: CALL FUNCTIONS HERE ////
        const hasPushNotificationPermissionGranted =
          await allowsNotificationsAsync();
     
     
        if (!hasPushNotificationPermissionGranted) {
          await requestPermissionsAsync();
        }
        //// END: CALL FUNCTIONS HERE ////
     
        Notifications.scheduleNotificationAsync({
          content: {
            title: "My first local notification",
            body: "This is th body of the notification.",
            data: { userName: "Max" },
          },
          trigger: {
            seconds: 2,
          },
        });
      };
     
      return (
        <View style={styles.container}>
          <Button
            title='Schedule Notification'
            onPress={scheduleNotificationHandler}
          />
     
          <StatusBar style='auto' />
        </View>
      );
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        backgroundColor: "#fff",
        alignItems: "center",
        justifyContent: "center",
      },
    });
    

  2. I think the problem is with the permissions.
    If you go to this link expo_page_notifications, there is a guide to do that.
    This is the code:

    registerForPushNotificationsAsync = async () => {
     if (Device.isDevice) {
       const { status: existingStatus } = await Notifications.getPermissionsAsync();
       let finalStatus = existingStatus;
       if (existingStatus !== 'granted') {
         const { status } = await Notifications.requestPermissionsAsync();
         finalStatus = status;
       }
       if (finalStatus !== 'granted') {
         alert('Failed to get push token for push notification!');
         return;
       }
       const token = (await Notifications.getExpoPushTokenAsync()).data;
       console.log(token);
       this.setState({ expoPushToken: token });
     } else {
       alert('Must use physical device for Push Notifications');
     }
    
     if (Platform.OS === 'android') {
       Notifications.setNotificationChannelAsync('default', {
         name: 'default',
         importance: Notifications.AndroidImportance.MAX,
         vibrationPattern: [0, 250, 250, 250],
         lightColor: '#FF231F7C',
       });
     }
    };
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search