Определите, когда отправлять push-уведомления на выставку с HTTP / 2 API - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь создать приложение для напоминания о воде.У меня есть 3 экрана, и я использую реагирующую навигацию

  • Домашняя страница (что я позволяю пользователям увеличивать количество выпитого в этот день)
  • Уведомления (где пользователи определяют с помощью кнопок переключения, если онихотите получать уведомления и когда получать)
  • Настройки (где пользователь вводит возраст, вес, чтобы определить, сколько он должен выпивать в день).это первый экран, который пользователи видят при загрузке приложения

Я пытаюсь отправить push-уведомления своим пользователям с помощью expo push-уведомлений и их HTTP / 2 API.Но я в некотором роде заблудился и у меня есть эти вопросы ниже.

  1. Где написать приведенный ниже код push-уведомлений и вызвать HTTP / 2 API?(App.js, уведомления или настройки?)
  2. Как определить, когда отправлять эти уведомления, например, за каждый час, основываясь на выборе пользователей.

Мой код для получения разрешения, ключ хранилища и вызов API для отправки уведомлений.

    registerforPushNotifications = async () => {
    // check fox existing permission
    const { status } = await Permissions.getAsync(Permissions.NOTIFICATIONS);
    let finalStatus = status;

    // if no existing permission granted ask user
    if (status !== 'granted') {
      const { status } = await Permissions.askAsync(Permissions.NOTIFICATIONS);
      finalStatus = status;
    }

    //if no permission is granted exit the status
    if (finalStatus !== 'granted') {
      return;
    }

    // get the token
    let token = await Notifications.getExpoPushTokenAsync();

    const request = {
      to: token,
      title: "Don't forget to drink water",
    };

    _storeToken = async () => {
      try {
        await AsyncStorage.setItem('token', token.toString());
      } catch (error) {
        console.log(error.message);
      }
    };

    _storeToken();

    return fetch('https://exp.host/--/api/v2/push/send', {
      method: 'POST',
      headers: {
        'host':'exp.host',
        'accept': 'application/json',
        'content-Type': 'application/json',
        'accept-encoding': 'gzip, deflate'
      },
      body: JSON.stringify(request),
    }).then(data => {console.log(data)});
  };

ответ, который я получаю

"_bodyInit": "{\"data\":{\"status\":\"ok\",\"id\":\"93d0f654-d8f6-4587-b4bb-ed4f5cd08b68\"}}",

1 Ответ

0 голосов
/ 05 марта 2019

Вместо использования firebase я решил использовать

Notifications.scheduleLocalNotificationAsync (localNotification, schedulingOptions)

Это помогает мне планировать локальное уведомление для запуска наопределенное время в будущем или с заданным интервалом.

Аргументы

localNotification (объект) - Объект со свойствами, описанными вLocalNotification.

schedulingOptions (объект) - Объект, который описывает, когда должно сработать уведомление.

  • время (дата или число) - Объект Date, представляющий, когда следует запускать уведомление или число во время эпохи Unix.Пример: (new Date ()). GetTime () + 1000 через одну секунду.

  • повтор (необязательно) (строка) - 'минута', 'час', 'день', 'неделя',
    'месяц' или 'год'.

  • (только для Android) интервал M (необязательно) (число)) - интервал повторения в
    количество миллисекунд

    componentDidMount () {this.willFocusSubscription = this.props.navigation.addListener ('willFocus', payload => {

      // call the functions after component did mounted
      this._handleLocalNotification();
      this.listenForNotifications();
    });}
    
    // function to request permission to send notifications and schedule notifications
    _handleLocalNotification = async () => {
    // check fox existing permission
    const { status } = await Permissions.getAsync(Permissions.NOTIFICATIONS);
    let finalStatus = status;
    
    // if no existing permission granted ask user
    if (status !== 'granted') {
      const { status } = await Permissions.askAsync(Permissions.NOTIFICATIONS);
      finalStatus = status;
    }
    
    //if no permission is granted exit the status
    if (finalStatus !== 'granted') {
      return;
    }
    
    const localnotification = {
      title: 'Water Reminder',
      body: 'Dont forget to drink water!',
      android: {
        sound: true,
      },
      ios: {
        sound: true,
      },
    };
    let sendAfterFiveSeconds = Date.now();
    sendAfterFiveSeconds += 5000;
    
    const schedulingOptions = { time: sendAfterFiveSeconds };
    Notifications.scheduleLocalNotificationAsync(localnotification, schedulingOptions);
      };
    

    // функция для прослушивания, если уведомление получено, когда приложение открыто. Когда оно получит, оно создаст и предупредит

      listenForNotifications = () => {
        Notifications.addListener(notification => {
          if (notification.origin === 'received') {
            Alert.alert(localnotification.title, localnotification.body);
          }
        });
      };
...