Я использую 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 .: Вот документация, которую я использовал для его реализации: