Skip to content

Commit be317f1

Browse files
authored
Merge pull request #2074 from katzer/pr-ignore-old-trigger-at
Handle passed trigger.at dates
2 parents 30be692 + 9b30025 commit be317f1

File tree

1 file changed

+34
-2
lines changed

1 file changed

+34
-2
lines changed

www/local-notification.js

+34-2
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,32 @@ exports.canScheduleExactAlarms = function (callback, scope) {
321321
* @param {Object} args Optional, can be {skipPermission: true} to skip the permission check
322322
*/
323323
exports.schedule = function (options, callback, scope, args) {
324-
const optionsList = exports._toArray(options);
324+
let optionsList = exports._toArray(options);
325325

326326
for (const options of optionsList) {
327327
// Correct renamed properties and set defaults
328328
exports._correctOptions(options, true);
329329
}
330330

331+
// Filter out notifications where the trigger time is in the past
332+
// On iOS notifications are ignored if the trigger time is in the past, so filter
333+
// them already here out
334+
optionsList = optionsList.filter((option) => {
335+
// No trigger.at set, don't filter out
336+
if (!option.trigger || !option.trigger.at) return true;
337+
338+
// Calculate difference to now
339+
const triggerAtDiff = option.trigger.at - new Date().getTime();
340+
341+
// Trigger time is in the future don't filter out
342+
if (triggerAtDiff > 0) return true;
343+
344+
// Trigger time is in the past, filter out
345+
console.warn("Notification trigger time is in the past, ignoring it, options=", JSON.stringify(option));
346+
347+
return false;
348+
});
349+
331350
// Skip permission check if requested and schedule directly
332351
if (args && args.skipPermission) {
333352
console.log("Skip permission check");
@@ -919,14 +938,27 @@ exports._prepareTrigger = function (options) {
919938

920939
if (trigger.type == "calendar") {
921940
// Set default trigger time at now if nothing is set
922-
if (!trigger.at && !trigger.in && !trigger.every) trigger.at = new Date();
941+
if (!trigger.at && !trigger.in && !trigger.every) trigger.at = new Date().getTime();
923942

924943
// Convert dates to numbers
925944
if (trigger.at) trigger.at = exports._dateToNumber(trigger.at);
926945
if (trigger.firstAt) trigger.firstAt = exports._dateToNumber(trigger.firstAt);
927946
if (trigger.before) trigger.before = exports._dateToNumber(trigger.before);
928947
if (trigger.after) trigger.after = exports._dateToNumber(trigger.after);
929948

949+
// On iOS notifications will be ignored if the trigger time is in the past
950+
// Correct trigger.at if trigger time is maximum 5 seconds in the past
951+
if (trigger.at) {
952+
// Calculate the difference to now
953+
const triggerAtDiff = trigger.at - new Date().getTime();
954+
955+
// Only correct if maximum 5 seconds in the past
956+
if (triggerAtDiff > -5000 && triggerAtDiff <= 0) {
957+
// Set it a little bit in the future so it will be definitely triggered
958+
trigger.at = new Date().getTime() + 5000;
959+
}
960+
}
961+
930962
// Warning that trigger.count is not supported on iOS
931963
if (device.platform == 'iOS' && trigger.count) {
932964
console.warn('trigger.count is not supported on iOS.');

0 commit comments

Comments
 (0)