Expo - локальные уведомления не работают на устройствах - PullRequest
9 голосов
/ 14 мая 2019

Я использую EXPO для создания приложения для Android и iOS с React Native.В этом коде странное поведение: он правильно работает в приложении Expo, но не работает на реальных устройствах (автономная сборка) (происходит на iOS и Android).

Логика этих локальных уведомленийследующее: Идея состоит в том, чтобы показать пользователю 3 локальных уведомления:

  • Первое, через 1 неделю после последнего раза, когда пользователь открыл приложение
  • Второе, 1через месяц после того, как последний раз пользователь открыл приложение
  • Последний, через 2 месяца после того, как последний раз пользователь открыл приложение

Как мне это сделать?

При первом запуске приложения я спрашиваю пользователя, хочет ли она видеть уведомления.Если пользователь говорит ДА, я записываю эту информацию в локальное хранилище, а затем запрашиваю USER_FACING_NOTIFICATIONS разрешение на показ локальных уведомлений.

Я использую USER_FACING_NOTIFICATIONS, потому что не отправляю удаленные уведомления.

Затем, во второй раз, когда пользователь открывает приложение, я делаю следующее:

  • Я удаляю все предыдущие уведомления
  • Я проверяю, ХОТИТ ли пользовательдля просмотра уведомлений
  • Я проверяю, ДАЕТ ли пользователь / устройство ДАЛИ НАМ разрешения на отображение уведомлений
  • Я планирую 3 уведомления.

Здесь часть кода:

componentDidMount() {
    cancelAllScheduled()
      .then(() => {
        getUserNotificationsPermission().then(userWants => {
          if (userWants) {
            getDeviceNotificationsPermission().then(grantedByDevice => {
              if (grantedByDevice) {
                scheduleNotifications();
              }
            });
          }
        });
      })
      .catch(() => {
        // :shrug:
      });
}

Здесь все эти utils функции:

// Cancel all the notifications
const cancelAllScheduled = () => {
  return ExpoNotifications.cancelAllScheduledNotificationsAsync();
}

// Check in local storage if the user WANTS to see notifications
const getUserNotificationsPermission = () => {
  return AsyncStorage.getItem('userNotificationPermission').then(data => {
    let isEnabled;

    try {
      isEnabled = JSON.parse(data);
    } catch (error) {
      isEnabled = false;
    }

    return isEnabled;
  });
};

// Check if user/device ALLOW US to show notifications
const getDeviceNotificationsPermission = () => {
  return Permissions.getAsync(Permissions.USER_FACING_NOTIFICATIONS).then(({ status }) => {
    return status === 'granted';
  });
};

// Add days
// https://stackoverflow.com/a/19691491/1815449
const _addDays = (date, days) => {
  var result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
};

// Schedule all the notifications
// One notification is going to be shown on 1 week
// Other notification in 1 month
// Other notification in 2 month
const scheduleNotifications = () => {
  const now = new Date();

  const oneWeek = {
    title: 'We miss you!',
    body: "Come to see what we've been up to and share your latest adventures with us!",
    data: {
      type: 'WEEKLY',
    },
  };
  const oneWeekOptions = { time: _addDays(now, 7) };
  ExpoNotifications.scheduleLocalNotificationAsync(oneWeek, oneWeekOptions);

  const oneMonth = {
    title: 'We miss you!',
    body: "Come to see what we've been up to and share your latest adventures with us!",
    data: {
      type: 'MONTHLY',
    },
  };
  const oneMonthOptions = { time: _addDays(now, 30) };
  ExpoNotifications.scheduleLocalNotificationAsync(oneMonth, oneMonthOptions);

  const twoMonth = {
    title: 'We miss you!',
    body: "Come to see what we've been up to and share your latest adventures with us!",
    data: {
      type: 'MONTHLY 2',
    },
  };
  const twoMonthOptions = { time: _addDays(now, 60) };
  ExpoNotifications.scheduleLocalNotificationAsync(twoMonth, twoMonthOptions);
};

Видите ли вы какие-либо подсказки о том, почему это не может работать?Я уже открыл приложение и предоставил все разрешения и убил и снова открыл приложение близко к 1000 раз хехехе.Последние месяцы я не открывал приложение в течение 9 дней (я делал это 3 раза), и я никогда не видел никакого уведомления.Но уведомления правильно отображаются в приложении Expo Dev.

Ps .: Я делаю cancelAllScheduled каждый раз, когда пользователь открывает приложение, потому что эти уведомления должны сбрасываться каждый раз, когда пользователь открывает приложение,из-за того, что я хочу показать через несколько недель после того, как «последний раз приложение было открыто»

Ps2 .: Вот документация, которую я использовал для его реализации:

1 Ответ

2 голосов
/ 28 мая 2019

Похоже, это была проблема: https://github.com/expo/expo/issues/4121 Уведомления работают, но из-за того, что я планировал их на 1 неделю, 1 месяц и более, уведомления теперь отображались, поскольку большинство этих устройств были перезапущены после планирования уведомлений.

Я ждал 1 неделю без повторного открытия приложения в iOS, без перезапуска устройства или даже обновления SO, и я вижу уведомление. Я еще не тестировал его в Android. Возможно, мне придется оставить телефон Android подключенным в течение 1 недели и посмотреть, что произойдет.

...