我正在使用EXPO和React Native为Android和iOS创建一个应用程序。 此代码中有一个奇怪的行为:它在Expo App上可以正常工作,但在真实设备(独立版本)(在iOS和Android上发生)中却不能工作。
这些本地通知的逻辑如下: 想法是向用户显示3条本地通知:
我该怎么做?
首次打开应用程序时,我问用户是否要查看通知。如果用户说“是”,那么我将该信息写入本地存储中,然后我请求USER_FACING_NOTIFICATIONS
权限以显示本地通知。
我使用USER_FACING_NOTIFICATIONS
是因为我没有发送远程通知。
然后,用户第二次打开应用程序时,我将执行以下操作:
在这里,部分代码:
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);
};
您是否看到有关为何无法正常工作的任何线索? 我已经打开了该应用程序并授予了所有权限,然后杀死并再次打开该应用程序,接近1.000次。最近几个月,我没有打开该应用程序9天(我做了3次),但从未收到任何通知。但是,通知会正确显示在Expo Dev App中。
Ps .:每次用户打开应用程序时,我都会执行cancelAllScheduled
,因为每次用户打开应用程序时都需要重置这些通知,因为我想显示“最后一次应用程序”之后的几周已打开”
Ps2 .:这是我执行该文档所遵循的文档:
答案 0 :(得分:2)
似乎是问题所在:https://github.com/expo/expo/issues/4121 通知有效,但由于我将它们安排了1周,1个月或更长时间,所以现在显示了通知,因为大多数设备在安排了通知后都重新启动了。
我已经等了1周,没有在iOS中再次打开该应用,也没有重新启动设备甚至升级SO,所以我可以看到通知。 我尚未在Android中进行测试。我可能需要在1周内保持Android手机处于连接状态,然后看看会发生什么。